Prometheus-Alertmanager告警對接到企業微信
之前寫過將Prometheus的監控告警資訊通過Alertmanager推送到釘釘群。
最近轉移了陣地,需要將Prometheus監控告警資訊推送到企業微信群,經過兩天的摸索,以及查了網上的一些資料,總結了此文,避免後面的同學走彎路。
Alertmanager將告警資訊推送到微信群,主要涉及到如下幾方面的配置:
- 企業微信後臺的配置,包括新建告警部門和應用;
- Alertmanager的主配置檔案配置和告警模板配置;
- Prometheus主配置檔案的配置以及告警規則的配置;
下面就這三點分別進行介紹
1、企業微信後臺配置
這裡就不得不囉嗦幾句,[互聯]網大了,什麼鳥都有,天下文章一大抄,管它對於不對,先轉到自己部落格再說。真正能夠自己驗證,能夠理解其告警策略和原理的能有幾人?
1.1 企業ID獲取
首先訪問企業微信官網:https://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: 'https://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 = =========
以上,請測試驗證,如有描述不清楚的地方,歡迎留言交流。