Prometheus是一个开源的,基于metrics(度量)的一个开源监控系统,它有一个简单而强大的数据模型和查询语言,让我们分析应用程序。Prometheus诞生于2012年主要是使用go语言编写的,并在Apache2.0许可下获得许可,目前有大量的组织正在使用Prometheus在生产。2016年,Prometheus成为云计算组织(CNCF)第二个成员。

Prometheus部署

创建 prometheus用户

下载对应平台的安装包解压的目录

hostname$ tar xf prometheus-2.10..linux-amd64.tar.gz
hostname$ mv prometheus-2.10..linux-amd64 /opt/

启动脚本

hostname$ sudo vim  /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus instance
Wants=network-online.target
After=network-online.target
After=postgresql.service mariadb.service mysql.service [Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
WorkingDirectory=/opt/prometheus/
RuntimeDirectory=prometheus
RuntimeDirectoryMode=
ExecStart=/opt/prometheus/prometheus \
--storage.tsdb.retention=15d \
--config.file=/opt/prometheus/prometheus.yml \
--web.max-connections= \
--web.read-timeout=5m \
--storage.tsdb.path="/opt/data/prometheus" \
--query.timeout=2m \
--query.max-concurrency=
LimitNOFILE=
TimeoutStopSec= [Install]
WantedBy=multi-user.target

启动脚本

启动参数说明

  • --web.read-timeout=5m               请求连接的最大等待时间, 防止太多的空闲链接,占用资源
  • --web.max-connections=512       最大链接数
  • --storage.tsdb.retention=15d      prometheus开始采集监控数据后会存在内存中和硬盘中, 太长的话,硬盘和内存都吃不消,太短的话,历史数据就没有了,设置15天为宜
  • --storage.tsdb.path="/opt/data/prometheus    存储数据路径,这个很重要,不要随便放在一个地方,会把/根目录塞满
  • --query.timeout=2m  --query.max-concurrency=200    防止太多的用户同时查询,也防止单个用户执行过大的查询而一直不退出

配置文件

# my global config
global:
scrape_interval: 15s #设置采集数据的频率,默认是1分钟.
evaluation_interval: 15s #每15秒评估一次规则。默认值是每1分钟一次
# scrape_timeout is set to the global default (10s). # Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager: # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml" scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus' static_configs:
- targets: ['192.168.48.130:9090'] # 设置本机的ip

/opt/prometheus/prometheus.yml

浏览器访问9090端口,Prometheus已经正常运行了

Node_exporter部署

Prometheus社区为我们提供了 node_exporter程序来采集被监控端的系统信息,下载在c1.heboan.com 节点上进行部署

创建 prometheus用户

下载对应平台的安装包解压的目录

hostname$ tar xf node_exporter-0.18..linux-amd64.tar.gz
hostname$ mv node_exporter-0.18..linux-amd64 /opt/node_exporter
hostname$ sudo vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target [Service]
Type=simple
User=prometheus
ExecStart=/opt/node_exporter/node_exporter
Restart=on-failure [Install]
WantedBy=multi-user.target

启动脚本

node_exporter默认监听9100端口提供http服务

$ curl http://c1.heboan.com:9100/metrics
....
# HELP node_memory_MemFree_bytes Memory information field MemFree_bytes. #这行表示说明监控项的意思
# TYPE node_memory_MemFree_bytes gauge #这行说明监控的是数据类型是gauuge
node_memory_MemFree_bytes 1.619521536e+09 #这行是监控项 k/v node_export搜集了很多监控项,每个监控项都有这三行

node-exporter配置好了以后,我们就需要把它接入到 prometheus 中去,修改prometheus.yml,然后重启prometheus

scrape_configs:
...
- job_name: 'aliyun'
static_configs:
- targets: ['c1.heboan.com:9100'] #这里可以写多个node_export地址

然后访问prometheus web界面,可以看到c1.heboan.com的已经被监控上了

按以上步骤把 c2.heboan.com也监控上

查看监控数据

上面我们已经把c1.heboan.com机器部署了node_export来采集系统信息,并且接入到了prometheus , 现在我们可以在prometheus web 界面通过查询语言来获取我们想要的监控项数据

举个栗子: 获取被监控端5分钟内cpu使用率

计算公式: (1-5分钟空闲增量  / 5分钟总增量) * 100

首先查出cpu工作运行的所有时间,   cpu是分了system、iowait、irq、user、idle...这些加起来的时间就是运行的总时间, 而且我们看到这些是按每核来计算的

根据label过滤出idle(空闲时间)

计算出5分钟内的增量

因为这是分开多核计算,所以我们需要把它用sum加起来

虽然加起来了,但是这是把所有机器的所有核加起来了,而我们需要时把属于一台机器的所有核心加起来,因此我们需要用到by()

上面已经算出了5 分钟内idle(CPU空闲)的增量,那cpu总的时间增量就是

#不加过滤条件
sum(increase(node_cpu_seconds_total[5m])) by (instance)

再根据公式计算即可

可以点击Graph查看图标走势

这里的图表都是零时的,我们要向保存想下,随时想看,就可以用Grafana

Grafana部署使用

安装Grafana

# 官网下载安装包, 例如: grafana-6.2.-.x86_64.rpm
# 然后本地安装
yum localinstall grafana-6.2.-.x86_64.rpm # 启动
systemctl start grafana-server

Grafana监听端口是3000,我们访问web 界面, 默认的账号密码是admin/admin, 登录后会要求修改密码,自行修改即可, 登录进入之后点击 "Add data source" 添加数据源, 选择"prometheus"

添加一个dashboard , 回到Home Dashboard 点击"New dashboard"---"Add Query"

点击齿轮图标,进入面板设置,来添加变量

General

设置几个变量

$interval

$env

$node

保存面板后查看,效果如下

现在我们来画图,cpu的使用率, 点击 add_panel图标--选择 "Choose Visualization"

数据源选择prometheus,之前我们配置的数据源, query语句如下

 (- sum(increase(node_cpu_seconds_total{mode="idle", instance=~"$node"}[5m]))/ sum(increase(node_cpu_seconds_total{instance=~"$node"}[5m]))) * 

#$node是我们之前配置的变量,来匹配每个节点

Visualization

General

最后查看效果如下

Alertmanager告警

有了监控项后,还不够,当监控项出现问题后还需要发出告警通知, 这个功能需要Alertmanager角色来处理

prometheus是由我们决定什么情况下该报警,然后prometheus发出警报,被发送给Alermanager, Alertmanager接受到警报后将警报进行分组节流进行通知

首先我们先在prometheus  server 上配置警报规则

...
rule_files:
- "first_rules.yml" ...

/opt/prometheus/prometheus.yml

/opt/prometheus/prometheus.yml

groups:
- name: hostStatsAlert
rules:
- alert: hostCpuUsageAlert
expr: - sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) / sum(increase(node_cpu_seconds_total[5m])) by (instance) > 0.8
for: 1m #当5分钟内cpu使用率大于80%并且持续1分钟出发警报

