小團(tuán)隊從0搭建devOPS平臺-Alertmanager報警平臺

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

我們先簡單回顧下prometheus的功能和原理。


prometheus總體架構(gòu)圖.png

從上圖可以看出通過各種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架構(gòu)圖.png

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,郵件報警


郵件報警.png

2,釘釘報警


釘釘報警.png

三、總結(jié)

當(dāng)故障發(fā)生時,能夠即時獲取到異常結(jié)果我們要用監(jiān)控系統(tǒng)的最主要的目的之一。通過Prometheus提供的告警以及告警處理能力,通過內(nèi)置的告警通知能力,能過幫助用戶快速實現(xiàn)告警的通知。同時其還提供了簡單有效的擴(kuò)展方式,讓用戶可以基于Prometheus的告警處理模式實現(xiàn)更多的定制化需求。

當(dāng)然筆者這篇文章寫的比較簡單,還有很多高級特性沒有介紹,比如模板等,期待聰明的你自行更深入去理解吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Prometheus Alertmanager 概述 Alertmanager與Prometheus是相互分離的兩...
    YichenWong閱讀 29,226評論 1 9
  • 主機(jī)數(shù)據(jù)收集 主機(jī)數(shù)據(jù)的采集是集群監(jiān)控的基礎(chǔ);外部模塊收集各個主機(jī)采集到的數(shù)據(jù)分析就能對整個集群完成監(jiān)控和告警等功...
    梅_梅閱讀 6,798評論 0 7
  • 什么是Prometheus? Prometheus是由SoundCloud開發(fā)的開源監(jiān)控報警系統(tǒng)和時序列數(shù)據(jù)庫(T...
    dreamer_lk閱讀 3,599評論 1 2
  • 有一位單身女子剛搬了家,她發(fā)現(xiàn)隔壁住了一戶窮人家,一個寡婦與兩個小孩子。有天晚上,那一帶忽然停了電,那位女...
    林深偶見鹿閱讀 384評論 0 2
  • 去過那么多地方,尤以古鎮(zhèn)居多。 其中印象最深的是平遙,而平遙城里最值得稱道的不是明清古居、晉商風(fēng)貌,恰恰是最平凡、...
    Mr張觀瀾閱讀 785評論 2 11

友情鏈接更多精彩內(nèi)容