上一篇(http://www.itdecent.cn/p/b15217e8f24f
)文章簡單介紹了監(jiān)控神器prometheus的安裝、配置、可視化等的使用。這篇我們來講講報警。
我們先簡單回顧下prometheus的功能和原理。

從上圖可以看出通過各種exporter采集數(shù)據(jù)后,prometheus把各種metrics(指標(biāo))統(tǒng)一pull到時間序列數(shù)據(jù)庫中后,我們可以在可視化平臺比如grafana顯示后,如果有某些指標(biāo)有異??梢园旬惓P畔ush推送給 alertmanager報警平臺,報警平臺進(jìn)行處理后notify通知給指定的通道和指定的人。
這時候該Alertmanager報警平臺登場了。
一、 Prometheus Alertmanager報警平臺簡介
報警在Prometheus的架構(gòu)中被劃分成兩個獨立的部分。如下圖,通過在Prometheus中定義AlertRule(告警規(guī)則),Prometheus會周期性的對告警規(guī)則進(jìn)行計算,如果滿足告警觸發(fā)條件就會向Alertmanager推送報警信息。

Alertmanager作為一個獨立的組件,負(fù)責(zé)接收并處理來自Prometheus Server,當(dāng)然也可以是其它的客戶端程序的告警信息。Alertmanager可以對這些告警信息進(jìn)行進(jìn)一步的處理,比如當(dāng)接收到大量重復(fù)告警時能夠消除重復(fù)的告警信息,同時對告警信息進(jìn)行分組并且分發(fā)到通知通道。Alertmanager幾個通道:
- 郵件
- HipChat
- OpsGenie
- Slack (國外很火)
- wechat(微信,由于微信的現(xiàn)在僅限微信企業(yè)號)
- Webhook
當(dāng)然Alertmanager不可能集成所有的通道,但是通過Webhook可以二次開發(fā)以支持更多定制化的場景。
例如,目前Alertmanager還不支持釘釘,那用戶完全可以通過Webhook與釘釘機(jī)器人進(jìn)行集成,從而通過釘釘接收告警信息。
已經(jīng)有好人心實現(xiàn)了釘釘?shù)膚ebhook:https://github.com/timonwong/prometheus-webhook-dingtalk
Alertmanager特性
AlertManager 貼心的提供了報警分組去重、靜默和告警抑制機(jī)制來對告警通知行為進(jìn)行優(yōu)化,比如升級系統(tǒng)需要兩個小時,那么這兩個小時就不需要對該系統(tǒng)的下線進(jìn)行煩人的報警了,這個時候在AlertManager的WebUI上可以對該報警進(jìn)行靜默。下面對Alertmanager特性進(jìn)行更細(xì)致的介紹。
1. 分組和去重
在某些情況下,比如由于系統(tǒng)宕機(jī)導(dǎo)致大量的告警被同時觸發(fā),在這種情況下分組機(jī)制可以將這些被觸發(fā)的告警合并為一個告警通知,避免一次性接受大量的告警通知。
2. 抑制(Inhibition)
Inhibition字面上翻譯是:抑制,但是從意思來講:收斂這個詞會更好(但是收斂其實已經(jīng)包含了前面講的分組和去重)。
Inhibition是指當(dāng)某一告警發(fā)出后,可以停止重復(fù)發(fā)送由此告警引發(fā)的其它告警的機(jī)制。
例如,當(dāng)集群不可訪問時觸發(fā)了一次告警,通過配置Alertmanager可以忽略與該集群有關(guān)的其它所有告警。這樣可以避免接收到大量與實際問題無關(guān)的告警通知。
3. 靜默
靜默提供了一個簡單的機(jī)制可以快速根據(jù)標(biāo)簽對告警進(jìn)行靜默處理。如果接收到的告警符合靜默的配置,Alertmanager則不會發(fā)送告警通知。例如上面提到的系統(tǒng)升級場景。
4. 告警延時
假設(shè)系統(tǒng)發(fā)生故障產(chǎn)生告警,每分鐘發(fā)送一條告警消息,這樣的告警信息十分令人崩潰。當(dāng)然貼心的prometheus也為你想到了。Alertmanager提供第一個參數(shù)是repeat_interval,可以將重復(fù)的告警以更大頻率發(fā)送。
不過對于告警延,需要和兩個參數(shù)配合起來使用
- 解決告警不能及時收到。假設(shè)當(dāng)前發(fā)送一條告警,下一次告警在一個小時之后,但在這一個小時之內(nèi)系統(tǒng)產(chǎn)生了一條告警,這時告警無法被及時發(fā)出去。alertmanager提供了第二個參數(shù)group_inteval,讓報警能夠及時的發(fā)送出去。
- 另一個問題,當(dāng)故障發(fā)生時,告警條件一個個被滿足,到達(dá)Alertmanager的順序也分先后,所以在最開始的時候可能收到多個消息。Alertmanager提供了第三個參數(shù)叫做group_wait,在一個分組收到第一條報警消息之后,通過等到group wait,把故障最開始發(fā)生時候產(chǎn)生告警收斂掉,最后作為一條消息發(fā)送出來。
啰嗦了這么多,相信你已經(jīng)迫不及待要開始安裝試用了。那我們開始吧。
二、AlertManager安裝配置
安裝
Alertmanager最新版本的下載地址可以從Prometheus官方網(wǎng)站https://prometheus.io/download/獲取。
下載完成后,執(zhí)行tar命令解壓即可
tar -xzvf alertmanager-$VERSION.darwin-amd64.tar.gz
Alertmanager解壓后會包含一個默認(rèn)的alertmanager.yml配置文件,修改內(nèi)容:
global:
resolve_timeout: 5m
smtp_from: 'xxx@xxx.com'
smtp_smarthost: 'smtp.exmail.qq.com:465'
smtp_auth_username: 'xxx@xxx.com'
smtp_auth_password: 'xxx'
smtp_require_tls: false
smtp_hello: 'Alert'
templates:
- 'template/*.tmpl'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 10m
receiver: 'email.tech'
receivers:
- name: 'email.tech'
webhook_configs:
- url: 'http://127.0.0.1:8060/dingtalk/tech1/send' ## dingding webhook
send_resolved: true
email_configs:
- to: 'userxxx1@xxx.com,user2xxxx@xxx.com' # 多個用戶用逗號隔開
headers: {Subject: "異常報警"}
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
簡單對上面的配置做下解釋
Alertmanager的配置主要包含兩個部分:
- 路由(route)
- 接收器(receivers)。
所有的告警信息都會從配置中的頂級路由(route)進(jìn)入路由樹,根據(jù)路由規(guī)則將告警信息發(fā)送給相應(yīng)的接收器。在配置文件中使用route定義了頂級的路由,路由是一個基于標(biāo)簽匹配規(guī)則的樹狀結(jié)構(gòu)。所有的告警信息從頂級路由開始,根據(jù)標(biāo)簽匹配規(guī)則進(jìn)入到不同的子路由,并且根據(jù)子路由設(shè)置的接收器發(fā)送告警。
啟動
由于golang的特性,啟動Alertmanager很簡單。進(jìn)行剛剛解壓后的文件夾中,執(zhí)行
./alertmanager --config.file=alertmanager.yml
關(guān)聯(lián)Prometheus Server與Alertmanager
前面的架構(gòu)圖中已經(jīng)說明,Alertmanager是獨立的組件,告警信息通過Prometheus Server 推送過來。所以需要做Prometheus Server中配置關(guān)聯(lián)以及告警規(guī)則。當(dāng)然也很簡單。
編輯Prometheus配置文件prometheus.yml,并添加以下內(nèi)容:
rule_files:
- /etc/prometheus/rules/*.rules.yml #告警規(guī)則文件存放目錄
alerting:
alertmanagers:
- static_configs:
targets: ['localhost:9093'] #Alertmanager和Prometheus Server部署在同一臺主機(jī)
添加告警規(guī)則文件
例如,vi /etc/prometheus/rules/load_over1.rules.yml,添加一個load1超過3就告警的規(guī)則
groups:
- name: load1
rules:
- alert: Load1Over
expr: (node_load1)> 3
for: 30s
labels:
user: root
annotations:
summary: '【預(yù)警】{{$labels.instance}}:load1>3'
description: '{{$labels.instance}}: 【預(yù)警】load1 大于3 (current value is:{{$value }})'
接收報警信息
筆者按照上面的配置收到的報警示例如下(釘釘?shù)膚ebhook請查看github安裝指引)
1,郵件報警

2,釘釘報警

三、總結(jié)
當(dāng)故障發(fā)生時,能夠即時獲取到異常結(jié)果我們要用監(jiān)控系統(tǒng)的最主要的目的之一。通過Prometheus提供的告警以及告警處理能力,通過內(nèi)置的告警通知能力,能過幫助用戶快速實現(xiàn)告警的通知。同時其還提供了簡單有效的擴(kuò)展方式,讓用戶可以基于Prometheus的告警處理模式實現(xiàn)更多的定制化需求。
當(dāng)然筆者這篇文章寫的比較簡單,還有很多高級特性沒有介紹,比如模板等,期待聰明的你自行更深入去理解吧。