前面幾個篇幅,咱們介紹了alertmanger報警配置,在實際運維過程當中,咱們都會遇到,報警的重複發送,以及報警信息關聯性報警。接下來咱們就介紹下經過alertmanger對告警信息的收斂。
1、告警分組(Grouping)
1.1 定義三個報警規則:node
文中爲了實驗驗證,告警值設置比較小,實際生產中,應該跟據業務的實際使用場景,來肯定合理的告警值vim
[root@prometheus-server ~]# vim /etc/prometheus/rules/node_alerts.yml groups: - name: node_alerts rules: - alert: InstanceDown expr: up{job='node'} == 0 for: 2m labels: severity: "critical" env: dev annotations: summary: Host {{ $labels.instance }} of {{ $labels.job }} is Down! - alert: OSLoad expr: node_load1 > 1 for: 2m labels: severity: "warning" env: dev annotations: summary: "主機 {{ $labels.instance }} 負載大於 1" description: "當前值: {{ $value }}" - alert: HightCPU expr: 100-avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by(instance)*100 > 10 for: 2m labels: severity: "warning" annotations: summary: "主機 {{ $labels.instance }} of CPU 使用率大於10%!" description: "當前值: {{ $value }}%"
以上3個報警規則,node_alerts是監控node_exporter服務狀態,OSLoad是監控系統負載,HightCPU是監控系統cpu使用率,前兩個有標籤env: dev,後面2個有標籤 severity: "warning",重啓Prometheus服務,能夠看到監控規則已經加載
服務器
1.2 定義alertmanager報警組:網絡
[root@prometheus-server ~]# vim /etc/alertmanager/alertmanager.yml
global: smtp_smarthost: 'smtp.163.com:25' smtp_from: '****@163.com' smtp_auth_username: '****@163.com' smtp_auth_password: '****' ## 受權碼 smtp_require_tls: false route: group_by: ['env'] ### 以標籤env分組,擁有labels爲env的規則,若是在指定時間同時報警,報警信息會合併爲一條進行發送 group_wait: 10s ### 組報警等待,等待該組中有沒有其它報警
group_interval: 30s ### 組報警時間間隔 repeat_interval: 2m ### 重複報警時間,這個生產中跟據服務選擇合適的時間 receiver: dev-mail ## 接收者 receivers: - name: 'dev-mail' ## 對應上面的接收者 email_configs: - to: '****@vanje.com.cn'
1.3 驗證併發
咱們停掉一臺主機node_exporter(10.10.0.12)服務,用壓測工具使某一臺機器(10.10.0.11)負載大於1,cpu使用率(10.10.0.11)大於10,看下報警郵件是否會按咱們定義組進行報警:運維
雖然咱們同時觸發了三個報警,可是跟據咱們的定義,應該只會發兩條報警信息,由於擁有env標籤的報警規則,同時報警,會被合併爲一條發送。工具
觸發報警查看Prometheus ui界面上的alerts:ui
等2分鐘後,若是檢測到機器仍是處於觸發告警狀態,Prometheus把會告警信息發送至alertmanager,而後跟據報警定義進行郵件報警:spa
上圖從alertmanager報警界面能夠看到,報警信息已經按照分組合並,接下來咱們看下郵箱中報警信息:3d
分組總結:
一、alertmanager跟據標籤進行分組時,應該選擇合適的標籤,標籤能夠自定義,也可使用默認的標籤。
二、alertmanager報警分組,能夠有效減小告警郵件數,可是僅是在同一個時間段報警,同一個組的告警信息纔會合併發送。
2、告警抑制(Inhibition)
2.1 修改Prometheus 報警規則文件,爲報警信息添加新標籤area: A
[root@prometheus-server ~]# vim /etc/prometheus/rules/node_alerts.yml groups: - name: node_alerts rules: - alert: InstanceDown expr: up{job='node'} == 0 for: 2m labels: severity: "critical" env: dev area: A annotations: summary: Host {{ $labels.instance }} of {{ $labels.job }} is Down! - alert: OSLoad expr: node_load1 > 0.6 for: 2m labels: severity: "warning" env: dev area: A annotations: summary: "主機 {{ $labels.instance }} 負載大於 1" description: "當前值: {{ $value }}" - alert: HightCPU expr: 100-avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by(instance)*100 > 10 for: 2m labels: severity: "warning" area: A annotations: summary: "主機 {{ $labels.instance }} of CPU 使用率大於10%!" description: "當前值: {{ $value }}%"
2.2 修改alertmanager配置文件
[root@prometheus-server ~]# vim /etc/alertmanager/alertmanager.yml
## 新增如下配置
inhibit_rules: - source_match: ## 源報警規則 severity: 'critical' target_match: ## 抑制的報警規則 severity: 'warning' equal: ['area'] ## 須要都有相同的標籤及值,不然抑制不起做用
2.3 驗證
跟上面同樣手動觸發三個規則告警,跟據定義規則,應該只會收到一條報警信息:
查看Prometheus告警都已經觸發,狀態變爲PENDING狀態
等待2分鐘後, 三個告警狀態由PENDING 變爲 FIRING,同時prometheus會把告警信息發給alertmanager。
Alertmanager中咱們只看到一條InstanceDown報警信息。
查看郵件中,也只收到InstanceDown的報警,另外2條報警已經被配置的抑制規則,把報警信息忽略掉。
抑制總結:
一、抑制是指當警報發出後,中止重複發送由此警報引起其餘錯誤的警報的機制。(好比網絡不可達,服務器宕機等災難性事件致使其餘服務鏈接相關警報);
二、配置抑制規則,須要合理源規則及須要抑制的規則;
三、源規則與抑制規則須要具備相同的標籤及標籤值;