当前位置: 首页 > news >正文

Prometheus的告警数据上传指定api接口

当某项目上有两套同样类型的系统,便会产生数据对接的问题
以下是一个监控的对接

#!/usr/bin/env python3# -*- coding: utf-8 -*-""" Prometheus Alertmanager Webhook 服务 用于接收告警并转发到指定api接口 """importhttp.serverimportjsonimportrequestsimporttimeimportdatetimeimportosimportloggingfromtypingimportDict,Any# --- 配置区:全部从环境变量读取 ---PORT=int(os.getenv('WEBHOOK_PORT','5000'))BK_URL=os.getenv('BK_URL','http://itom.chinalife.com.hk/t/devops-tools/yunxiao_alarm_data_cleaning/')ALARM_AUTH=os.getenv('ALARM_AUTH','df7b29a28eec37c8d572c0ebdbbbe27e')ALARM_CHANNEL=os.getenv('ALARM_CHANNEL','云效系统')bk_obj_id=os.getenv('bk_obj_id','host')#ALARM_BIZ = os.getenv('ALARM_BIZ', 'HK-OneLife')# 日志级别LOG_LEVEL=os.getenv('LOG_LEVEL','INFO').upper()# 告警级别映射LEVEL_MAP={"critical":"fatal","warning":"warning","info":"remind"}# --- 配置日志系统 ---logging.basicConfig(level=getattr(logging,LOG_LEVEL),format='%(asctime)s - %(levelname)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')logger=logging.getLogger('Webhook')classWebhookHandler(http.server.BaseHTTPRequestHandler):"""处理Alertmanager webhook请求"""defdo_POST(self):"""处理POST请求"""# 获取客户端IP# client_ip = self.client_address[0]try:# 读取请求体content_length=int(self.headers.get('Content-Length',0))ifcontent_length==0:logger.warning(f"请求体长度为零#################################")self._send_response(400,{"error":"Empty request body"})returnpost_data=self.rfile.read(content_length)# 解析JSONtry:data=json.loads(post_data.decode('utf-8'))exceptjson.JSONDecodeErrorase:logger.error(f"JSON解析失败:{e}")self._send_response(400,{"error":"Invalid JSON"})return# 记录接收到的告警# logger.info(f"收到Alertmanager告警 - 来源: {client_ip}")logger.info(f"收到Alertmanager数据##################################")logger.debug(f"原始数据:{json.dumps(data,ensure_ascii=False)}")# 处理告警alerts=data.get('alerts',[])logger.info(f"本次接收{len(alerts)}条告警")success_count=0fori,alertinenumerate(alerts,1):# alert_name = alert.get('labels', {}).get('alertname', '未知')# logger.info(f"处理告警 [{i}/{len(alerts)}]: {alert_name}")ifself._process_alert(alert):success_count+=1# 返回成功响应logger.info(f"推送对端完成:{success_count}/{len(alerts)}成功######################")self._send_response(200,{"status":"ok","processed":success_count,"total":len(alerts)})exceptExceptionase:logger.exception(f"处理请求时发生异常:{e}###################")self._send_response(500,{"error":"Internal server error"})def_process_alert(self,alert):"""处理单条告警"""try:# 提取信息status=alert.get('status','firing')labels=alert.get('labels',{})annotations=alert.get('annotations',{})# 构建发送给的payloadpayload={"alarm_action":"resolved"ifstatus=='resolved'else"firing","alarm_level":LEVEL_MAP.get(labels.get('severity'),"remind"),"alarm_type":labels.get('alertname','PrometheusAlert'),"alarm_time":datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"alarm_id":alert.get('fingerprint',f"noid-{time.time()}"),"alarm_name":labels.get('alertname','未知告警'),"alarm_content":annotations.get('description','无详细描述'),"alarm_channel":ALARM_CHANNEL,"alarm_host":labels.get('instance','127.0.0.1'),"alarm_auth":ALARM_AUTH,"bk_obj_id":bk_obj_id}# 记录要发送的数据# logger.info(f"转发到: {payload['alarm_name']} ({payload['alarm_action']})")logger.info(f"数据Payload:{json.dumps(payload,ensure_ascii=False)}#################################")# 发送数据resp=requests.post(BK_URL,json=payload,timeout=10,headers={'Content-Type':'application/json'})# 记录响应logger.info(f"开始响应: HTTP{resp.status_code}")logger.info(f"响应内容:{resp.text}")returnresp.status_code==200exceptrequests.exceptions.Timeout:logger.error("发送到超时")returnFalseexceptrequests.exceptions.ConnectionError:logger.error("连接失败")returnFalseexceptExceptionase:logger.exception(f"处理告警时异常:{e}")returnFalsedef_send_response(self,status_code:int,data:Dict[str,Any]):"""发送HTTP响应"""self.send_response(status_code)self.send_header('Content-Type','application/json')self.end_headers()self.wfile.write(json.dumps(data).encode())deflog_message(self,format,*args):"""重写HTTP服务器的日志方法,使用我们的logger"""logger.info(f"HTTP访问:{self.address_string()}-{format%args}")defrun():"""启动HTTP服务器"""# 创建服务器server_address=('0.0.0.0',PORT)httpd=http.server.HTTPServer(server_address,WebhookHandler)logger.info("="*50)logger.info(f"Webhook服务启动")logger.info(f"监听端口:{PORT}")logger.info(f"目标BK_URL:{BK_URL}")# logger.info(f"日志级别: {LOG_LEVEL}")# logger.info(f"进程PID: {os.getpid()}")logger.info("="*50)httpd.serve_forever()if__name__=='__main__':run()
http://www.cnnetsun.cn/news/3126908.html

