Prometheus告警配置

1,569 阅读5分钟

前言

在前面的二节只是简单介绍了Prometheus监控配置可以让读者快速上手,本节主要介绍Prometheus告警配置,比如邮件通知短信通知

AlertManager配置

下载

docker pull prom/alertmanager:v0.25.0

image-20230404112410207

配置

在本地data/prometheus/alertmanager/目录创建alertmanager.yml配置文件

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

Alertmanager的配置主要包含两个部分:路由(route)以及接收器(receivers)。所有的告警信息都会从配置中的顶级路由(route)进入路由树,根据路由规则将告警信息发送给相应的接收器。

在Alertmanager中可以定义一组接收器,比如可以按照角色(比如系统运维,数据库管理员)来划分多个接收器。接收器可以关联邮件,Slack以及其它方式接收告警信息。

启动

docker run --name alertmanager -d -p 9093:9093  -v /data/prometheus/alertmanager:/etc/alertmanager prom/alertmanager:v0.25.0

查看运行状态

Alertmanager启动后可以通过9093端口访问,http://127.0.0.1:9093

image-20230404113727742

Alert菜单下可以查看Alertmanager接收到的告警内容。Silences菜单下则可以通过UI创建静默规则。

关联Prometheus与Alertmanager

在Prometheus的架构中被划分成两个独立的部分。Prometheus负责产生告警,而Alertmanager负责告警产生后的后续处理。因此Alertmanager部署完成后,需要在Prometheus中设置Alertmanager相关的信息。

编辑Prometheus配置文件prometheus.yml,并添加以下内容,这里的10.211.55.2是本地ip

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['10.211.55.2:9093']

image-20230404114056612

报警规则配置

在prometheus.yml增加如下内容

rule_files:
  - /prometheus/rules/*.rules

image-20230404135131692

因为在容器启动时用主机的/data/prometheus目录映射到容器的/prometheus目录,因此在主机/data/prometheus/目录创建rules文件夹,并创建告警文件hoststats-alert.rules即可:

mkdir /data/prometheus/rules && cat <<"EOF"> /data/prometheus/rules/hoststats-alert.rules
groups:
- name: hostStatsAlert
  rules:
  - alert: hostCpuUsageAlert
    expr: sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance) > 0.85
    for: 1m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} CPU usgae high"
      description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
  - alert: hostMemUsageAlert
    expr: (node_memory_MemTotal - node_memory_MemAvailable)/node_memory_MemTotal > 0.85
    for: 1m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} MEM usgae high"
      description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
EOF

重启Prometheus

docker restart prometheus

重启完成之后,访问http://localhost:9090/config,查看altering配置是否生效,出现如下红色标识则表示生效

image-20230404115042393

访问http://localhost:9090/rules,查看规则是否生效,出现如下配置则生效

image-20230404141737098

cpu拉高报警测试

在监控服务器执行以下命令,拉高cpu使用率

cat /dev/zero>/dev/null

运行以下命令后查看CPU使用率情况,如下图所示:

sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance)

image-20230404143025575

Prometheus首次检测到满足触发条件后,hostCpuUsageAlert显示有一条告警信息,状态为firing表示已经推送给了altermanager

image-20230404143145288

访问http://127.0.0.1:9093查看告警信息,可以为刚才推送信息

image-20230404143404495

邮件通知测试

邮箱通知配置

修改alertmanager.yml为以下内容,替换对应账号即可

global:
  smtp_smarthost: smtp.qq.com:465
  smtp_from: 928552509@qq.com
  smtp_auth_username: 928552509@qq.com
  smtp_auth_identity: 928552509@qq.com
  smtp_auth_password: 123
  smtp_require_tls: false
route:
  group_by: ['alertname']
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
receivers:
  - name: default-receiver
    email_configs:
      - to: dongweizhao123@foxmail.com
        send_resolved: true

重启

docker restart alertmanager

重启完成,访问http://127.0.0.1:9093/#/status,查看配置是否生效

image-20230404152250576

cpu拉高测试

在目录服务器执行以下命令,拉高cpu

cat /dev/zero>/dev/null

image-20230404152542648

查看prometheus已收到告警信息

image-20230404152627758

等个一分钟左右,会推送给altermanager,altermanager等待30s,会推送至对应的邮箱,如下图

image-20230404153758997

告警模版测试

/data/prometheus/alertmanager目录下创建模版文件,这里的2006-01-02 15:04:05是go语言的日志格式,固定的

cat > /data/prometheus/alertmanager/notify-template.tmpl <<EOF
{{ define "test.html" }} 
{{ range .Alerts }}
=========start==========<br>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br>
=========end==========<br>
{{ end }}
{{ end }}
EOF
  • 关联告警模版
global:
  smtp_smarthost: smtp.qq.com:465
  smtp_from: 928552509@qq.com
  smtp_auth_username: 928552509@qq.com
  smtp_auth_identity: 928552509@qq.com
  smtp_auth_password: wanxoybjxjypbecj
  smtp_require_tls: false
templates: #添加模板
  - '/etc/alertmanager/notify-template.tmpl'   #指定路径    
route:
  group_by: ['alertname']
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
receivers:
  - name: default-receiver
    email_configs:
      - to: dongweizhao123@foxmail.com
        html: '{{ template "test.html" . }}'
        send_resolved: true
  • 重启altermanager

    docker restart alertmanager
    
  • 拉高监控主机cpu

    cat /dev/zero>/dev/null
    
  • 最终结果

    image-20230405191744817

配置增强

观察以上告警有以下问题

  • 触发时间不对,用的是UTC时间
  • 无法区分告警与恢复邮件
  • 邮件标题看起来可读性比较差

下面针对上问题进行处理

模版调整

在以下时间增加28800e9,转换位东八区时间,即北京时间

{{ define "test.html" }} 
{{- if gt (len .Alerts.Firing) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:red;">告警</h1>
<pre>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>  
</pre>
{{ end }}
{{ end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:green;">恢复</h1>
<pre>
告警名称:{{ .Labels.alertname }}<br>
告警级别:{{ .Labels.severity }}<br>
告警机器:{{ .Labels.instance }}<br>
告警详情:{{ .Annotations.summary }}<br>
告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br> 
恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br> 
</pre>
{{- end }}
{{- end }}
{{- end }}

邮件增加标题

在headers增加Subject则为邮件标题,这里我们进行判断如果告警邮件标题为:系统监控告警恢复后,标题改为:系统监控告警恢复

global:
  smtp_smarthost: smtp.qq.com:465
  smtp_from: 928552509@qq.com
  smtp_auth_username: 928552509@qq.com
  smtp_auth_identity: 928552509@qq.com
  smtp_auth_password: wanxoybjxjypbecj
  smtp_require_tls: false
templates: #添加模板
  - '/etc/alertmanager/notify-template.tmpl'   #指定路径    
route:
  group_by: ['alertname']
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
receivers:
  - name: default-receiver
    email_configs:
      - to: dongweizhao123@foxmail.com
        html: '{{ template "test.html" . }}'
        send_resolved: true
        headers: { Subject: "系统监控告警{{- if gt (len .Alerts.Resolved) 0 -}}恢复{{ end }}" }  

再次测试

再次重启,拉高cpu进行测试,告警信息如下

image-20230405191652968

恢复通知邮件

image-20230405191714214

以上只是简单的一些告警配置,如果要支持推送到飞书或者钉钉就需要使用web_hook进行配置,后续在进行介绍。