前提

Prometheus 是由 SoundCloud 开源的监控告警解决方案。基于Prometheus,我们可以按时间间隔定义采集任务,用 拉取的方式去采集各个服务应用上的性能指标,再配合Grafana对采集到的指标进行可视化展示和查询分析。Prometheus和Grafana都支持报警规则,可以通过Webhook能把报警信息推送到钉钉群里,及时响应异常情况。依我的理解,Prometheus的报警规则是支持job级别和指标级别的,Grafana只支持指标级别的。本篇介绍的是Prometheus的报警规则,监控Job服务是否正常运行,Supervisor用于进程管理。以下所描述的内容是假定你已经正常安装Prometheus,并正常运行了至少一个Job服务。

工欲善其事,必先利其器

需要准备的工作包括:钉钉机器人的webhook、Prometheus-webhook-dingtalkAlterManager

钉钉添加机器人

参考钉钉官方文档

Prometheus-AlertManager-Supervisor-钉钉告警 - 图1

Prometheus-AlertManager-Supervisor-钉钉告警 - 图2

钉钉机器人的webhook: https://oapi.dingtalk.com/robot/send?access_token=xxx

Prometheus-webhook-dingtalk

插件官网

下载解压prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz

  1. wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
  2. tar -zxvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz

启动prometheus-webhook-dingtalk,这里使用Supervisor进行后台启动

进入supervisor安装目录,在conf.d/下新建prometheus-webhook-dingtalk.conf

  1. 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
  1. [program:prometheus_webhook_dingtalk]
  2. command = /xxx/prometheus_webhook_dingtalk/prometheus-webhook-dingtalk --web.enable-ui --ding.profile="webhook1=https://oapi.dingtalk.com/robot/send?access_token=xxx"
  3. directory = /xxx/prometheus_webhook_dingtalk
  4. user = root
  5. startsecs = 5
  6. redirect_stderr = true
  7. stdout_logfile_maxbytes = 10MB
  8. stdout_logfile_backups = 3
  9. stdout_logfile = /xxx/supervisor/logs/prometheus_webhook_dingtalk.log
  10. autostart=true
  11. autorestart=true

supervisorctl update进行进程的启动,如果出现错误可以查看/xxx/prometheus_webhook_dingtalk.log

启动后从日志中可以看到用于接收告警信息的webhook的地址为:http://localhost:8060/dingtalk/webhook1/send

supervisorctl status 查看prometheus_webhook_dingtalk是否正常启动。


下面开始进入正式的配置环节:

Prometheus

修改prometheus.yml,主要有两个步骤:

  1. 对Alertmanager进行配置,填写alerting对应的targets地址(本文的Alertmanager和Prometheus安装在同一台机子上),例如localhost:9093,默认的端口为9093。```yml

    Alertmanager configuration

    alerting: alertmanagers:

    • static_configs:
      • targets: [localhost:9093]

        - alertmanager:9093

        ```
  2. 添加规则文件first_rules.yml```yaml rule_files:

    • “first_rules.yml”

      - “second_rules.yml”

      ```
      first_rules.yml与prometheus.yaml同一个目录下,也可以放置其他位置。如果放置在其他目录需要指定该目录,让Alertmanager能找到该规则文件。
      Prometheus-AlertManager-Supervisor-钉钉告警 - 图3

AlterManager

  1. 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也会根据这两个标签值,显示告警信息。

比如监控应用是否宕机:

  1. groups:
  2. - name: example
  3. rules:
  4. - alert: Server Down
  5. expr: up{job="xxx"} == 0
  6. for: 10s
  7. labels:
  8. severity: critical
  9. annotations:
  10. description: "实例:{{ $labels.instance }} 宕机了"
  11. summary: "Instance {{ $labels.instance }} down"

配置alertmanager.yml

  1. global:
  2. resolve_timeout: 5m
  3. route:
  4. group_by: ['alertname']
  5. group_wait: 10s
  6. group_interval: 10s
  7. repeat_interval: 1h
  8. receiver: 'ops_dingding' #和receivers中定义的name对应
  9. receivers:
  10. - name: 'ops_dingding'
  11. webhook_configs:
  12. - url: 'http://localhost:8060/dingtalk/webhook1/send' #prometheus_webhook_dingtalk启动后从日志中可以看到用于接收告警信息的webhook的地址
  13. send_resolved: true
  14. inhibit_rules:
  15. - source_match:
  16. severity: 'critical'
  17. target_match:
  18. severity: 'warning'
  19. equal: ['alertname', 'dev', 'instance']

同样使用Supervisor启动Alertmanager,进入supervisor安装目录,在conf.d/下新建alertmanager.conf

  1. vim alertmanager.conf

配置alertmanager.conf

  • /xxx/alertmanager/alertmanager:alertmanager启动脚本路径
  • —config.file:启动的配置文件
  1. #!bin/sh
  2. [program:alertmanager]
  3. command = /xxx/alertmanager/alertmanager --config.file=/xxx/alertmanager/alertmanager.yml
  4. directory = /xxx/alertmanager
  5. user = root
  6. startsecs = 5
  7. redirect_stderr = true
  8. stdout_logfile_maxbytes = 10MB
  9. stdout_logfile_backups = 3
  10. stdout_logfile = /xxx/supervisor/logs/alertmanager.log
  11. autostart=true
  12. autorestart=true

在确保上面的配置无误后,就可以重启Prometheus了。重启进入Prometheus后在Alerts中可以看到之前定义的告警规则已激活。

Prometheus-AlertManager-Supervisor-钉钉告警 - 图4

一旦触发告警规则,在Alertmanager ui中可以看到对应的告警信息,同时发送到钉钉。

Prometheus-AlertManager-Supervisor-钉钉告警 - 图5

钉钉接收到的告警信息:

Prometheus-AlertManager-Supervisor-钉钉告警 - 图6