promehteus+grafana
一、Promethes和zabbix对比
对比项 | Prometheus | zabbix | Prometheus优势 | zabbix优势 |
---|---|---|---|---|
管理 | 二进制文件启动 | LNMP+编译 | 轻量级server,便于迁移和维护 | |
配置 | 配置文件 | 图形化 | 更好的支持自动化配置 | 成本低 |
client | 丰富的client库 | zabbix_agent自定义脚本 | 为各种中间件、应用提供专业的exporter,监控项更全面 | 支持自定义监控项,对监控涉及者的格局要求较高 |
数据存储方式 | Prometheus TSDB | MySQL | 监控数据以时间维度统计情况较多,时序数据库更实用与监控数据的次敦促,按时间索引性能更高 | Mysql比较常用 |
数据处理 | PromQl | MySQL | PromQL计算函数丰富,统计维度广 | 同上 |
二次开发 | 丰富的SDK | api | 提供了Go、Java/Scala、Python、Ruby等sdk二次开发更便捷 | api适配较为常用 |
对云环境的支持 | 原生支持容器监控 | 更适合物理机监控 | 自动发现容器,更好的适配k8s | |
告警方式 | 可按照标签分组,收敛 | 在次数上收敛 | 告警收敛方式更多样化 | |
监控项值 | 支持数字 | 支持数字字符串 | 可做日志监控 |
二、Prometheus工作流程:
1、服务端
Prometheus服务端是以一个进程的方式启动,下载安装完成之后,只需要启动一个进程即可,程序默认监听9090端口。每次采集到的数据叫做metrics。这些采集到的数据会先存放到内存中,然后定期的写入磁盘,如果服务器重启会将硬盘数据写会内存,所以对内存有一定消耗,Pormetheus不需要重视历史数据,所以默认只会保留15天的数据。
[root@bogon prometheus]# nohup ./prometheus &
[root@bogon prometheus]# ps -ef |grep prometheus
root 2620 2618 0 15:33 ? 00:00:04 ./prometheus
root 6414 2631 0 16:01 pts/1 00:00:00 grep prometheus
2、客户端
Prometheus 客户端分为pull和push 两种方式。
- pull模式
如果pull形式的话是服务端主动向客户端拉取数据,这样需要客户端上安装exporter作为守护进程(官网提供了很多exporters可以下载使用),比如node_exporter,几乎把系统自身相关数据全部采集了,非常全面,node_exporter默认监听9100端口。
- push模式
如果是push形式的话客户端需要安装pushgateway插件,然后需要运维人员用脚本吧监控数据以key/value的形式提交给pushgateway,在由pushgateway提交给服务端。(这种模式适用于exporters无法满足监控需求时可以定义)
3、metrics主要数据类型
- Gauges
最简单、使用最多的指标,获取一个返回值,这个返回值没有变化规律,不能肯定他是按照一定增长或减少的状态,采集回来的是多少就是多少。比如硬盘容量、CPU内存使用率都适合使用Gauges类型
- Counters
计数器。数据从0开始累积,理想状态下应该是永远增长或者是不变。适合统计机器开机时间、HTTP访问量。
- Histograms
和summary一样属于高级指标,用于统计数据的分布情况。比如最小值、最大值、中间值。比如统计一天的日志,大部分用户响应时间都是正常的,只有少量用户异常,如果这使用取平均值的话,这少量用户的异常情况就会被掩盖,而Histograms可以分别统计出全部用户的响应时间,比如0-1秒的用户有多少、1-2秒的用户有多少。
联邦集群监控架构图
每个数据中心部署单独的Prometheus Server,用于采集当前数据中心的监控数据。并由一个中心的Prometheus Server 负责聚合多个数据中心的监控数据。
联邦集群是每个Prometheus Server都包含一个用于获取当前实例中监控样本的接口/federate。不管是Prometheus实例还是exporter实例都可以获取。
三、Prometheus 服务端安装
1、首先下载prometheus服务端
https://github.com/prometheus/prometheus/releases
或者官网下载
https://prometheus.io/download/
2、解压安装包可以看到以下目录结构
[root@bogon local]# cd prometheus/
[root@bogon prometheus]# ll
总用量 95028
-rw-r--r-- 1 root root 0 12月 4 12:57 1000
drwxr-xr-x. 2 3434 3434 4096 11月 6 2018 console_libraries
drwxr-xr-x. 2 3434 3434 4096 11月 6 2018 consoles
drwxr-xr-x. 3 root root 4096 12月 6 11:44 data
-rw-r--r-- 1 root root 1920 12月 2 17:34 go.go
-rw-r--r--. 1 3434 3434 11357 11月 6 2018 LICENSE
-rw------- 1 root root 62726 12月 6 16:00 nohup.out
-rw-r--r--. 1 3434 3434 2769 11月 6 2018 NOTICE
-rwxr-xr-x. 1 3434 3434 58074162 11月 6 2018 prometheus
-rw-r--r-- 1 root root 767 12月 3 15:24 prometheus.sh
-rw-r--r-- 1 3434 3434 1772 12月 6 09:31 prometheus.yml
-rwxr-xr-x. 1 3434 3434 39113694 11月 6 2018 promtool
drwxr-xr-x. 2 root root 4096 12月 6 10:43 rules
3、运行promtheus程序
[root@bogon prometheus]# nohup ./prometheus &
查看端口
[root@bogon prometheus]# netstat -tunlp |grep prometheus
tcp 0 0 :::9090 :::* LISTEN 2620/./prometheus
在浏览器中输入server端ip地址:ip:9090
可以查看当前监控的节点,因为没有监控其他client端,所以目前只监控了server本身
只监控了prometheus服务端本身
4、配置文件
prometheus配置文件分四个配置
- global:全局配置
- alerting:告警配置
- rule_files:告警规则
- scrape_configs:配置数据源(target)
prometheus 配置文件:
horbor_labels:配置为true可以确保当采集到的监控指标冲突时,能够自动忽略冲突的监控数据。如果为false时,prometheus会自动将冲突的标签替换为exported_ 的形式
match[]:指定需要获取的时间序列。match[]参数必须是一个瞬时向量选择器,比如:up或者{job=”api-server”}。配置多个match[]参数,用于获取多组时间序列的监控数据。
[root@bogon prometheus]# cat prometheus.yml
# my global config
global:
scrape_interval: 15s # # 拉取targets 的默认时间间隔 Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # # 执行rules的时间间隔 Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 172.16.5.25:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files: #告警规则
# - "first_rules.yml"
# - "second_rules.yml"
- /usr/local/prometheus/rules/all.yml #告警规则文件路径
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: slaves
honor_labels: true
metrics_path: /federate
params:
match[]:
- '{__name__=~"^slave:.*"}' # Request all slave-level time series
- '{__name__=~"job:.*"}'
- '{__name__=~"node.*"}'
static_configs: #静态发现两个slave端(因为slave端就两台所以可以直接用静态发现)
- targets:
- 172.16.5.122:9090
- 172.16.5.25:9090
5、配置告警规则
[root@bogon prometheus]# cat rules/all.yml
groups:
- name: 主机状态-监控告警
rules:
- alert: 主机状态
expr: up == 0
for: 1m
labels:
status: 非常严重
annotations:
summary: "{{$labels.instance}}:服务器宕机"
description: "{{$labels.instance}}:服务器延时超过5分钟"
- alert: CPU使用情况
expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 60
for: 1m
labels:
status: 一般告警
annotations:
summary: "{{$labels.mountpoint}} CPU使用率过高!"
description: "{{$labels.mountpoint }} CPU使用大于60%(目前使用:{{$value}}%)"
- alert: 内存使用
expr: 100 -(node_memory_MemTotal_bytes -node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes ) / node_memory_MemTotal_bytes * 100> 80
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 内存使用率过高!"
description: "{{$labels.mountpoint }} 内存使用大于80%(目前使用:{{$value}}%)"
- alert: IO性能
expr: 100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流入磁盘IO使用率过高!"
description: "{{$labels.mountpoint }} 流入磁盘IO大于60%(目前使用:{{$value}})"
- alert: 网络
expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流入网络带宽过高!"
description: "{{$labels.mountpoint }}流入网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
- alert: 网络
expr: ((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流出网络带宽过高!"
description: "{{$labels.mountpoint }}流出网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
- alert: TCP会话
expr: node_netstat_Tcp_CurrEstab > 1000
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} TCP_ESTABLISHED过高!"
description: "{{$labels.mountpoint }} TCP_ESTABLISHED大于1000%(目前使用:{{$value}}%)"
- alert: 磁盘容量
expr: 100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) > 70
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 磁盘分区使用率过高!"
description: "{{$labels.mountpoint }} 磁盘分区使用大于80%(目前使用:{{$value}}%)"
四、安装alertmanager 告警插件
1、安装下载alertmanager
下载地址:
https://github.com/prometheus/alertmanager
解压之后文件结构:
[root@client local]# cd alertmanager/
[root@client alertmanager]# ll
总用量 49440
-rwxr-xr-x. 1 3434 3434 27610164 9月 3 23:02 alertmanager
-rw-r--r--. 1 root root 676 12月 6 10:52 alertmanager.yml
-rw-r--r--. 1 3434 3434 380 9月 3 23:37 alertmanager.yml.bak
-rw-r--r--. 1 root root 1359 12月 6 09:45 alertmanager.yml.youxiang
-rwxr-xr-x. 1 3434 3434 22935908 9月 3 23:02 amtool
drwxr-xr-x. 2 root root 4096 12月 6 17:36 data
-rw-r--r--. 1 3434 3434 11357 9月 3 23:37 LICENSE
-rw-------. 1 root root 37468 12月 6 17:20 nohup.out
-rw-r--r--. 1 3434 3434 457 9月 3 23:37 NOTICE
启动alertmanager
[root@client alertmanager]# nohup ./alertmanager &
[1] 22490
nohup: 忽略输入并把输出追加到"nohup.out"
查看进程
[root@client alertmanager]# ps -ef |grep alertmanager
root 3334 1 0 15:36 ? 00:00:08 ./alertmanager
root 22662 22093 0 17:45 pts/1 00:00:00 grep alertmanager
2、alertmanager配置文件
- 邮箱报警配置文件
[root@client alertmanager]# cat alertmanager.yml
global:
# resolve_timeout:解析超时时间
resolve_timeout: 5m
# # smtp_smarthost: 使用email打开服务配置
smtp_smarthost: 'smtp.163.com:465'
# smtp_from:指定通知报警的邮箱
smtp_from: 'xxx@163.com'
# smtp_auth_username:邮箱用户名
smtp_auth_username: 'xxx@163.com'
# smtp_auth_password:授权密码
smtp_auth_password: 'SHAbidaohaode123'
# smtp_require_tls:是否启用tls
smtp_require_tls: false
# route标记:告警如何发送分配
route:
# group_by:采用哪个标签作为分组的依据
group_by: ['alertname']
# group_wait:分组等待的时间
group_wait: 10s
# group_interval:上下两组发送告警的间隔时间
group_interval: 10s
# repeat_interval:重复发送告警时间。默认1h
repeat_interval: 1m
# receiver 定义谁来通知报警
receiver: 'mail'
# receiver标记:告警接受者
receivers:
# name:报警来源自定义名称
- name: 'mail'
# email_configs:通过邮箱发送报警
email_configs:
# to:指定接收端email
- to: 'xxx@163.com'
- 企业微信报警
[root@client alertmanager]# cat alertmanager.yml.wechat
global:
resolve_timeout: 5m
wechat_api_corp_id: 'wwf21db505fce2dde4'
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
wechat_api_secret: 'VmgazzYOKCeUe7JkdeKE_Je-PSIsZN85dHXaFQvFJME'
route:
group_by: ['alertname'] #报警分组依据
group_wait: 10s #组等待时间
group_interval: 10s #发送前等待时间
repeat_interval: 1h #重复周期
receiver: 'wechat' #默认报警接受者
receivers:
- name: 'wechat'
wechat_configs:
- send_resolved: true
to_party: '1'
agent_id: '1000002'
corp_id: 'xxxx'
api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
api_secret: 'xxxx-PSIsZN85dHXaFQvFJME'
然后在server端配置文件中填写alerting
[root@bogon prometheus]# vim prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets: ["172.16.5.25:9093"]
五、添加slave节点
在两台slave节点安装prometheus server端,用来分布式监控
1、启动prometheus
解压完成放到后台启动prometheus
[root@client node_exporter]# nohup ./prometheus &
启动之后查看进程已经启动
[root@bogon prometheus]# ps -ef |grep prometheus
root 68158 2755 1 17:44 pts/1 00:00:02 ./prometheus
root 68725 2755 0 17:48 pts/1 00:00:00 grep prometheus
2、添加文件自动发现
在prometheus目录下创建targets/nodes目录并创建nodes.json文件用来自动发现被监控节点
[root@bogon nodes]# pwd
/usr/local/prometheus/targets/nodes
[root@bogon nodes]# ll
总用量 4
-rw-r--r-- 1 root root 152 12月 9 17:44 nodes.json
#targetes 里面写的就是需要监控的机器,在prometheus配置文件直接调用这个文件就可以不用每次都手动改配置文件了
[root@bogon nodes]# cat nodes.json
[{
"targets": [
"172.16.5.25:9100",
"172.16.5.122:9100",
"172.16.1.32:9100"
],
"labels": {
"server": "server=172.16.5.122"
}
}]
3、slave端配置文件
[root@bogon prometheus]# cat prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
external_labels:
slave: 1 # This is the 1nd slave. This prevents clashes between slaves.
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 172.16.5.25:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- /usr/local/prometheus/rules/all.yml #指定报警规则文件路径
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus-172.16.5.122' #增加一个节点,取名为prometheus-172.16.5.122
# Add usual service discovery here, such as static_configs
metrics_path: "/metrics" #获取数据的路径 http://slaveip:9100/metrics
file_sd_configs: #这个配置表示通过文件发现
- files:
- targets/nodes/nodes.json # 读取目录下nodes.json文件
refresh_interval: 1m # 刷新频率,1 分钟
报警规则跟上面相同
地址规范:
我这里server端地址:
172.16.5.30
两个slave地址分别为
172.16.5.122
172.16.5.25
因为只开了3台虚拟机,所以两台slave 监控的节点是各自本身和对方的ip
172.16.5.122额外监控了172.16.1.32运维平台的机器
下面看图:
这是172.16.5.122 的某一个监控值
这是172.16.5.25的监控值
这是server端监控的值,可以看到server端可以收集到两台slave的所有监控信息
六、安装grafana图形显示工具
1、安装启动
下载地址:
wget https://dl.grafana.com/oss/release/grafana-6.5.1-1.x86_64.rpm
yum localinstall grafana-6.5.1-1.x86_64.rpm
启动grafana-server
[root@bogon prometheus]# service grafana-server start
查看进程
[root@bogon prometheus]# ps -ef |grep grafana
grafana 5316 1 0 08:58 ? 00:00:05 /usr/sbin/grafana-server --pidfile=/var/run/grafana-server.pid --config=/etc/grafana/grafana.ini --packaging=rpm cfg:default.paths.provisioning=/etc/grafana/provisioning cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins
root 7355 2750 0 09:16 pts/1 00:00:00 grep grafana
浏览器中访问ip:3000
2、添加数据源
URL地址是prometheus-server
填写完成之后添加Save&test,出现下图则添加成功
3、导入dashboard模板
常用的prometheus 模板有8919和1860,然后将Data Source 选择为刚才添加的Prometheus数据源
整体的监控图形显示