天天看點

Python編寫告警資訊,整合Alertmanager告警

Python編寫告警資訊,整合Alertmanager告警

 Alertmanager告警 系統整合

流程

(1)監控端,可以使用Python 或者 shell 進行監控,把 相關的json資料推送到Alertmanager

(2)Alertmanager端 進行 彙總,發送,後續可以靜默,抑制等功能

(3)把告警的資料發送到prometheusalert,進行釘釘的發送

環境

軟體

​​prometheusalert 告警系統​​ :主要是資料的各個管道發送

​​Alertmanager 告警處理​​:主要彙總資料,抑制,靜默

思路

編寫告警測試資料時,我們可以不用生成時間,僅生成相關的告警名額,時間程式會幫忙生成(待測試)

步驟

擷取Alertmanager資料格式

方法,通過flask 編寫接口,Alertmanager配置,告警時回把資料發送到此接口 ,進行展示檢視

from flask import Flask, request
import json

app = Flask(__name__)


@app.route("/send/", methods=["POST"])
def send():
    try:
        data = json.loads(request.data)
        print(data)
        alerts = data['alerts']
        for i in alerts:
            print('SEND SMS: ' + str(i))
    except Exception as e:
        print(e)
    return 'ok'


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8082)      

在Alertmanager配置

[root@prometheus-server alertmanager-0.24.0.linux-amd64]# cat alertmanager.yml
global:
  resolve_timeout: 5m
route:
  group_by: ['instance']
  group_wait: 30s
  group_interval: 10s
  repeat_interval: 10m
  receiver: 'web.hook.prometheusalert'
receivers:
- name: 'web.hook.prometheusalert'
  webhook_configs:
   - url: http://192.168.96.19:8082/send/      

産生prometheus的測試資料

關閉用戶端,産生告警 

Python編寫告警資訊,整合Alertmanager告警

告警資料

{
  'receiver': 'web\\.hook\\.prometheusalert',
  'status': 'firing',
  'alerts': [{
    'status': 'firing',
    'labels': {
      'alertname': '主機存活狀态警告!',
      'cloud': '乘風-Dev環境',
      'instance': '192.168.82.105:9100',
      'job': 'node_exporter',
      'severity': '非常嚴重',
      'team': 'ops'
    },
    'annotations': {
      'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
      'summary': '192.168.82.105:9100:伺服器當機'
    },
    'startsAt': '2022-07-05T05:54:37.452Z',
    'endsAt': '0001-01-01T00:00:00Z',
    'generatorURL': 'http://prometheus-server.0101101300.fjf:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1',
    'fingerprint': '4a890f7c225c3bef'
  }],
  'groupLabels': {
    'instance': '192.168.82.105:9100'
  },
  'commonLabels': {
    'alertname': '主機存活狀态警告!',
    'cloud': '乘風-Dev環境',
    'instance': '192.168.82.105:9100',
    'job': 'node_exporter',
    'severity': '非常嚴重',
    'team': 'ops'
  },
  'commonAnnotations': {
    'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
    'summary': '192.168.82.105:9100:伺服器當機'
  },
  'externalURL': 'http://prometheus-server.0101101300.fjf:9093',
  'version': '4',
  'groupKey': '{}:{instance="192.168.82.105:9100"}',
  'truncatedAlerts': 0
}      

有用的告警資料

{
    'status': 'firing',
    'labels': {
      'alertname': '主機存活狀态警告!',
      'cloud': '乘風-Dev環境',
      'instance': '192.168.82.105:9100',
      'job': 'node_exporter',
      'severity': '非常嚴重',
      'team': 'ops'
    },
    'annotations': {
      'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
      'summary': '192.168.82.105:9100:伺服器當機'
    },
    'startsAt': '2022-07-05T05:54:37.452Z',
    'endsAt': '0001-01-01T00:00:00Z',
    'generatorURL': 'http://prometheus-server.0101101300.fjf:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1',
    'fingerprint': '4a890f7c225c3bef'
  }      

恢複資料

{
  'receiver': 'web\\.hook\\.prometheusalert',
  'status': 'resolved',
  'alerts': [{
    'status': 'resolved',
    'labels': {
      'alertname': '主機存活狀态警告!',
      'cloud': '乘風-Dev環境',
      'instance': '192.168.82.105:9100',
      'job': 'node_exporter',
      'severity': '非常嚴重',
      'team': 'ops'
    },
    'annotations': {
      'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
      'summary': '192.168.82.105:9100:伺服器當機'
    },
    'startsAt': '2022-07-05T05:54:37.452Z',
    'endsAt': '2022-07-05T05:56:52.452Z',
    'generatorURL': 'http://prometheus-server.0101101300.fjf:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1',
    'fingerprint': '4a890f7c225c3bef'
  }],
  'groupLabels': {
    'instance': '192.168.82.105:9100'
  },
  'commonLabels': {
    'alertname': '主機存活狀态警告!',
    'cloud': '乘風-Dev環境',
    'instance': '192.168.82.105:9100',
    'job': 'node_exporter',
    'severity': '非常嚴重',
    'team': 'ops'
  },
  'commonAnnotations': {
    'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
    'summary': '192.168.82.105:9100:伺服器當機'
  },
  'externalURL': 'http://prometheus-server.0101101300.fjf:9093',
  'version': '4',
  'groupKey': '{}:{instance="192.168.82.105:9100"}',
  'truncatedAlerts': 0
}      

