Prometheus-Alertmanager告警對接到企業微信

之前寫過將Prometheus的監控告警資訊通過Alertmanager推送到釘釘群。

最近轉移了陣地,需要將Prometheus監控告警資訊推送到企業微信群,經過兩天的摸索,以及查了網上的一些資料,總結了此文,避免後面的同學走彎路。

Alertmanager將告警資訊推送到微信群,主要涉及到如下幾方面的配置:

  1. 企業微信後台的配置,包括新建告警部門和應用;
  2. Alertmanager的主配置文件配置和告警模板配置;
  3. Prometheus主配置文件的配置以及告警規則的配置;

下面就這三點分別進行介紹

1、企業微信後台配置

這裡就不得不啰嗦幾句,[互聯]網大了,什麼鳥都有,天下文章一大抄,管它對於不對,先轉到自己部落格再說。真正能夠自己驗證,能夠理解其告警策略和原理的能有幾人?

1.1 企業ID獲取

首先訪問企業微信官網://work.weixin.qq.com/

註冊一個企業,當前是誰都可以註冊,沒有任何限制,也不需要企業認證,註冊即可。

註冊完成之後,登錄後台管理,在【我的企業】這裡,先拿到後面用到的第一個配置:企業ID

 

1.2 部門ID獲取

然後在通訊錄中,添加一個子部門,用於接收告警資訊,後面把人加到該部門,這個人就能接收到告警資訊了。

 

 

 獲得我們配置告警的第二個參數:部門ID 2

 

1.3 告警AgentId和Secret獲取

告警AgentId和Secret獲取是需要在企業微信後台,【應用管理】中,自建應用才能夠獲得的。這裡網上介紹的非常多,都只是說了這一步驟,而忽略了其他幾個重要的步驟。

 

 

 最後點擊創建應用,可以看到我們剛才創建好的應用Prometheus。

點擊這個應用,可以看到我們想要的AgentId和Secret

 

以上步驟完成後,我們就得到了配置Alertmanager的所有資訊,包括:企業ID,AgentId,Secret和接收告警的部門id

下面我們來配置Alertmanager服務

2、Alertmanager服務配置

2.1 主配置文件

# 主配置文件資訊如下:
cat /opt/alertmanager/alertmanager.yml
global:
  resolve_timeout: 1m   # 每1分鐘檢測一次是否恢復
  wechat_api_url: '//qyapi.weixin.qq.com/cgi-bin/'
  wechat_api_corp_id: 'bbbbbbbbbbbbbbbb'      # 企業微信中企業ID
  wechat_api_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'      # 企業微信中,應用的Secret

templates:
  - '/opt/alertmanager/template/*.tmpl'

route:
  receiver: 'wechat'
  group_by: ['env','instance','type','group','job','alertname']
  group_wait: 10s       # 初次發送告警延時
  group_interval: 10s   # 距離第一次發送告警,等待多久再次發送告警
  repeat_interval: 5m   # 告警重發時間

receivers:
- name: 'wechat'
  wechat_configs: 
  - send_resolved: true
    message: '{{ template "wechat.default.message" . }}'
    to_party: '2'         # 企業微信中創建的接收告警的部門【告警機器人】的部門ID
    agent_id: '1000002'     # 企業微信中創建的應用的ID
    api_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'      # 企業微信中,應用的Secret

2.2 告警模板

# cat /opt/alertmanager/template/wechat.tmpl
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
========= 監控報警 =========
告警狀態:{{   .Status }}
告警級別:{{ .Labels.severity }}
告警類型:{{ $alert.Labels.alertname }}
故障主機: {{ $alert.Labels.instance }}
告警主題: {{ $alert.Annotations.summary }}
告警詳情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};
觸發閥值:{{ .Annotations.value }}
故障時間: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
========= = end =  =========
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
========= 異常恢復 =========
告警類型:{{ .Labels.alertname }}
告警狀態:{{   .Status }}
告警主題: {{ $alert.Annotations.summary }}
告警詳情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};
故障時間: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢復時間: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
實例資訊: {{ $alert.Labels.instance }}
{{- end }}
========= = end =  =========
{{- end }}
{{- end }}
{{- end }}
{{- end }}

2.3 Prometheus集成

下面配置prometheus告警規則
主配置文件:prometheus.yml中加入:

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "rules/node_status.yml"

然後配置告警規則文件:node_status.yml

# cat rules/node_status.yml

[root@cn-prom prometheus-server]# cat rules/node_status.yml 
groups:
- name: 實例存活告警規則
  rules:
  - alert: 實例存活告警
    expr: up{job="prometheus"} == 0 or up{job="Linux-host"} == 0
    for: 1m
    labels:
      user: prometheus
      severity: Disaster
    annotations:
      summary: "Instance {{ $labels.instance }} is down"
      description: "Instance {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
      value: "{{ $value }}"

- name: 記憶體告警規則
  rules:
  - alert: "記憶體使用率告警"
    expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 75
    for: 1m
    labels:
      user: prometheus
      severity: warning
    annotations:
      summary: "伺服器: {{$labels.alertname}} 記憶體報警"
      description: "{{ $labels.alertname }} 記憶體資源利用率大於75%!(當前值: {{ $value }}%)"
      value: "{{ $value }}"

- name: CPU報警規則
  rules:
  - alert: CPU使用率告警
    expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 70
    for: 1m
    labels:
      user: prometheus
      severity: warning
    annotations:
      summary: "伺服器: {{$labels.alertname}} CPU報警"
      description: "伺服器: CPU使用超過70%!(當前值: {{ $value }}%)"
      value: "{{ $value }}"

- name: 磁碟報警規則
  rules:
  - alert: 磁碟使用率告警
    expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 80
    for: 1m
    labels:
      user: prometheus
      severity: warning
    annotations:
      summary: "伺服器: {{$labels.alertname}} 磁碟報警"
      description: "伺服器:{{$labels.alertname}},磁碟設備: 使用超過80%!(掛載點: {{ $labels.mountpoint }} 當前值: {{ $value }}%)"
      value: "{{ $value }}"

至此,企業Prometheus對接企業微信告警完畢,出現故障你就能看到如下告警資訊和恢復資訊了

========= 監控報警 =========
告警狀態:firing
告警級別:Disaster
告警類型:實例存活告警
故障主機: 10.137.10.211:9100
告警主題: Instance 10.137.10.211:9100 is down
告警詳情: Instance 10.137.10.211:9100 of job Linux-host has been down for more than 1 minutes.;
觸發閥值:0
故障時間: 2020-09-21 10:21:08
========= = end =  =========

========= 異常恢復 =========
告警類型:實例存活告警
告警狀態:resolved
告警主題: Instance 10.137.10.211:9100 is down
告警詳情: Instance 10.137.10.211:9100 of job Linux-host has been down for more than 1 minutes.;
故障時間: 2020-09-21 10:21:08
恢復時間: 2020-09-21 10:26:23
實例資訊: 10.137.10.211:9100
========= = end =  =========

以上,請測試驗證,如有描述不清楚的地方,歡迎留言交流。