相关文章:

  • 两大智驾强制国标报批稿公示,仿真测试成高阶智驾“安全准入门票”
  • 7 月 15 日起,追踪影视的 TV Time 应用停服,难盈利成主因
  • 小程序商城制作工具实测对比:餐宝盈/BBWEYY/比文云/Jasper Chat/Chatsonic(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • AI服务选型实战:Token计费、模型调度与Obsidian工作流优化
  • 机械手技术解析:从核心部件到行业应用全景
  • Java SHA256加密实战:从原理到密码存储与API签名的完整指南
  • 证件照还要去照相馆?这款免费AI抠图工具,在家就能做出标准证件照
  • 【C++】008、sizeof与strlen的区别
  • 总线舵机技术解析与应用实践
  • 热成像车辆行人数据集 目标检测数据集
  • AI大模型实战选型指南:ChatGPT、Gemini、Claude、Grok工作流适配策略
  • 【EIS芯片应用专题之二】SENSIPLUS DCMU深度解读:面向锂离子电池的紧凑低功耗ASIC芯片在线高分辨率EIS
  • 百度抓取诊断:你的网站侦察兵
  • UVa 479 Irrigation Flow Rates
  • HoRain云--C++多线程编程
  • 《唤醒你的AI同事:WorkBuddy从零上手》035:工作流程优化
  • 长文档总结不卡顿,128k 上下文在 Strix Halo 上的表现
  • Gemini 1.5与GPT-4o真实对比:大模型选型的技术逻辑与落地实践
  • 垃圾短信识别项目深度复盘:中文文本分类全流程实战 + 3 个数据泄漏避坑指南
  • AI赋能非技术行业实战:我用DeepSeek+混元整理了2026河北高考志愿填报完整指南
  • DeepSeek 开源 DSpark,一个可将 LLM 推理速度提升高达 85% 的新框架
  • 【ROS】 ros学习日记(1)
  • swagger增强knife4j
  • C++:拷贝构造函数
  • 椭圆曲线 Diffie-Hellman 密钥交换解题思路
  • 集团知识管理平台建设方案:74页PpT爆款干货全解析!
  • 【2026万字实录】从理论到实战:网络信息安全全景深度解析与避坑指南
  • 后 Django 时代:SQLAlchemy 2.0、Tortoise 与 Piccolo 三大异步 ORM 选型指南
  • 几分钟完成 OpenClaw 安装,Windows 可视化步骤新手直接照搬
  • 手撕字符串算法:反转、回文、验证回文 Ⅱ 完整拆解