前提
Prometheus 是由 SoundCloud 开源的监控告警解决方案。基于Prometheus,我们可以按时间间隔定义采集任务,用 拉取的方式去采集各个服务应用上的性能指标,再配合Grafana对采集到的指标进行可视化展示和查询分析。Prometheus和Grafana都支持报警规则,可以通过Webhook能把报警信息推送到钉钉群里,及时响应异常情况。依我的理解,Prometheus的报警规则是支持job级别和指标级别的,Grafana只支持指标级别的。本篇介绍的是Prometheus的报警规则,监控Job服务是否正常运行,Supervisor用于进程管理。以下所描述的内容是假定你已经正常安装Prometheus,并正常运行了至少一个Job服务。
工欲善其事,必先利其器
需要准备的工作包括:钉钉机器人的webhook、Prometheus-webhook-dingtalk和AlterManager
钉钉添加机器人
钉钉机器人的webhook: https://oapi.dingtalk.com/robot/send?access_token=xxx
Prometheus-webhook-dingtalk
下载解压prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
tar -zxvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
启动prometheus-webhook-dingtalk,这里使用Supervisor进行后台启动
进入supervisor安装目录,在conf.d/下新建prometheus-webhook-dingtalk.conf
vim prometheus-webhook-dingtalk.conf
配置prometheus-webhook-dingtalk.conf
- /xxx/prometheus_webhook_dingtalk/prometheus-webhook-dingtalk:prometheus-webhook-dingtalk启动脚本路径
- —web.enable-ui:启动ui,默认端口为9093
- —ding.profile:钉钉机器人的webhook地址,前面加上webhook1
[program:prometheus_webhook_dingtalk]
command = /xxx/prometheus_webhook_dingtalk/prometheus-webhook-dingtalk --web.enable-ui --ding.profile="webhook1=https://oapi.dingtalk.com/robot/send?access_token=xxx"
directory = /xxx/prometheus_webhook_dingtalk
user = root
startsecs = 5
redirect_stderr = true
stdout_logfile_maxbytes = 10MB
stdout_logfile_backups = 3
stdout_logfile = /xxx/supervisor/logs/prometheus_webhook_dingtalk.log
autostart=true
autorestart=true
supervisorctl update进行进程的启动,如果出现错误可以查看/xxx/prometheus_webhook_dingtalk.log
启动后从日志中可以看到用于接收告警信息的webhook的地址为:http://localhost:8060/dingtalk/webhook1/send
supervisorctl status 查看prometheus_webhook_dingtalk是否正常启动。
下面开始进入正式的配置环节:
Prometheus
修改prometheus.yml,主要有两个步骤:
对Alertmanager进行配置,填写alerting对应的targets地址(本文的Alertmanager和Prometheus安装在同一台机子上),例如localhost:9093,默认的端口为9093。```yml
Alertmanager configuration
alerting: alertmanagers:
添加规则文件first_rules.yml```yaml rule_files:
AlterManager
Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertmanager支持Email, Slack,等告警方式, 也可以通过webhook接入钉钉等国内IM工具。
配置first_rules.yml,在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)。一条告警规则主要由以下几部分组成:
- alert:告警规则的名称。
- expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
- for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
- labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
- annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。summary描述告警的概要信息,description用于描述告警的详细信息。同时Alertmanager的UI也会根据这两个标签值,显示告警信息。
比如监控应用是否宕机:
groups:
- name: example
rules:
- alert: Server Down
expr: up{job="xxx"} == 0
for: 10s
labels:
severity: critical
annotations:
description: "实例:{{ $labels.instance }} 宕机了"
summary: "Instance {{ $labels.instance }} down"
配置alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'ops_dingding' #和receivers中定义的name对应
receivers:
- name: 'ops_dingding'
webhook_configs:
- url: 'http://localhost:8060/dingtalk/webhook1/send' #prometheus_webhook_dingtalk启动后从日志中可以看到用于接收告警信息的webhook的地址
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
同样使用Supervisor启动Alertmanager,进入supervisor安装目录,在conf.d/下新建alertmanager.conf
vim alertmanager.conf
配置alertmanager.conf
- /xxx/alertmanager/alertmanager:alertmanager启动脚本路径
- —config.file:启动的配置文件
#!bin/sh
[program:alertmanager]
command = /xxx/alertmanager/alertmanager --config.file=/xxx/alertmanager/alertmanager.yml
directory = /xxx/alertmanager
user = root
startsecs = 5
redirect_stderr = true
stdout_logfile_maxbytes = 10MB
stdout_logfile_backups = 3
stdout_logfile = /xxx/supervisor/logs/alertmanager.log
autostart=true
autorestart=true
在确保上面的配置无误后,就可以重启Prometheus了。重启进入Prometheus后在Alerts中可以看到之前定义的告警规则已激活。
一旦触发告警规则,在Alertmanager ui中可以看到对应的告警信息,同时发送到钉钉。
钉钉接收到的告警信息: