Alertmanager配置webhook
--时间:2020年7⽉22⽇
--作者:飞翔的⼩胖猪
说明
在prometheus监控中时常会⽤到alertmanager软件进⾏告警信息发送,常见的可以使⽤邮件或对接企业等应⽤实现提⽰信息的推送。在某些特殊情况下alertmanager⽆法对接⽣产环境中的已存在的api,需要⾃定⼀个中间层连接alertmanager和⽤户的应⽤实现特定数据的推送。
⽂档通过使⽤alertmanager软件的webhook功能把信息推送到python编写的api中,然后把接收到的数据进⾏清理筛选出有⽤的数据,按照其他api的数据格式重新整理数据格式并推送给指定的api。
环境准备
提前安装配置好prometheus+alertmanager+consul+node_exporter环境。
准备⼀台安装有python3的服务器
配置详情
alertmanager配置
配置alertmanager软件配置参数。
# l
浏览器json格式化global:
resolve_timeout: 5m
route:
group_by: ['instance']
group_wait: 10s
group_interval: 20s
repeat_interval: 20s
#repeat_interval: 1h
receiver: 'webhook'
receivers:
- name: 'webhook'
webhook_configs:
- url: '192.168.111.1:5000/send'
 参数说明:
group_by:告警组名
group_wait:当收到告警的时候,等待10秒确认时间内是否有新告警,如有则⼀并发送
group_interval:发送前等待时间,配置中设置接收到告警后再等待20秒发送
repeat_interval:重复告警周期时间,由于是测试所以设置⽐较短,在⽣产环境中⼀般设置为1h
receiver:指⽰信息推送给谁,此处设置的值必须在receivers中能够到
webhook_configs:调⽤api的url地址,实验环境使⽤192.168.111.1创建的⼀个api。
python脚本
app1.py:192.168.111.1主机上的python脚本
# -*- coding:utf-8 -*-
from flask import Flask, request
import requests
import json
app1 = Flask(__name__)
'''
脚本功能:从alertmanager获取到json⽂件,然后格式化过后再调⽤其他api进⾏处理。
'''
@ute('/send', methods=['POST'])
def send():
try:
url_test_api = '192.168.111.83:5000/send'#假定这个url为另⼀个应⽤的api
dict1 = dict()  #定义⼀个字典⽤来存放清理过后的数据,最后需要把这个数据推送给其他应⽤
data = json.loads(request.data)  #转换从alertmanager获得的json数据为dict类型
alerts = data['alerts']          #获取key为alerts的数据赋值给变量alerts
dict1['type'] = '监控'#⼿动在dict1中加⼊key为type值为'监控'
for i in alerts:
info = i.get('labels')    #i是⼀个dict类型数据,获取key为labels的数据
#以下内容就是把alertmanager中提取的数据加⼊到我们⾃定义的字典中。
#把数据以dict的⽅式加⼊到dict1的fname key中。 ('instance').split(':')[0]表⽰以:分割截取第⼀段字符串,源字符192.168.111.12:9100  截取后 192.168.111.12,
dict1['fname'] = { '提⽰类型':i.get('status'),'告警信息':('alertname'),"告警节点":('instance').split(':')[0]}
j = json.dumps(dict1)
print("json output",j)
#调⽤api提交信息给短信平台api
r = requests.post(url_test_api,data=j)
#输出调⽤的api的返回信息,⼀般返回200
print("输出调⽤api返回结果")
print(r)
)
print("输出结果完毕。")
except Exception as e:
print(e)
return'ok'
if__name__ == '__main__':
app1.run(debug=False,host='0.0.0.0',port=5000)
View Code
app2.py:192.168.111.83主机上的python脚本
# -*- coding:utf-8 -*-
from flask import Flask, request
import requests
import json
app = Flask(__name__)
'''
脚本功能:从192.168.111.1获取到json⽂件,然原样输出。
'''
@ute('/send', methods=['POST'])
def send():
try:
data = json.loads(request.data)  #转换从alertmanager获得的json数据为dict类型
print(data)
except Exception as e:
print(e)
return'ok'
if__name__ == '__main__':
app.run(debug=False,host='0.0.0.0',port=5000)
View Code
192.168.111.1(api1)端输出结果。由于json模板的__init__.py⽂件中的ensure_ascii值设置为True,则中⽂显⽰为代码,不影响传输。结果返回code为200表⽰调⽤其他api成功。
E:\学习笔记2019-09\k8s\webhook_py\venv\ E:/学习笔记2019-09/k8s/webhook_py/app1.py
* Serving Flask app "app2" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on 0.0.0.0:5000/ (Press CTRL+C to quit)
json output {"type": "\u76d1\u63a7", "fname": {"\u63d0\u793a\u7c7b\u578b": "firing", "\u544a\u8b66\u4fe1\u606f": "InstanceDown", "\u544a\u8b66\u8282\u70b9": "192.168.111.12"}} 192.168.111.83 - - [22/Jul/2020 16:58:28] "POST /send HTTP/1.1" 200 -
输出调⽤api返回结果
<Response [200]>
ok
输出结果完毕。
192.168.111.85(api2)端输出结果,在192.168.111.85端能够正常收到对端传过来的数据。
[root@prometheus prometheus]# python3 app2.py
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on 0.0.0.0:5000/ (Press CTRL+C to quit)
{'type': '监控', 'fname': {'提⽰类型': 'firing', '告警信息': 'InstanceDown', '告警节点': '192.168.111.12'}}
192.168.111.1 - - [22/Jul/2020 17:02:52] "POST /send HTTP/1.1" 200 -
调⽤其他api时出现如下信息,有可能是你的json模板设置问题。确认下json模板的__init__.py⽂件中的ensure_ascii值是否为True,如果不为True 则需要修改为True。
'latin-1' codec can't encode characters in position 10-11: Body ('监控') is not valid Latin-1. de('utf-8') if you want to send it encoded in UTF-8.
json的__init__.py⽂件位置:
win:  d:/python安装⽬录/Lib/json/__init__.py
linux:  /python安装⽬录//lib/python3.8/json/__init__.py
_default_encoder = JSONEncoder(
skipkeys=False,
ensure_ascii=True,
#ensure_ascii=False,
check_circular=True,
allow_nan=True,
indent=None,
separators=None,
default=None,
)
alertmanager原始json⽂件
在192.168.111.1接收到的原始json⽂件格式,⽤户可以根据⾃⼰的需求使⽤key获取特定的数据。
{
'receiver': 'webhook',
'status': 'firing',
'alerts': [
{'status': 'firing',
'labels': {'alertname': 'InstanceDown',
'instance': '192.168.111.12:9100',
'job': 'consul_111_83',
'severity': 'critical'},
'annotations':
{'description': 'Host 192.168.111.12:9100 Down',
'summary': 'Host 192.168.111.12:9100 of consul_111_83 is  Down !!!'},
'startsAt': '2020-07-22T08:41:22.633075734Z',
'endsAt': '0001-01-01T00:00:00Z',
'generatorURL': 'prometheus.server:9090/pr=up%7Binstance%3D~%2210%7C80%7C192.%2A%22%7D+%3D%3D+0&g0.tab=1',
'fingerprint': 'c33ac30fed829472'}],
'groupLabels': {'instance': '192.168.111.12:9100'},
'commonLabels': {'alertname': 'InstanceDown',
'instance': '192.168.111.12:9100',
'job': 'consul_111_83', 'severity': 'critical'},
'commonAnnotations':
{'description': 'Host 192.168.111.12:9100 Down',
'summary': 'Host 192.168.111.12:9100 of consul_111_83 is  Down !!!'},
'externalURL': 'prometheus.server:9093',
'version': '4',
'groupKey': '{}:{instance="192.168.111.12:9100"}',
'truncatedAlerts': 0
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。