3.故障快速定位与根因分析
2026/7/23大约 7 分钟
核心架构设计
- 数据层:Prometheus 采集 130-135 节点数据,时间戳已通过
chronyc实现全集群同步。 - 逻辑层:136 堡垒机运行 Python 中间件(Flask),对接阿里云百炼应用
d701ef1c1f6749b491476265097f0ddc。 - 知识层:通过百炼知识库(RAG)注入了 Cisco 网络拓扑、K8s 集群架构及历史故障复盘文档。
- 通知层:AI 生成诊断报告后,通过 163 邮件服务器投递至 QQ 邮箱。
RAG知识库
使用阿里云百炼创建知识库

上传数据

创建一个智能体应用

选择你创建好的知识库并设置提示词

复制应用id
创建API-KEY
点击密钥管理创建一个API

调用API-KEY和智能体应用
基础调用格式 (Python SDK)
这是最简洁的标准格式,适用于你的 ai_diagnose.py 核心逻辑:
import dashscope
from dashscope import Application
# 1. 配置你的 API-KEY
dashscope.api_key = "你的有效API-KEY"
def call_agent_app(prompt_text):
# 2. 调用智能体应用
# app_id: 你在百炼控制台创建的应用 ID
response = Application.call(
app_id='<REDACTED>',
prompt=prompt_text,
# 如果需要流式输出,设为 True,Webhook 建议设为 False
incremental_output=False
)
# 3. 标准结果处理
if response.status_code == 200:
# 成功:返回 AI 生成的内容
return response.output.text
else:
# 失败:记录错误码和信息
return f"错误码: {response.code}, 错误信息: {response.message}"
生产环境标准格式 (带 Context 与 Session)
对于运维中间件,建议使用这种格式,它可以保持对话的连贯性(Session)并处理更复杂的请求:
import dashscope
from dashscope import Application
import logging
logger = logging.getLogger("AI-App")
def get_ai_diagnosis(alert_info):
try:
response = Application.call(
app_id='<REDACTED>',
prompt=alert_info,
# 选填:如果你想让 AI 记住上一次告警的上下文,可以传入 session_id
# session_id='zh_kinger_session_001',
# 选填:控制模型生成的随机性,运维场景建议设低(如 0.2)以保证确定性
parameters={
'temperature': 0.2,
'top_p': 0.8
}
)
if response.status_code == 200:
# 提取具体的 text 内容
return response.output.text
else:
logger.error(f"调用百炼失败 | RequestID: {response.request_id} | Message: {response.message}")
return None
except Exception as e:
logger.exception(f"调用接口发生异常: {str(e)}")
return None
中间件
该中间件是一个基于 Python Flask 的轻量级 Webhook 服务。它作为 Alertmanager(告警源) 与 阿里云百炼(AI 大脑) 之间的桥梁,实现了告警数据的“智能化加工”。
编写中间件
import logging
from logging.handlers import RotatingFileHandler
import dashscope
from dashscope import Application
from flask import Flask, request
import smtplib
import time
import random
from email.mime.text import MIMEText
from email.header import Header
# --- 1. 日志系统配置 ---
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("AI-Diagnose")
file_handler = RotatingFileHandler('/llm/ai_running.log', maxBytes=5*1024*1024, backupCount=3)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
app = Flask(__name__)
# --- 2. 核心参数配置 ---
dashscope.api_key = "<REDACTED>"
APP_ID = "<REDACTED>"
SMTP_SERVER = "smtp.163.com"
SMTP_PORT = 465
MAIL_USER = "www914132612@163.com"
MAIL_PASS = "<REDACTED>"
RECEIVER = "914132612@qq.com"
def send_email(subject, content):
"""发送邮件并记录日志"""
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = MAIL_USER
message['To'] = RECEIVER
message['Subject'] = Header(subject, 'utf-8')
try:
smtp_obj = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
smtp_obj.login(MAIL_USER, MAIL_PASS)
smtp_obj.sendmail(MAIL_USER, [RECEIVER], message.as_string())
smtp_obj.quit()
logger.info(f"邮件成功发送至 {RECEIVER}")
return True
except Exception as e:
logger.error(f"邮件发送异常: {str(e)}")
return False
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
alerts = data.get('alerts', [])
logger.info(f"收到 Webhook 信号,包含 {len(alerts)} 条告警")
for alert in alerts:
instance = alert['labels'].get('instance', '192.168.31.x')
alert_name = alert['labels'].get('alertname', '未知告警')
# 1. 生成唯一 Session ID (IP 隔离)
current_session_id = f"session_{instance.replace('.', '_')}"
# 2. 构造动态干扰因子 (强制打破 AI 复读缓存)
random_mark = random.randint(1000, 9999)
timestamp = time.strftime("%H:%M:%S")
logger.info(f"开始诊断节点 {instance} (Session: {current_session_id} | Mark: {random_mark})...")
try:
# 3. 调用百炼智能体 (强制阶梯逻辑)
response = Application.call(
app_id=APP_ID,
prompt=(
f"【诊断编号:{random_mark} | 时间:{timestamp}】\n"
f"节点 {instance} 再次触发告警:{alert_name}。\n\n"
f"请务必核对该 Session ({current_session_id}) 的历史对话记录:\n"
f"1. 禁止重复回复 612 字符左右的固定模版内容。\n"
f"2. 如果历史记录显示该问题近期已出现过,必须判定为故障恶化,"
f"给出比上次更深入、更专业的内核或链路级分析建议。\n"
f"3. 即使知识库有匹配内容,也请结合当前‘连续发生’的语境重新组织语言。"
),
session_id=current_session_id,
parameters={
'temperature': 0.8,
'top_p': 0.95
}
)
if response.status_code == 200:
ai_report = response.output.text
logger.info(f"AI 诊断成功 (RequestID: {response.request_id})")
logger.info(f"报告实时长度: {len(ai_report)} 字符")
# 4. 构造邮件内容
subject = f"【ZH-Kinger 深度诊断】{alert_name} @ {instance} (#{random_mark})"
content = (
f"告警节点: {instance}\n"
f"告警项目: {alert_name}\n"
f"诊断序列: {random_mark} (Session 激活)\n\n"
f"AI 专家差异化建议:\n{ai_report}"
)
send_email(subject, content)
else:
logger.error(f"百炼 API 异常: {response.message} (Code: {response.code})")
except Exception as e:
logger.error(f"处理告警逻辑时发生崩溃: {str(e)}")
return "OK", 200
if __name__ == '__main__':
logger.info("ZH-Kinger AI 诊断系统 V2.1 上线 (已强化动态抗复读逻辑)")
app.run(host='0.0.0.0', port=5000)
下载依赖包
需要提前准备好python环境
pip3 install dashscope flask requests -i https://pypi.tuna.tsinghua.edu.cn/simple
服务持久化(使用systemd管理)
在vi /etc/systemd/system/ai_diagnose.service添加以下内容:
[Unit]
Description=ZH-Kinger AI Diagnose Middleware
After=network.target
[Service]
Type=simple
User=root
# 确保这里没有任何前后空格(/llm你的脚本存放目录)
WorkingDirectory=/llm
# 建议写全 python3 的绝对路径
ExecStart=/usr/bin/python3 /llm/ai_diagnose.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl start ai_diagnose
systemctl enable ai_diagnose

测试中间件运行状态
curl -X POST http://127.0.0.1:5000/webhook \
-H "Content-Type: application/json" \
-d '{
"alerts": [
{
"labels": {
"alertname": "Manual_Test_AI",
"instance": "192.168.31.131",
"severity": "critical"
},
"annotations": {
"summary": "手动测试:验证百炼 RAG 知识库是否关联成功"
}
}
]
}'
如果正常运行你将会收到如下邮件

观察“运行日记” (Logging)
查看日志文件。这是判断脚本是否“脑死亡”的关键。
# 实时滚动查看日志
tail -f /llm/ai_running.log
会看到如下输出

启用 Grafana ML(动态阈值)
针对 Web 访问量和 CPU 负载开启训练,自动生成置信区间(阴影带)。偏离阴影带即视为异常,能有效识别隐蔽的内存泄漏。
1.持久化“保命” (数据同步)
确保当前容器里的看板和数据源已经安全拷贝到宿主机。
# 1. 创建宿主机持久化目录(如果还没创建)
mkdir -p /var/lib/grafana_backup
# 2. 确保权限正确,防止容器内用户无法写入
chmod -R 777 /var/lib/grafana_backup
# 3. 将运行中容器的数据完整同步出来
docker cp grafana:/var/lib/grafana/. /var/lib/grafana_backup/
1.清理旧环境
删除没有挂载卷的“临时”容器。
# 停止并删除旧容器
docker stop grafana
docker rm grafana
2.带持久化与 ML 环境变量“重生”
使用 docker run 命令一次性完成端口映射、路径挂载和功能开关开启。
docker run -d \
--name=grafana \
-p 3000:3000 \
--restart=always \
-v /var/lib/grafana_backup:/var/lib/grafana \
-e "GF_FEATURE_TOGGLES_ENABLE=machineLearning" \
grafana/grafana:latest
4.修改配置 (双重保险)
虽然注入了环境变量,但在最新的 12.4 版本中,修改 grafana.ini 依然是最稳妥的。
# 1. 进入新容器内部
docker exec -it -u root grafana /bin/bash
# 2. 在容器内直接修改配置文件
# 找到 [feature_toggles] 下的 enable 项,改为 enable = machineLearning
vi /etc/grafana/grafana.ini
# 3. 退出并重启容器让配置彻底生效
exit
docker restart grafana
验收环节
等待 10 秒后,执行以下验证指令:
检查配置加载状态:
docker exec grafana env | grep GF_FEATURE_TOGGLES_ENABLE
看到 *machineLearning = true* 就算大功告成。
- 进入网页端 (http://192.168.31.136:3000):
- 确认看板:检查之前的 Prometheus 数据源和面板是否还在(证明持久化成功)。
- 确认功能:点击左侧 Alerting,寻找 Machine Learning 入口。