有用的恢複資料

{
    'status': 'resolved',
    'labels': {
      'alertname': '主機存活狀态警告!',
      'cloud': '乘風-Dev環境',
      'instance': '192.168.82.105:9100',
      'job': 'node_exporter',
      'severity': '非常嚴重',
      'team': 'ops'
    },
    'annotations': {
      'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
      'summary': '192.168.82.105:9100:伺服器當機'
    },
    'startsAt': '2022-07-05T05:54:37.452Z',
    'endsAt': '2022-07-05T05:56:52.452Z',
    'generatorURL': 'http://prometheus-server.0101101300.fjf:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1',
    'fingerprint': '4a890f7c225c3bef'
  }      

Python發送告警資料

發送告警資訊

import json
import requests

new_packinf = [{
        'status': 'firing',
        'labels': {
            'alertname': '主機存活狀态警告!',
            'cloud': '乘風小貸-Dev環境',
            'instance': '192.168.82.105:9100',
            'job': 'node_exporter',
            'severity': '非常嚴重',
            'team': 'ops'
        },
        'annotations': {
            'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
            'summary': '192.168.82.105:9100:伺服器當機'
        },
        'startsAt': '2022-07-05T05:54:37.452Z',
        'endsAt': '0001-01-01T00:00:00Z',
        'generatorURL': 'http://prometheus-server.0101101300.fjf:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1',
        'fingerprint': '4a890f7c225c3bef'
    }]
jsons = json.dumps(new_packinf)
url = "http://192.168.82.105:9093/api/v2/alerts"
headers = {'Content-Type': 'application/json'}
responses = requests.post(url=url, headers=headers, data=jsons)
print(responses.status_code, responses.url)
# print(responses.json())      
Python編寫告警資訊,整合Alertmanager告警
Python編寫告警資訊,整合Alertmanager告警

 發送恢複告警資訊

import json
import requests

new_packinf = [{
        'status': 'resolved',
        'labels': {
            'alertname': '主機存活狀态警告!',
            'cloud': '乘風-Dev環境',
            'instance': '192.168.82.105:9100',
            'job': 'node_exporter',
            'severity': '非常嚴重',
            'team': 'ops'
        },
        'annotations': {
            'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
            'summary': '192.168.82.105:9100:伺服器當機'
        },
        'startsAt': '2022-07-05T05:54:37.452Z',
        'endsAt': '2022-07-05T05:56:52.452Z',
        'generatorURL': 'http://prometheus-server.0101101300.fjf:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1',
        'fingerprint': '4a890f7c225c3bef'
    }]
jsons = json.dumps(new_packinf)
url = "http://192.168.82.105:9093/api/v2/alerts"
headers = {'Content-Type': 'application/json'}
responses = requests.post(url=url, headers=headers, data=jsons)
print(responses.status_code, responses.url)
# print(responses.json())      
import json
import requests
import time

year_time = time.strftime('%Y-%m-%d', time.localtime())
now_time = time.strftime('%H:%M:%S', time.localtime())
start_time = year_time + "T" + now_time + ".000+08:00"
is_end_time = False
if is_end_time:
    print("告警未解決")
    end_time = '0001-01-01T00:00:00Z'
else:
    print("告警已經解決")
    end_time = start_time
new_packinf = [{
    'labels': {
        'alertname': '主機存活狀态警告!',
        'cloud': '小貸-Dev環境',
        'instance': '192.168.82.105:9100',
        'job': 'node_exporter',
        'severity': '非常嚴重',
        'team': 'ops'
    },
    'annotations': {
        'description': '192.168.82.105:9100:伺服器延時超過5分鐘',
        'summary': '192.168.82.105:9100:伺服器當機'
    },
    'endsAt': end_time,
}]
jsons = json.dumps(new_packinf)
url = "http://192.168.82.105:9093/api/v2/alerts"
headers = {'Content-Type': 'application/json'}
responses = requests.post(url=url, headers=headers, data=jsons)
print(responses.status_code, responses.url)
# print(responses.json())      

釘釘告警模闆

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
{{if eq $v.status "resolved"}}
#### [Prometheus恢複資訊]({{$v.generatorURL}})

##### <font color="#02b340">告警名稱</font>:[{{$v.labels.alertname}}]({{$var}})
##### <font color="#02b340">告警級别</font>:{{$v.labels.severity}}
##### <font color="#02b340">開始時間</font>:{{TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
##### <font color="#02b340">結束時間</font>:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
##### <font color="#02b340">執行個體位址</font>:{{$v.labels.instance}}
##### <font color="#02b340">主機名稱</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{else}}
#### [Prometheus告警資訊]({{$v.generatorURL}})

##### <font color="#FF0000">告警名稱</font>:[{{$v.labels.alertname}}]({{$var}})
##### <font color="#FF0000">告警級别</font>:{{$v.labels.severity}}
##### <font color="#FF0000">開始時間</font>:{{ TimeFormat $v.startsAt "2006-01-02 15:04:05"}}
##### <font color="#FF0000">結束時間</font>:{{TimeFormat $v.endsAt "2006-01-02 15:04:05"}} 
##### <font color="#FF0000">執行個體位址</font>:{{$v.labels.instance}}
##### <font color="#FF0000">主機名稱</font>:{{$v.labels.hostname}}

**{{$v.annotations.description}}**
{{end}}
{{ end }}
{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg =  print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[*** 點我屏蔽該告警]({{$var}}/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)