--时间:2020年7月22日

--作者:飞翔的小胖猪

在prometheus监控中时常会用到alertmanager软件进行告警信息发送,常见的可以使用邮件或对接企业微信等应用实现提示信息的推送。在某些特殊情况下alertmanager无法对接生产环境中的已存在的api,需要自定一个中间层连接alertmanager和用户的应用实现特定数据的推送。

文档通过使用alertmanager软件的webhook功能把信息推送到python编写的api中,然后把接收到的数据进行清理筛选出有用的数据,按照其他api的数据格式重新整理数据格式并推送给指定的api。

环境准备

提前安装配置好prometheus+alertmanager+consul+node_exporter环境。

准备一台安装有python3的服务器

配置详情

alertmanager配置

配置alertmanager软件配置参数。

# vim alertmanager.yml

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: 'http://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进行处理。
'''
@app1.route('/send', methods=['POST'])
def send():
 try:
  url_test_api = 'http://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中。 info.get('instance').split(':')[0]表示以:分割截取第一段字符串,源字符192.168.111.12:9100  截取后 192.168.111.12,
   dict1['fname'] = { '提示类型':i.get('status'),'告警信息':info.get('alertname'),"告警节点":info.get('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(r.text)
   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

相关文章: