从日志到截图:多模态运维 Agent 的工程落地
本文提出构建多模态运维Agent的创新思路,将可视化监控数据(时序图、拓扑图、抓包图)与日志文本结合,利用多模态大模型实现智能故障诊断。文章详细设计了系统架构,包含截图采集、上下文构建和多模态分析三大模块,并规范了输入输出接口。重点阐述了从Grafana等监控系统获取图表截图的技术方案,以及如何组织"图表+日志"的上下文信息。通过结构化Prompt设计,使Agent能输出包含异
大多数关于大模型运维的文章,还停留在“看日志、查文档、问知识库”这一层,很少真正把可视化信息也纳入到 Agent 的决策链路里,比如:
- Grafana / Prometheus 的时序图截图;
- 服务拓扑图(如 SkyWalking / Jaeger UI);
- 抓包分析图(TCP 流、时延分布);
- 容器编排面板的截图(Pod 状态、资源使用情况)。
但是在真实排障中,人类工程师非常依赖这种“看图”的能力:
一眼扫过去,看哪个服务红了、哪条链路变粗了、哪段时间响应飙升了,
再结合日志和配置,做出判断。
现在多模态大模型已经能同时理解文本 + 图片,这就给了我们一个很有意思的方向:
把「图表截图 + 日志片段 + 拓扑结构」统一丢给一个多模态 Agent,
让它帮你做“看图排障”,甚至生成下一步排查建议。
这篇文章就从工程实现的角度,讲清楚如何落地这样一个多模态运维 Agent,你可以当作你之前“可观测 / Agent / 自愈”系列的新版分支。
一、要解决的问题:单靠日志很难“秒看全局”
传统只靠文本日志 + 指标的排障方式,会有几个痛点:
-
全局形态难以把握
- 单纯看数字(CPU、QPS、错误率)难以直观看出拓扑层面的问题;
- 谁调用谁、哪条链路变慢了,需要在多个页面来回切。
-
时间维度的对齐成本高
- Grafana 图表、拓扑视图、抓包时间轴,往往是分开的;
- 人需要自己对齐时间范围、挑截图、做 mental model。
-
跨团队沟通困难
- “你看这个图,这一块突然凸起来了”的口头描述难以复用;
- 排障经验很难沉淀为结构化知识。
但多模态 LLM 正好擅长:
- 看图提取关键信息(哪个时间段异常、哪个节点变红、哪个 Pod OOM);
- 把看图结果 + 文本日志,综合成一个结构化的诊断报告;
- 用自然语言生成下一步排查命令或脚本。
所以,思路很自然:
做一个「多模态运维 Agent」,
输入:图表截图 + 拓扑截图 + 日志片段 + 基本上下文
输出:异常总结 + 可疑根因 + 推荐排查 / 修复步骤
二、系统设计:一个多模态运维 Agent 的骨架
2.1 整体架构
可以沿用你之前的 Agent 思维,但加上“图像输入”这条支线:
┌─────────────────────┐
Grafana │ │
拓扑图 │ Screenshot Collector ──┐
抓包界面 │ │ │
└─────────────────────┘ │
▼
┌─────────────┐
日志服务 / APM / 指标 API ───────► │ Context Builder │
└─────────────┘
▼
┌──────────────────────────────────────────┐
│ Multi-Modal Ops Agent │
│ - 接受图片 + 文本 │
│ - 输出诊断报告 + 下一步建议 │
└──────────────────────────────────────────┘
▼
前端运维面板 / Chat UI
核心环节只有三块:
- Screenshot Collector:
自动从各个可观测系统拉取当前视图的截图(或导出 SVG/PNG); - Context Builder:
把同一时间窗口的日志片段、指标摘要、告警信息整理成文本; - Multi-Modal Ops Agent:
多模态大模型 + 一点流程控制,生成诊断结果。
2.2 输入输出约定
统一定义 Agent 的 I/O 接口:
class MultiModalOpsAgent:
def handle(self, images: list, text_context: str, meta: dict) -> dict:
"""
:param images: [img_grafana, img_topology, img_packet]
:param text_context: 日志片段 + 告警详情 + 已知操作(最近发布等)
:param meta: {"service": "...", "env": "prod", "time_range": "..."}
:return: {
"summary": "整体问题总结",
"suspected_root_causes": [...],
"suggested_actions": [...],
"risk_level": "low|medium|high"
}
"""
这样无论后面你接什么前端(Web 面板、飞书机器人、CLI 工具),都可以统一调用。
三、数据采集层:如何拿到“给 Agent 看”的图片
3.1 从 Grafana / Prometheus 导出图表截图
Grafana 提供了直接导出 PNG 的 API,你可以通过 HTTP 调用拿到:
GET /render/d-solo/{dashboard_uid}/{panel_id}?from=...&to=...&width=1000&height=500
在你的后端里简单封装一下(Python 伪代码):
import requests
def fetch_grafana_panel_image(panel_url: str, api_key: str) -> bytes:
headers = {"Authorization": f"Bearer {api_key}"}
resp = requests.get(panel_url, headers=headers)
resp.raise_for_status()
return resp.content # PNG bytes
3.2 服务拓扑截图
对 SkyWalking / Jaeger / ServiceMap 这种 UI,一般有:
- 直接导出 SVG / PNG 的接口;
- 或前端可以自带“截图下载”按钮(你可以让前端自动点击/调用)。
你只需要把“当前服务拓扑”的静态图拿下来,然后一起传给 Agent。
3.3 抓包 / 网络时延图
对于 eBPF/抓包平台(如 Pixie、Cilium Hubble 等):
- 可以导出时延分布图、TCP 流水线图的截图;
- 或者直接导出统计结果(比如 P95 RTT 曲线)。
为了多模态 Agent 效果,推荐直接用图表截图,而不是纯文本。
四、上下文构造:把“图 + 文”打包成一个世界状态
我们可以把当前的“运维世界状态”整理成一个 JSON 文本,作为 text_context:
{
"alert": {
"service": "order-service",
"env": "prod",
"alert_name": "p99_latency_high",
"trigger_time": "2026-02-10T03:10:00Z",
"threshold": "p99 > 800ms"
},
"metrics_summary": {
"cpu_usage": "80% → 95%",
"qps": "稳中略升",
"error_rate": "0.5% → 2.1%",
"latency_p99": "200ms → 1.2s"
},
"recent_changes": [
"2026-02-10 03:05 发布了 order-service v1.3.2",
"2026-02-10 03:06 数据库连接池参数由 100 改为 200"
],
"log_samples": [
"2026-02-10 03:08 timeout calling payment-service /pay",
"2026-02-10 03:08 slow query SELECT ... ON orders"
]
}
再配上一点提示文本喂给 LLM,例如:
def build_text_context(state_json: str) -> str:
return f"""
你是一个资深运维工程师,下面是当前系统的文本上下文信息(JSON):
{state_json}
请结合我提供的图表截图,分析问题。
"""
五、多模态 Agent 的 Prompt 设计思路
多模态大模型一般支持“多图 + 文本”输入,你可以组织成这种格式:
(图1:最近1小时服务指标时序图)
(图2:当前服务拓扑图)
(图3:网络时延 / 抓包分析图)
【文本上下文】
{build_text_context(...)}
【你的任务】
1. 先分别描述每张图中和"异常"相关的关键信息;
2. 再结合文本上下文,回答下面几个问题:
- 哪个时间段最明显异常?
- 异常首先出现在哪个服务 / 哪条链路上?
- 可能的根因有哪些?按可能性排序。
3. 最后给出 3~5 条具体的下一步排查 / 缓解建议。
输出严格使用 JSON,格式如下:
{
"summary": "...",
"suspected_root_causes": [
{"cause": "...", "evidence": "...", "confidence": 0.8}
],
"suggested_actions": [
{"action": "...", "reason": "...", "priority": 1}
],
"risk_level": "low|medium|high"
}
这样可以保证输出可被前端 / 工作流消费,而不仅仅是长篇自然语言。
六、前端体验:让运维同事“点图问因”
你可以在现有的监控面板上加一个按钮:
「让多模态 Agent 分析这段时间」
点击后,前端做的事是:
-
根据当前时间范围 / 筛选条件,调用后端 API:
- 拉取对应的 Grafana 图表 PNG;
- 拉取对应服务拓扑图 PNG;
- 拉取对应抓包视图 PNG(可选);
- 拉取该时间窗口的日志 / 告警概要。
-
调用后端的
/ops-agent/diagnose接口:
POST /ops-agent/diagnose
{
"images": [
"data:image/png;base64,...",
"data:image/png;base64,..."
],
"text_context": "...上述 JSON 文本...",
"meta": {"service": "order-service", "env": "prod"}
}
- 在页面右侧展示 Agent 的诊断结果,包括:
- 问题总结(summary)
- 可疑根因列表(带证据)
- 建议的排查 / 修复步骤(可点击执行或生成命令)
七、和你原有“自愈 / 质量闭环”体系怎么衔接?
这个多模态 Ops Agent,本质上是你之前那套体系的“图像 + 决策增强版”,可以这样接:
-
作为新的 Agent 类型接入调度器
- 之前有
RetrieverAgent / ExplainerAgent / EvaluatorAgent; - 现在再加一个
OpsVisualAgent,专门处理“图 + 文”的排障请求。
- 之前有
-
把诊断结果存入质量闭环
- 每次诊断结果,落库为一个
OpsDiagnosisEvent:images_hash/text_context/diagnosis_json/ 人工确认结果;
- 未来可以再基于这些事件做SFT / DPO,持续提升排障能力。
- 每次诊断结果,落库为一个
-
和自愈工作流联动
- 当
risk_level = "high"且某些suggested_actions置信度够高时:- 自动触发你已有的自愈工作流(如扩容、降级、流量切换);
- 或者只在工单系统里预填“建议动作”,让工程师一键执行。
- 当
八、如何低成本先跑一个 Demo?
建议循序渐进,不要一上来就接全量生产告警:
-
选一个服务 + 一个告警类型试点
- 比如
order-service的p99_latency_high告警; - 固定几个 Grafana Panel / 拓扑视图,用静态链接先跑通。
- 比如
-
先从“辅助分析”做起,不直接操作生产
- 只展示诊断建议,不自动执行任何动作;
- 让值班工程师对比自己的判断和 Agent 判断的一致性。
-
积累几十个案例后,再考虑接入自愈
- 看看 Agent 诊断的“误判率 / 漏判率”;
- 总结它最擅长 / 最容易犯错的场景,再做针对性优化。
更多推荐



所有评论(0)