基于 Dify + Grafana MCP 的智能巡检与日志分析系统

在传统的运维架构中,监控、日志与可视化往往处于割裂状态:Prometheus 承载着数值型事实,Loki 负责存储文本型证据,而 Grafana 仅承担展示工作。最终,理解数据、判断故障及做出决策的重任依然完全依赖人工。本文将探讨如何利用 Dify 结合 Grafana MCP,引入大语言模型(LLM)作为系统的“理解层”,打通数据与决策的壁垒,实现自动化的智能巡检与日志关联分析。


1. 背景与架构:打破运维数据孤岛

1.1 核心痛点

在现有的技术栈中,工具链虽然完善,但缺乏连接数据与人类经验的桥梁:

  • 数据割裂:指标与日志分离,难以快速建立因果关系。
  • 响应滞后:从发现异常到人工定位原因,往往耗时较长。
  • 经验流失:资深运维的经验难以沉淀为系统可执行的逻辑。

1.2 系统架构设计

本项目的核心目标是将 LLM 植入运维流程,使其具备自动完成指标采集、日志关联分析与结论输出的能力。架构上,我们通过 Grafana MCP (Model Context Protocol) 作为数据接口,利用 Dify 编排工作流逻辑。

img

最终实现效果仅需一次简单的指令触发(例如:@机器人 执行巡检),系统即可自动输出结构化、可读、且包含执行建议的运维结论。


2. Dify 工作流编排:稳定的入口与智能路由

为了保证系统在生产环境中的稳定性,我们在 Dify 中设计了高度可控的工作流。

img

2.1 入口触发机制

  • 触发方式:采用 LangBot Webhook 方式,而非依赖自然语言的随机理解。
  • 默认行为:接收指令后默认执行一次完整的系统巡检。
  • 优势:这种方式保证了执行的稳定性与可预测性,避免了 Prompt 理解偏差导致的执行失败。

2.2 条件分支与场景复用

为了降低维护成本,我们通过单一 Bot 覆盖多种运维场景:

IF message contains "日志"
→ 路由至日志分析工作流
ELIF message contains "巡检"
→ 路由至系统巡检工作流
ELSE
→ 输出标准提示词

这种设计允许工程师通过关键词精准调用不同的分析逻辑,而无需部署多个机器人。


3. 监控数据的高效获取:Prometheus 并行查询与 Loki 日志清洗

在对接 Grafana MCP 获取数据时,我们针对 Prometheus 和 Loki 采取了不同的优化策略,以平衡查询速度与 Token 消耗。

3.1 Prometheus 指标查询策略

为了将巡检时间压缩至秒级,所有的指标查询均采用 并行处理,避免串行等待。

  • 查询指标:CPU 使用率、内存利用率、磁盘空间、网络 I/O。
  • PromQL 设计原则
    • 仅返回当前状态快照。
    • 避免检索长时间序列数据。
    • 查询结果直接可用于健康度判断。

PromQL 示例

# 计算 CPU 使用率
100 - avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100

3.2 Loki 日志分析优化

为什么不直接让模型读取原始日志? 直接将海量日志投喂给 LLM 会带来极高的 Token 成本和噪音干扰。因此,我们采用“先过滤,后分析”的策略:

  1. Loki 端过滤:仅检索最近时间窗口(如 5~15 分钟)内的异常级别日志或高频重复日志。
  2. 结构化传输:MCP 将过滤后的日志整理为结构化 JSON 格式返回。
  3. 职责分离:Loki 负责数据清洗,LLM 仅负责模式识别与根因归因。

4. Prompt 工程实践:结构化输入与严格的输出约束

Prompt 的质量直接决定了分析结果的可用性。我们采用了结构化输入与严格的约束策略。

4.1 结构化输入设计

我们将 Prometheus 的指标数据与 Loki 的日志摘要进行标准化组合,作为 Prompt 的上下文:

【监控指标数据】
CPU利用率:{{cpu_usage}}%
内存利用率:{{mem_usage}}%
网络接收速率:{{net_in}} Mbps
...

