监控是脱离不了告警的。告警是指把监控发现的问题通过微信或者短信等通信手段,告诉我们。zabbix有他的告警机制。而prometheus是通过alertmanager实现的。
alertmanager的安装
alertmanager是支持集群模式的。本文也是用集群方式安装。
- 选择两台或者三台机器用于部署alertmanager。
- 下载alertmanager安装包,这个在官方下载就行了。
- 分别把压缩包解压到各个机器上
- 修改配置文件alertmanager.yml
global:
resolve_timeout: 5m
receivers:
- name: magpie.ding
webhook_configs:
- url: http://10.252.3.10:9002/ding_message
send_resolved: false
route:
receiver: magpie.ding
group_by: ['kind']
group_wait: 10s
group_interval: 10s
repeat_interval: 1m
routes:
- receiver: magpie.ding
match_re:
severity: warnging
inhibit_rules:
- source_match:
alertname: 'node_time:sum:error'
target_match:
alertname: 'node_netstat_Icmp_InMsgs:error'
equal: ['kind','severity']
global
这个是全局设置
resolve_timeout
当告警的状态有firing变为resolve的以后还要呆多长时间,才宣布告警解除。这个主要是解决某些监控指标在阀值边缘上波动,一会儿好一会儿不好。
receivers
定义谁接收告警。也就是PrometheUS把告警内容发送到这个地方,然后这个地方的某些东东把告警发送给我们。
name
就是个代称方便后面用
webhook_configs
这个是说 PrometheUS把告警发送给webhook,也就是一个http的url,当然这个url需要我们自己定义服务实现了。PrometheUS还支持其他的方式,具体可以参考官网:https://prometheus.io/docs/alerting/configuration/
send_resolved
当问题解决了是否也要通知一下
route
是个重点,告警内容从这里进入,寻找自己应该用那种策略发送出去
receiver
一级的receiver,也就是默认的receiver,当告警进来后没有找到任何子节点和自己匹配,就用这个receiver
group_by
告警应该根据那些标签进行分组
group_wait
同一组的告警发出前要等待多少秒,这个是为了把更多的告警一个批次发出去
group_interval
同一组的多批次告警间隔多少秒后,才能发出
repeat_interval
重复的告警要等待多久后才能再次发出去
routes
也就是子节点了,配置项和上面一样。告警会一层层的找,如果匹配到一层,并且这层的continue选项为true,那么他会再往下找,如果下层节点不能匹配那么他就用区配的这一层的配置发送告警。如果匹配到一层,并且这层的continue选项为false,那么他会直接用这一层的配置发送告警,就不往下找了。
match_re
用于匹配label。此处列出的所有label都匹配到才算匹配
inhibit_rules
这个叫做抑制项,通过匹配源告警来抑制目的告警。比如说当我们的主机挂了,可能引起主机上的服务,数据库,中间件等一些告警,假如说后续的这些告警相对来说没有意义,我们可以用抑制项这个功能,让PrometheUS只发出主机挂了的告警。
source_match
根据label匹配源告警
target_match
根据label匹配目的告警
equal
此处的集合的label,在源和目的里的值必须相等。如果该集合的内的值再源和目的里都没有,那么目的告警也会被抑制。
- 分别启动alertmanager
比如在A,B两个节点上部署alertmanager,那么A节点的启动命令:
#你应该用nohup后台启动
./alertmanager --config.file=alertmanager.yml --cluster.peer=hostB:9094
B节点的启动命令:
#你应该用nohup后台启动
./alertmanager --config.file=alertmanager.yml --cluster.peer=hostA:9094
- 在PrometheUS上进行配置
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- hostA:9093
- hostB:9093
- 重启或者重新加载PrometheUS的配置
- 访问http://hostA:9093 就能看到alertmanager的页面
alertmanager部署完毕
测试
- 设置监控规则和阀值
新建一个文件名字是prometheus.rules.yml(名字是自定义的),
- name: test_alert_up
rules:
- alert: node_time:sum:error
expr: up < 1
#for: 10s
labels:
severity: warnging
action: text
kind: node_export
annotations:
summary: not up
last: "{{ $value }}"
上面的规则是检查,node_export是不是存活
for
当一个监控项超过了阀值时,这个告警处于pengding状态,而pending状态维持for秒以后,就会切换为fire状态,也就是将告警信息发送给了alertmanager
- 把规则和PrometheUS关联起来,修改PrometheUS的配置文件
rule_files:
- "prometheus.rules.yml"
- 重新加载配置或者重启
- 停掉一个node_export
- 查看你的告警服务是不是告警了,我这里的服务是我自己写的,通过钉钉告警
其他
如果你觉得alertmanager的inhibit_rules麻烦,你可以不配置inhibit_rules,而是登录alertmanager的页面,新建slience规则,也能达到关闭某个告警的效果。
先写到这里了,有问题进QQ群630300475聊一聊,大家一起进步