进行cpu压测,因为是双核的,所以打开2个c1.heboan.com的终端,执行以下命令压测

time echo "scale=50000; 4*a(1)" | bc -l -q

查看下图标

看下prometheus web界面已经出发警报了

要想进行告警通知,比如邮件,我们就要用到Alertmanager了。我在prometheus那台服务器上安装Alertmanager, 实际上它可以安装在任何其他地方,主要网络OK就行

hostname$ tar xf alertmanager-0.17..linux-amd64.tar.gz
hostname$ mv alertmanager-0.17. /opt/ alertmanager

/opt/alertmanager/alertmanager.yml

global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:25'
smtp_from: 'sellsa@qq.com'
smtp_auth_username: 'sellsa@qq.com'
smtp_auth_password: '邮箱授权码' route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email' receivers:
- name: 'email'
email_configs:
- to: 'heboan@qq.com'

启动Alertmanage, 它监听9093端口

cd /opt/alertmanager
./alertmanager --config.file="alertmanager.yml"

prometheus.yml配置警报推送到那个Alertmanager

...
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] ...

最后在进行cpu压测,我们就可以收到告警邮件了

这个告警信息貌似并不相信,没有具体的描述信息, 我们可以修改下first_rules.yml添加些信息

groups:
- name: hostStatsAlert
rules:
- alert: hostCpuUsageAlert
expr: - sum(increase(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) / sum(increase(node_cpu_seconds_total[5m])) by (instance) > 0.8
for: 1m
annotations:
description: '{{ $labels.instance }} of job {{ $labels.job }} cpu 5分钟内使用率超过80%,并且持续1分钟'
summary: 'Instance {{ $labels.instance }}'

Prometheus快速入门的更多相关文章

  1. Prometheus 入门教程(一):Prometheus 快速入门

    文章首发于[陈树义]公众号,点击跳转到原文:https://mp.weixin.qq.com/s/ZXlBPHGcWeYh2hjBzacc3A Prometheus 是任何一个高级工程师必须要掌握的技 ...

  2. Docker三十分钟快速入门(下)

    一.背景 上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及dock ...

  3. 私有仓库GitLab快速入门篇

    私有仓库GitLab快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 安装文档请参考官网:https://about.gitlab.com/installation/#ce ...

  4. Kubernetes快速入门

    二.Kubernetes快速入门 (1)Kubernetes集群的部署方法及部署要点 (2)部署Kubernetes分布式集群 (3)kubectl使用基础 1.简介 kubectl就是API ser ...

  5. gorm概述与快速入门

    特性 全功能 ORM 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承) Create,Save,Update,Delete,Find 中钩子方 ...

  6. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  7. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  8. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  9. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

