部署前准备
Prometheus部署

Grafana部署
Webhook集成
from flask import Flask, request
from dateutil import parser
import json
import datetime
import yaml
import os
from gevent.pywsgi import WSGIServer
from ding_talk import *
from log_write import *
deftime_zone_conversion(utctime):
format_time = parser.parse(utctime).strftime('%Y-%m-%dT%H:%M:%SZ')
time_format = datetime.datetime.strptime(format_time, "%Y-%m-%dT%H:%M:%SZ")
return str(time_format + datetime.timedelta(hours=8))
defget_phone_conf(file, phone_name=None, action=0):
"""
:param file: yaml格式的文件类型
:param phone_name: 发送的邮件列表名
:param action: 操作类型,0: 查询收件人的邮件地址列表, 1: 查询收件人的列表名称, 2: 获取邮件账号信息
:return: 根据action的值,返回不通的数据结构
"""
try:
with open(os.path.split(os.path.realpath(__file__))[0]+'/'+file, 'r', encoding='utf-8') as fr:
read_conf = yaml.safe_load(fr)
if action == 0:
for phone in read_conf['phone']:
if phone['name'] == phone_name:
return phone['receive_addr']
else:
print("%s does not match for %s" % (phone_name, file))
else:
print("No recipient address configured")
elif action == 1:
return [items['name'] for items in read_conf['phone']]
elif action == 2:
return read_conf['send']
except KeyError:
print("%s not exist" % phone_name)
exit(-1)
except FileNotFoundError:
print("%s file not found" % file)
exit(-2)
except Exception as e:
raise e
app = Flask(__name__)
@app.route('/show', methods=['POST'])
defdatatest():
try:
prometheus_data = json.loads(request.data)
logger.info(str(request.data,'utf-8'))
return"请观察控制台输出"
except Exception as e:
raise e
@app.route('/webhook', methods=['POST'])
defwebhook():
try:
prometheus_data = json.loads(request.data)
logger.info(str(request.data,'utf-8'))
#print(request.json)
# 时间转换,转换成东八区时间
for k, v in prometheus_data.items():
if k == 'alerts':
for items in v:
# if items['status'] == 'firing':
# items['startsAt'] = time_zone_conversion(items['startsAt'])
# else:
# items['startsAt'] = time_zone_conversion(items['startsAt'])
# items['endsAt'] = time_zone_conversion(items['endsAt'])
#针对每个itemss进行告警通知
team_name = prometheus_data["commonLabels"]["team"]
phone_list = get_phone_conf('config.yaml', phone_name=team_name, action=0)
level = prometheus_data["commonLabels"]["severity"]
data = data_format(items,phone_list,level)
send_ding_talk(data)
return"prometheus monitor"
except Exception as e:
raise e
if __name__ == '__main__':
logger = setup_log('prom_dingtalk.log')
WSGIServer(('0.0.0.0', 5000), app).serve_forever()

本文作者:黄 凭(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




