news 2026/7/4 3:55:59

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 3:55:23

7 月 15 日起,追踪影视的 TV Time 应用停服,难盈利成主因

TV Time 应用停服,7 月 15 日起不再可用一款能让用户追踪正在观看的电视剧和电影的应用程序 TV Time,从 7 月 15 日起将停止服务。开发者在支持页面更新中明确告知这一消息。难以为继:免费运营与付费市场的双重困境TV Time 开发者称&#xff…

作者头像 李华
网站建设 2026/7/4 3:53:54

小程序商城制作工具实测对比:餐宝盈/BBWEYY/比文云/Jasper Chat/Chatsonic(2026年7月更新)含零代码SAAS、AI编程、源码定制交付

一、汇总表工具更适合谁价格开发方式核心特点餐宝盈适合所有行业的商家,尤其是拥有自己实体门店的商家,如餐饮、茶饮、烘焙、便利店、生鲜、社区零售门店、教培门店,尤其适合先把点单、预约、会员、发券和复购做起来的老板。99元/年模板SAAS先…

作者头像 李华
网站建设 2026/7/4 3:53:51

AI服务选型实战:Token计费、模型调度与Obsidian工作流优化

1. 项目概述:当“按次调用”变成奢侈品,我们到底在买什么?最近有朋友凌晨四点蹲守智谱官网抢购GLM-5.1的API额度,还有人把火山引擎的代金券到账时间设成手机闹钟——这已经不是在用AI编程工具,而是在经营一门需要精准卡…

作者头像 李华
网站建设 2026/7/4 3:53:07

机械手技术解析:从核心部件到行业应用全景

1. 机械手行业全景扫描机械手作为工业自动化领域的核心执行部件,已经从传统的汽车焊接生产线走向了3C电子、食品包装、医疗手术等更广泛的场景。全球市场规模在2023年已突破200亿美元,年复合增长率保持在12%以上。这个领域既有发那科、ABB这样的老牌巨头…

作者头像 李华
网站建设 2026/7/4 3:52:56

Java SHA256加密实战:从原理到密码存储与API签名的完整指南

1. 项目概述:为什么我们需要SHA256? 在开发中,处理敏感数据是家常便饭,无论是用户密码、支付凭证还是API签名。直接存储明文密码是开发中的大忌,一旦数据库泄露,后果不堪设想。因此,我们必须对这…

作者头像 李华