【日志异常摘要】
- 服务A: 检测到 OOM (Out Of Memory)
- 服务B: 出现 Connection Timeout

【分析要求】
1. 基于上述数据判断系统当前是否存在异常。
2. 分析指标与日志之间是否存在因果关系。
3. 给出明确的结论与可执行的运维建议。

4.2 防止幻觉的约束机制

为了确保结论的专业性和可信度,我们在系统指令中加入了严格约束:

  • 严禁假设:明确禁止模型编造不存在的数据。
  • 基于事实:要求所有结论必须严格基于输入的监控数据和日志。
  • 不确定处理:若数据不足以判断,必须明确说明“不足以判断”,而非强行给出结论。

5. 结果输出与协同:标准化报警与运维知识固化

5.1 标准化消息设计

为了适配钉钉等即时通讯工具,我们将输出格式固定化,确保值班人员可以“秒读”关键信息:

# 【巡检报告】
【总体风险等级】高/中/低
【异常主机列表】10.0.0.1, 10.0.0.2

【资源瓶颈分析】
- CPU 突增,主要由服务 A 导致。

【关键错误摘要】
- 服务 B: 检测到大量 500 错误。

【可执行巡检建议】
1. 检查服务 A 是否有异常任务。
2. 重启服务 B 并观察日志。

巡检分析示例:

# 主机资源巡检报告
**巡检时间**: 2026-02-06 (基于 Timestamp)
**巡检概要**: 当前集群整体资源使用率处于可接受范围,但部分主机存在显著的存储与内存压力,需重点关注。
## 1. 总体风险等级
🔴 **中**
## 2. 异常主机列表
| 主机名     | IP 地址     | 异常指标 | 当前数值 | 状态 |
| :---       | :---       | :---     | :---   | :--- |
| **server** | xx.xx.xx.xx | 硬盘利用率 | 81.82% | 🔴 严重 |
| **server** | xx.xx.xx.x | 内存利用率 | 78.48% | 🟠 警告 |
| **dev**   | 10.0.0.10   | 硬盘利用率 | 69.66% | 🟡 关注 |
## 3. 资源瓶颈分析
**存储瓶颈**: `server` 节点硬盘使用率已突破 **80%**,属于高风险水位,若持续写入可能导致服务不可用或数据丢失风险;`dev` 硬盘使用率接近 **70%**,需提前规划扩容或清理。
**内存瓶颈**: `server` 节点内存使用率达到 **78.48%**,虽未达到致命阈值,但已接近剩余资源不足的临界点,若业务突增可能引发 OOM(内存溢出)。
**CPU 与 网络**: 全局 CPU 负载较低(< 20%),网络带宽负载极低,目前不存在计算或网络传输瓶颈。
## 4. 可执行巡检建议
### 针对 `server` (xx.xx.xx.xx) - **高优先级**
1. **磁盘清理 (紧急)**:
  登录主机执行 `df -h` 确认具体挂载点占用。
  使用 `du -sh /*` 逐层排查大目录。
  重点检查:系统日志 (`/var/log`)、应用临时文件、Docker 镜像/容器卷残留。
  清理过期日志或无用数据,立即将使用率降至 75% 以下。
2. **内存排查**:
执行 `free -m` 或 `top` 查看内存具体占用进程。
检查是否有异常进程占用大量内存(如 Java 进程堆内存设置过大、数据库缓存未限制等)。
确认应用是否有内存泄漏迹象,必要时重启服务释放内存。
### 针对 `dev` (10.0.0.10) - **中优先级**
1. **容量规划**:
确认存储数据类型,检查是否有重复备份或废弃文件。
鉴于其为 NAS 设备,建议设置磁盘告警阈值(如 75%),提前规划扩容或迁移数据。
### 针对 `Kwrt` / `tokyo` - **低优先级**
当前状态良好,保持常规监控即可。
---
**备注**: 建议立即配置 Alertmanager 告警规则,针对磁盘使用率 >80% 和 内存使用率 >85% 设置实时告警。

