③prometheus报警


通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。

prometheus发送邮件报警需要alertmanager组件支持

安装运行alertmanager

wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
tar zxvf alertmanager-0.21.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
ln -sv alertmanager-0.21.0.linux-amd64/ alertmanager
cd /alertmanager
./alertmanager

在监控服务器上写一个简单的告警规则

cat /usr/local/prometheus/alert_config/alert_rules/instance_down.yaml
groups:
- name: AllInstances
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 10s
    annotations:
      title: 'Instance down'
      description: Instance has been down for more than 1 minute.'
    labels:
      severity: 'critical'

编写alertmanager邮件告警

vi /usr/local/alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_from: 'XXXXXXXX@163.com'
  smtp_smarthost: 'smtp.163.com:465'
  smtp_auth_username: 'XXXXXXXX@163.com'
  smtp_auth_password: 'XXXXXXXXXXXXX'
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 10s
  receiver: 'email-me'
receivers:
- name: 'email-me'
  email_configs:
  - to: 'XXXXXXXX@163.com'
    send_resolved: true

邮件告警规则写好了,alertmanager邮件告警也配置好了,这时候在修改下prometheus的配置文件,使报警生效

......
# 这里是安装alertmanager组件的主机和端口,触发报警规则之后,prometheus向alertmanager发起请求
# Alertmanager configuration 
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 192.168.32.130:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "alert_config/alert_rules/*.yaml"
......

之后重启prometheus服务,还有node_exporter服务,再次进入192.168.32.130:9090可以看到告警规则

此时停掉一个node_exporter,可以看到告警规则已经生效

此时查看邮箱也发现了alertmanager发来的告警邮件

自定义模板

vi /usr/local/alertmanager/email.tmpl

{{ define "email.from" }}XXXXXXXX@163.com{{ end }}
{{ define "email.to" }}XXXXXXX@163.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity }} 级
告警类型: {{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
=========end==========
{{ end }} {{ end }}

定义好模板之后在alertmanager的配置文件中调用

global:
  ......
# 模板路径 templates: - '/usr/local/alertmanager/email.tmpl' receivers: - name: 'email-me' email_configs: - to: 'xxxxxxxx@163.com' html: '{{ template "email.to.html" . }}' # 调用模板 send_resolved: true

告警抑制

如果问题不处理,alertmanager会一直发送报警邮件,这个时候我们要用到抑制机制, Alertmanager的抑制机制可以避免当某种问题告警产生之后用户接收到大量由此问题导致的一系列的其它告警通知。

vi /usr/local/alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m
  smtp_from: 'XXXXXXXX@163.com'
  smtp_smarthost: 'smtp.163.com:465'
  smtp_auth_username: 'XXXXXXXX918@163.com'
  smtp_auth_password: 'XXXXXXXX'
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route: 
  # 注释掉组选项,避免对消息抑制造成影响
  #group_by: ['alertname']
  #group_wait: 10s
  #group_interval: 10s
  repeat_interval: 10s
  receiver: 'email-me'
receivers:
- name: 'email-me'
  email_configs:
  - to: 'XXXXXXXX@163.com'
    send_resolved: true

# 告警抑制 inhibit_rules: - source_match: alertname: InstanceDown severity: critical target_match: severity: critical equal: - instance

prometheus如果要使用钉钉告警,需要dingtalk插件的支持,下载安装dingtalk

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 -C /usr/local/
cd /usr/local/
ln -sv prometheus-webhook-dingtalk-1.4.0.linux-amd64/ dingtalk

钉钉建一个群,里边添加一个自定义机器人,复制下来它的webhook和加签信息,修改配置文件

vi /usr/local/dingtalk/config.yml

...
targets:
  webhook1:
    # 钉钉机器人接口
    url: https://oapi.dingtalk.com/robot/send?access_token=9773c2bc976a813481e0c8f6c6668b944e5cc8478ae5206ff02cdb467e751dcb
    # 钉钉加签
    secret: SECdc47fe6d66575724514eafb13388ab19c452ccb15d11aeeb70b3bfabaa4e3bbc

修改dingtalk为系统服务,方便管理

vi /etc/systemd/system/dingtalk.service
[Unit]
Description=prometheus-webhook-dingtalk
After=network-online.target

[Service]
Restart=on-failure
ExecStart=/usr/local/dingtalk/prometheus-webhook-dingtalk --config.file=/usr/local/dingtalk/config.yml

[Install]
WantedBy=multi-user.target

启动dingtalk

systemctl start dingtalk    # 启动之后监听8060端口

修改alertmanager.yml

global:
  resolve_timeout: 5m
route:
  #group_by: ['alertname', 'severity', 'namespace']
  #group_wait: 10s
  #group_interval: 10s
  repeat_interval: 10s
  receiver: 'dingding.webhook1'
  routes:
  - receiver: 'dingding.webhook1'
    match:
      team: DevOps
    group_wait: 10s
    group_interval: 15s
    repeat_interval: 3h
  - receiver: 'dingding.webhook.all'
    match:
      team: SRE
    group_wait: 10s
    group_interval: 15s
    repeat_interval: 3h
receivers:
- name: 'dingding.webhook1'
  webhook_configs:
  - url: 'http://192.168.1.1:8060/dingtalk/webhook1/send'
    send_resolved: true
- name: 'dingding.webhook.all'
  webhook_configs:
  - url: 'http://192.168.1.1:8060/dingtalk/webhook_mention_all/send'
    send_resolved: true

inhibit_rules:
- source_match:
    alertname: InstanceDown
    severity: critical
  target_match:
    severity: critical
  equal:
   - instance

重启alertmanager。停掉node_exporter测试,成功收到告警信息