Prometheus-Alertmanager告警對接到企業微信
- 2020 年 9 月 21 日
- 筆記
- alertmanager, Prometheus, 監控, 自動化, 運維知識, 運維知識庫
之前寫過將Prometheus的監控告警資訊通過Alertmanager推送到釘釘群。
最近轉移了陣地,需要將Prometheus監控告警資訊推送到企業微信群,經過兩天的摸索,以及查了網上的一些資料,總結了此文,避免後面的同學走彎路。
Alertmanager將告警資訊推送到微信群,主要涉及到如下幾方面的配置:
- 企業微信後台的配置,包括新建告警部門和應用;
- Alertmanager的主配置文件配置和告警模板配置;
- 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 = =========
以上,請測試驗證,如有描述不清楚的地方,歡迎留言交流。