随机推荐

  1. floor函数用法

    floor(x),也写做Floor(x),其功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数(与“四舍五入”不同,下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个 ...

  2. codevs 1079 回家x

    1079 回家  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver   题目描述 Description 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰 ...

  3. 记ubuntu sudo无法使用,su密码不对的解决办法

    前言 因为我有强制关机的习惯, 然后就杯具了.. ubuntu版本是 16.04 sudo没法使用, su密码不对, 顿时我就慌了 解决方案 1.1.开机点击ESC,进去GUN GRUB界面 1.2. ...

  4. tensorflow的变量作用域

    一.由来 深度学习中需要使用大量的变量集,以往写代码我们只需要做全局限量就可以了,但在tensorflow中,这样做既不方便管理变量集,有不便于封装,因此tensorflow提供了一种变量管理方法:变 ...

  5. 限制 button 在 3 秒内不可重复点击

    在下载或者上传文件过程中避免重复点击带来的多次同样的请求造成资源浪费,限制 button 的点击次数是很有必要的. 1. 增强用户体验,2. 减轻服务器压力. HTML 代码 <button i ...

  6. python中类的设计问题(一些高级问题探讨,函数重载,伪私有,工厂模式,类方法等)

    从这里再次体现了python语言强大的灵活性.某些在高级语言中看似不严谨需要尽量避免的地方在python中都是允许的. 比如: (1),异常可以用来处理错误 (2),方法,类也都可以视为对象. (3) ...

  7. 实现Callable接口,并与Future结合使用

    实现步骤: 创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值. 创建 Callable 实现类的实例,使用 FutureTask ...

  8. 使用mysql以及连接数据库

    MySQL Table of Contents 1. 安装与配置 2. 数据库与账户 3. 用户跟权限 4. 常用命令 5. 表的创建 6. 数据类型 7. 主键约束 8. 表的修改 9. 引擎(En ...

  9. JSON.stringify方法报错:Converting circular structure to JSON

    别以为JSON.parse(JSON.stringify(data))做深拷贝无敌,对于以下这种情况,当你需要保留父级对象,即 对象存在循环引用,就会报错. var a = [ { "id& ...

  10. java7和java8新特性

    以下来至网址: http://blog.csdn.net/samjustin1/article/details/52268004 Java7 新特性 1.switch中可以使用字符串了 String ...