用flask写一个webhook

#!/bin/python
# coding:utf-8
import json
import sys
import base64
import requests
from flask import Flask,request
from sendmsg import dingding,email,message,phone
import logging
from datetime import datetime,timedelta
import time
import yaml
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

app = Flask(__name__)
prometheus_url = 'http://10.250.100.1:9999/api/v1/query'
logging.basicConfig(format='%(message)s',filename="alert.log",level=logging.INFO)

def duration(start,end):
    start = datetime.strptime(start,"%Y-%m-%d %H:%M:%S")
    #print("start:",start)
    end = datetime.strptime(end,"%Y-%m-%d %H:%M:%S")
    cost = end - start
    return '%.2f'%(cost.seconds/60/60)

def gmt2asia(t):
    gmt_format = "%Y-%m-%dT%H:%M:%S.%fZ"
    asia_format = "%Y-%m-%d %H:%M:%S"
    asia_time = datetime.strptime(t,gmt_format)+timedelta(hours=8)
    return asia_time.strftime(asia_format)

def get_receivers(department,business):
    label = department+"-"+business
    with open("receivers.yaml","r",encoding="utf-8") as f:
        data = yaml.load(f,Loader=yaml.FullLoader)
        receivers = ",".join(data[label])
    return receivers

def excute_promql(promql,alert_name):
    #print("promql:",promql)
    try:
      response = requests.get(prometheus_url,params={'query':promql},timeout=30)
      if response.status_code == 200:
         result = response.json()
         if alert_name == "live":
             if result["data"]["result"]  == []:
                  value = "启动"
                  return value
         #print("result:",result)
         value = result['data']["result"][0]["value"][1]
         return value
    except requests.exceptions.Timeout:
               logging.error("请求超时")
    except requests.exceptions.RequestException as e:
               logging.error("请求异常:", str(e))

def get_resolved_value(alert_name,query,serverip,**kwargs):
    if alert_name == "disk":
        mountpoint = kwargs.get("mountpoint")
        print(query)
        promql = query%(mountpoint,serverip,mountpoint,serverip)
        value = excute_promql(promql,alert_name)
        return  str(value)+"%"
    
    if alert_name == "mem":
        promql = query%(serverip,serverip)
        value = excute_promql(promql,alert_name)
        return  str(value)+"%"

    if alert_name == "cpu": 
        promql = query%(serverip)
        value = excute_promql(promql,alert_name)
        return  str(value)+"%"

    if alert_name == "down":
        value = "启动"
        return value

    if alert_name == "receive"  or  alert_name == "transmit":
       promql = query%(serverip)
       value = excute_promql(promql,alert_name)
       return str(value)+"MB/s"
 
    if alert_name == "tcp_conn_num":
       promql = query%(serverip)
       value = excute_promql(promql,alert_name)
       return value

def send_alert(alert):
    status = alert.get("status")
    department=alert.get("labels").get("department")
    mountpoint=alert.get("labels").get("mountpoint")
    business=alert.get("labels").get("business")
    label_dp=alert.get("labels").get("label_dp")
    label_bu=alert.get("labels").get("label_bu")
    hostname=alert.get("labels").get("hostname")
    serverip=alert.get("labels").get("serverip")
    firing_time = gmt2asia(alert.get("startsAt"))
    alert_name = alert.get("labels").get("alertname")
    receivers = get_receivers(department,business)
    info=alert.get("annotations").get("info")
    query = alert.get("annotations").get("query")
    if status == "firing":
        firing_level=alert.get("labels").get("severity")
        firing_value=alert.get("annotations").get("value")
        if  alert_name == "down":
            firing_value = "停止"
        #if alert_name in ["cpu","mem","disk"]:
        #    firing_value=alert.get("annotations").get("value") + "%"
        #else:
        #    firing_value=alert.get("annotations").get("value")

        firing_content="[普罗米修斯监控] 发生告警\n部门: %s\n业务: %s\n主机名: %s\n主机IP: %s\n报警时间: %s\n报警等级: %s\n报警条件: %s\n当前状态: %s"%(label_dp,label_bu,hostname,serverip,firing_time,firing_level,info,firing_value)
        return firing_content,receivers
  
    if status == "resolved":
        resolved_value= get_resolved_value(alert_name,query,serverip,mountpoint=mountpoint)
        resolved_time=gmt2asia(alert.get("endsAt"))
        duration_time = str(duration(firing_time,resolved_time))+"小时"
        resolved_content="[普罗米修斯监控] 恢复正常\n部门: %s\n业务: %s\n主机名: %s\n主机IP: %s\n恢复时间:  %s\n持续时间: %s\n报警条件: %s\n当前状态: %s "%(label_dp,label_bu,hostname,serverip,resolved_time,duration_time,info,resolved_value)
        return resolved_content,receivers

@app.route('/webhook',methods=['POST'])
def webhook():
    #获取alertmanager抛过来的数据,json格式,转为dict类型
    data=json.loads(request.data) 
    alerts=data.get("alerts")
    for alert in alerts:
        try:
          content,receivers=send_alert(alert)
          res_dingding=dingding(content,receivers)
          res_phone=phone(content)
          logging.info("\n" + content + "\n")
          logging.info(receivers + "\n")
        except Exception as err:
          logging.error("error:",str(err))
    return "OK"

if __name__ == '__main__':
    app.run(host='127.0.0.1',port=5000,debug=True)

  

posted @ 2025-02-10 16:12  羊脂玉净瓶  阅读(17)  评论(0)    收藏  举报