Zabbix调用AI模型接口实现智能告警,提供修复建议
目录
PS:以上已经完成zabbix结合AI告警,接下来我们优化飞书告警格式
1、飞书群添加群机器人,保存Webhook 地址
2、zabbix服务器创建脚本(AI分析+告警推送)
在 Zabbix 服务器的脚本目录 alertscripts
下创建一个 Python 脚本,例如 feishu.py
。
默认路径为 /usr/lib/zabbix/alertscripts/
,具体路径可通过查看 Zabbix 配置文件 /etc/zabbix/zabbix_server.conf
中的 AlertScriptsPath
变量确认。
#!/usr/bin/env python3
import sys
import requests
import json
# 飞书 Webhook 地址
FEISHU_WEBHOOK_URL = "填你的飞书Webhook地址"
# AI模型API接口配置,这里我用的kimi,有免费额度
API_KEY = "填你的API 密钥"
BASE_URL = "https://api.moonshot.cn/v1" # 指定你的base URL
#发送飞书告警
def send_to_feishu(message):
headers = {'Content-Type': 'application/json'}
payload = {
"msg_type": "text",
"content": {
"text": message
}
}
response = requests.post(FEISHU_WEBHOOK_URL, headers=headers, data=json.dumps(payload))
return response.status_code == 200
#告警发送AI分析返回建议
def get_ai_recommendation(alert_data):
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
messages = [
{"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"}, #默认设定,自行修改
{"role": "user", "content": f"zabbix告警详情:{alert_data['alert_msg']},这是 Zabbix 告警,请提供修复建议,建议请简短,最好总结小于等于5点概括。"} #防止告警建议条目太多,这里指定AI总结5点
]
data = {
"model": "moonshot-v1-8k", # 指定 Moonshot 的模型,自行指定
"messages": messages,
"temperature": 0.3
}
response = requests.post(f"{BASE_URL}/chat/completions", headers=headers, json=data)
if response.status_code == 200:
result = response.json()
return result.get("choices", [{}])[0].get("message", {}).get("content", "AI 系统无法提供建议")
else:
return f"请求失败,状态码: {response.status_code}"
if __name__ == "__main__":
#传入zabbix告警
alert_data = {
"alert_msg": sys.argv[1]
}
# 记录收到的参数,可检查zabbix是否正常传参。不用可注销
with open("/tmp/feishu_debug.log", "a") as log:
log.write(f"Received arguments: {sys.argv}\n")
ai_recommendation = get_ai_recommendation(alert_data)
message = (
f"IT监控预警事件通知:\n{alert_data['alert_msg']}\n"
f"AI 修复建议:\n{ai_recommendation}"
)
if send_to_feishu(message):
print("告警信息已成功发送到飞书。")
else:
print("告警信息发送到飞书失败。")
3、zabbix 新建报警媒介
- 新建报警媒介,脚本参数填入:{ALERT.MESSAGE}
- 配置告警模版
告警设备:{HOST.NAME}
告警IP:{HOST.HOST}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警级别:{EVENT.SEVERITY}{EVENT.NSEVERITY}
告警名称:{EVENT.NAME}
告警详情:{EVENT.OPDATA}
4、zabbix用户关联报警媒介
5、zabbix创建动作故障告警
- 配置告警条件
- 关联用户和报警媒介
6、飞书告警消息推送
配置完成测试告警推送
PS:以上已经完成zabbix结合AI告警,接下来我们优化飞书告警格式
- 默认使用简单文本格式,我们可以选择卡片格式美化告警(配置卡片标题颜色区分告警与恢复)
def send_to_feishu(message):
headers = {'Content-Type': 'application/json'}
payload = {
"msg_type": "interactive",
"card": {
"schema": "2.0",
"config": {
"style": {
"text_size": {
"normal_v2": {
"default": "normal",
"pc": "normal",
"mobile": "heading"
}
}
}
},
"body": {
"direction": "vertical",
"padding": "12px 12px 12px 12px",
"elements": [
{
"tag": "markdown",
"content": message, #推送告警信息内容
"text_align": "left",
"text_size": "normal_v2",
"margin": "0px 0px 0px 0px"
},
]
},
"header": {
"title": {
"tag": "plain_text",
"content": "网络监控预警通知:" #主标题内容
},
"subtitle": {
"tag": "plain_text",
"content": "" #副标题内容,自己编辑
},
"template": "red", #卡片标题颜色
"padding": "12px 12px 12px 12px"
}
}
}
response = requests.post(FEISHU_WEBHOOK_URL, headers=headers, data=json.dumps(payload))
return response.status_code == 200
- 飞书卡片告警推送
推送格式根据个人喜好设置