日志分析示例:

# 关键错误摘要
- **主机 `vpn`**: 大量业务(Harbor, AI, Dify, Monitor 等)连接上游 IPv6 地址 `[xxxx:36d:120a:1840::1]` 失败,错误码 `101: Network is unreachable`。
- **主机 `server`**: Docker 守护进程持续无法查询 DNS 服务器 `10.0.1.1:53`,提示 `read: connection refused`。
- **主机 `server`**: Nginx 连接上游 `127.0.0.1:5000` 失败,错误码 `111: Connection refused`。
- **主机 `server`**: 检测到来自 `157.15.40.1` 和 `149.102.225.184` 的高频恶意扫描与 Webshell 探测行为。
# 可能原因分析
- `vpn` 主机内网 IPv6 路由缺失或对端网关不可达,导致 Nginx 无法通过 IPv6 协议回源到后端服务。
- `server` 主机的 DNS 服务 `10.0.1.1` 配置了访问控制,拒绝了来自 Docker 网桥网段 (`172.28.0.4`) 的 UDP 53 端口请求,或者 DNS 服务本身异常。
- `server` 主机端口 5000 对应的后端容器已停止运行或未正常监听端口。
- 攻击者正在利用自动化工具扫描常见的 WordPress 路径及可疑后门文件。
# 风险等级

# 巡检建议
1. 在 `vpn` 主机上检查 IPv6 路由表与连通性:
```bash
ip -6 route show
ping6 -c 4 xxxx:36d:120a:1840::1
```
  若不可达,请检查网关配置或修改 Nginx 上游配置使用 IPv4 地址。
2. 在 `server` 主机上排查端口 5000 服务状态:
```bash
ss -tlnp | grep :5000
docker ps | grep 5000
```
  若服务异常,请重启对应的 Docker 容器。
3. 在 `server` 主机上修复 DNS 问题:
  检查 DNS 服务器防火墙规则,允许 Docker 网段访问,或修改 `/etc/docker/daemon.json` 指定可用的公网 DNS(如 `114.114.114.114` 或 `8.8.8.8`)并重启 Docker。
4. 在 Nginx 配置中实施访问控制:
  在 `http` 块或特定 `server` 块中添加 `deny` 指令封禁恶意 IP:
```nginx
deny 157.15.40.1;
deny 149.102.225.184;
```
  执行 `nginx -s reload` 生效。

5.2 业务价值

通过这套系统,我们实现了显著的效率提升:

  • 巡检时间:在并行 PromQL 查询与日志预过滤的前提下,单次巡检整体耗时稳定在 30~60 秒区间,主要时间消耗来自 LLM 推理。实际耗时会受监控规模、日志量、LLM 响应时间等因素影响。
  • 人工介入:大幅降低重复性人工分析工作。
  • 知识沉淀:将资深工程师的排查经验“固化”在系统规则与 Prompt 中,而非仅仅留存在个人大脑中。

6. 扩展方向:从自动化到智能决策支持

当前系统已具备基础的巡检与分析能力,未来可向以下方向扩展,构建更深度的自动化运维闭环:

  • 告警自动 RCA (Root Cause Analysis):结合历史数据与实时日志,自动生成根因分析报告。
  • 变更前后的指标对比:在发布或配置变更前后自动抓取指标,辅助判断变更影响。
  • 自动化报表生成:基于日常巡检数据,自动生成日报或周报。
  • 与 CMDB/工单系统联动:根据分析结果自动创建工单或查询资产信息。

总结

基于 Dify 与 Grafana MCP 的这套系统,其核心价值不在于用技术替代运维人员,而在于利用 LLM 强大的语义理解能力,连接底层的监控数据与上层的运维经验

给TA打赏
共{{data.count}}人
人已打赏
SRE监控

搭建轻量级日志系统:Loki + Promtail 完全指南

2026-2-5 22:28:25

SRE可观测性监控

告别 Loki + Promtail:用 Vector + VictoriaLogs 构建更轻量的日志系统

2026-2-25 21:52:55

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索