概述
通過之前的文章 - Prometheus Alertmanager 生產配置趟過的坑總結, 我們已經知道 AlertManager 作為告警平臺,是非常強大的,可以去重 (deduplicating),分組 (grouping),并將它們路由 (routing) 到正確的接收器 (receiver) 集成,如電子郵件,微信,或釘釘,它還負責處理警報的靜默/屏蔽 (silencing)、定時發送/不發送 (Mute) 和抑制 (inhibition) 問題,
正常的 AlertManager 處理告警流程,是要經過 Alerts -> Route -> Receivers 這么一個步驟的
- Alerts 里帶了一些標簽,如 env, team, job 等
- 根據提前編輯好的 Route, 對 alerts 進行路由,比如 env=prod 的發給哪些 receiver, team=db 的發給哪些人,..
- 在 Receivers 里已經提前錄入了這些需要處理 prod,處理 db 告警的 receivers 郵箱,告警這樣發給對應的收件人,
但是,假如我在 Alerts 里自帶收件人資訊(如郵箱),能不能直接使用?而不需要再錄入所有的 receivers,
答案當然是可以!通過模板(template)實作這個需求,Let's GO!??????
模板(Template)簡介
AlertManager 模板最初的目的是為了對告警的訊息做定制化的,
比如同樣的 Alerts,我:
- 通過 SMS 發送,期望是純文本格式;
- 通過 email 發送,期望是 HTML 格式;
- 通過釘釘、企微發送,期望是 Markdown 格式;
- 而且在這些渠道中,
- 標題是不同的排列組合
- 告警內容也是不同的段落格式和用詞(比如通過釘釘、企微會加入更多的 emoji)
AlertManager 模板是和 Prometheus 模板一樣,使用的同樣是 Go template,當然,具體的資料和函式會有細微的區別,因為在這里主要處理的是告警組而非單個告警,
示例如下:
receivers:
- name: emergency
slack_configs:
- api_url: https://hooks.slack.com/services/XXXXXXXX
channel: '#emergency'
title: 'Alerts in {{ .GroupLabels.cluster }} {{ .GroupLabels.env }}!'
AlertManager 進階
除了模板化 txt 欄位,通知的定義(比如:發給誰)也可以被模板化,通常每個 team 都有自己的路由樹,以及相對應的收件人(receivers),如果另一個團隊(不是監控團隊,也不是運維團隊,而是測驗等團隊)想要發送給自己團隊告警,他們需要從頭到尾設定 label、設定匹配其團隊 labels 的路由樹、把團隊內的收件人資訊配置到 AlertManager 的 receiver 里,
那如果你是監控團隊,你用 AlertManager 做了個告警平臺提供給外部團隊甚至客戶使用,每次都得這么搞會有“億點點”麻煩,
該怎么辦呢???????
解決方案
解決方案就是:
- Label
- AlertManager 通知模板
首先,直接在 Label 里提供相關的接收人資訊,然后通過 AlertManager 的模板,將 receiver -> to 寫上對應的模板即可,
具體演示如下:
方案演示
首先,是包含收件人資訊 label 的 alerts,如下:
[
{
"labels": {
"alertname": "<requiredAlertName>",
"<labelname>": "<labelvalue>",
"email_to": "[email protected],[email protected]",
...
},
"annotations": {
"<labelname>": "<labelvalue>",
},
"startsAt": "<rfc3339>",
"endsAt": "<rfc3339>",
"generatorURL": "<generator_url>"
},
...
]
每個 alert 都提供 email_to 這樣的 label,
然后,在 AlertManager 中,可以設定如下 route 和 receiver, 如下:
global:
smtp_smarthost: 'localhost:25'
smtp_from: '[email protected]'
route:
group_by: [email_to, alertname]
receiver: customer_email
receivers:
- name: customer_email
email_configs:
- to: '{{ .GroupLabels.email_to }}'
headers:
subject: 'Alert: {{ .GroupLabels.alertname }}'
注意,group_by 必須包括 email_to label,這樣它才算 .GroupLabels. 下的一員,
當有 alerts 來時,如 "email_to": "[email protected],[email protected]", 會 route 到 customer_email, 其收件人是 {{ .GroupLabels.email_to }}, 會被模板化為: [email protected],[email protected], 告警郵件自然就會發過去,
完成!??????
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538179.html
標籤:其他
