一个完整的容器化演示,展示如何通过Grafana的模型上下文协议(MCP)服务器让AI风格的对话界面与Grafana指标和日志进行交互。
此演示提供了一个完整的端到端解决方案,用于Grafana及朋友聚会,展示了以下内容:
所有组件作为Docker容器运行,便于复制和演示。
模型上下文协议(MCP)是一个开放标准,用于连接AI助手到数据源。Grafana有一个官方的MCP服务器,它将AI工具与您的仪表板、指标和日志连接起来。您无需手动导航仪表板,只需用自然语言提问即可。
┌─────────────────────────────────────────────────────────────┐
│ Docker网络 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ UI │────▶│ MCP │────▶│ Grafana │ │
│ │ :8888 │ │ 服务器 │ │ 开源 │ │
│ └──────────┘ │ :3001 │ │ :3000 │ │
│ └──────────┘ └────┬─────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ ┌────▼─────┐ │
│ │ 演示 │────▶│Prometheus│────▶│ Loki │ │
│ │ 应用 │ │ :9090 │ │ :3100 │ │
│ │ :8081 │ └────┬─────┘ └────▲─────┘ │
│ └──────────┘ │ │ │
│ │ │ │ │
│ │ ┌────▼─────┐ ┌────┴─────┐ │
│ └──────────▶│ Blackbox │ │ Promtail │ │
│ │ 导出器 │ │ │ │
│ │ :9115 │ └──────────┘ │
│ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
| 组件 | 镜像 | 端口 | 目的 |
|---|---|---|---|
| Grafana 开源 | grafana/grafana:latest | 3000 | 可视化和仪表板 |
| Prometheus | prom/prometheus:latest | 9090 | 指标收集和存储 |
| Blackbox 导出器 | prom/blackbox-exporter:latest | 9115 | 端点探测 |
| Loki | grafana/loki:latest | 3100 | 日志聚合 |
| Promtail | grafana/promtail:latest | - | 日志收集代理 |
| MCP 服务器 | mcp/grafana:latest | 3001 | 官方Grafana MCP服务器 |
| 自定义UI | nginx:alpine | 8888 | 对话界面 |
| 演示应用 | python:3.11-slim | 8081 | 指标和日志生成器 |
注意: 使用Docker Hub上的官方
mcp/grafana镜像 - 不需要自定义构建!
1. 启动所有服务
# 导航到项目目录
cd grafana-mcp
# 启动所有容器
docker-compose up -d
2. 等待服务初始化(约30-60秒)
# 检查容器状态
docker-compose ps
3. 访问服务
| 服务 | URL | 凭证 |
|---|---|---|
| 对话界面 | http://localhost:8888 | 无 |
| Grafana | http://localhost:3000 | admin / admin |
| Prometheus | http://localhost:9090 | 无 |
| 演示应用 | http://localhost:8081 | 无 |
# 检查所有容器是否在运行
docker-compose ps
# 验证Grafana健康状况
curl http://localhost:3000/api/health
# 验证Prometheus
curl http://localhost:9090/-/healthy
# 验证Loki(启动后等待15秒)
curl http://localhost:3100/ready
# 检查演示应用指标
curl http://localhost:8081/metrics
演示使用官方mcp/grafana镜像,并采用SSE(服务器发送事件)传输来访问HTTP/web API。
官方文档显示:
docker run -e GRAFANA_URL=http://localhost:3000 \
-e GRAFANA_SERVICE_ACCOUNT_TOKEN=<token> \
mcp/grafana -t stdio
然而,本演示使用:
command: ["-transport", "sse", "-address", "0.0.0.0:3001"]
传输选项:
我们选择SSE的原因:
选项1:服务账户令牌(推荐用于生产环境)
在Grafana中创建服务账户:
设置环境变量:
GRAFANA_SERVICE_ACCOUNT_TOKEN=glsa_YourTokenHere
更新docker-compose.yml或创建.env文件
选项2:用户名/密码(演示/开发)
默认情况下,在此演示中使用简单方式:
environment:
- GRAFANA_USERNAME=admin
- GRAFANA_PASSWORD=admin
如果提供了令牌,MCP服务器将使用该令牌,否则回退到用户名/密码。
打开UI,网址为 http://localhost:8888
等待右上角出现“已连接”状态
尝试这些示例查询:
使用侧边栏中的快速操作进行常见查询
点击示例查询填充输入字段
模拟流量模式以查看实时变化:
# 生成流量峰值
curl "http://localhost:8081/simulate/load?pattern=spike"
# 生成错误
curl "http://localhost:8081/simulate/load?pattern=errors"
然后询问UI:“刚刚发生了什么错误率变化?”
访问Grafana中的仪表板,网址为 http://localhost:3000
导航至 http://localhost:9090 并尝试:
# 请求速率
rate(demo_app_requests_total[5m])
# 错误率
sum(rate(demo_app_requests_total{status=~"5.."}[5m])) / sum(rate(demo_app_requests_total[5m]))
# p95延迟
histogram_quantile(0.95, sum(rate(demo_app_request_duration_seconds_bucket[5m])) by (le))
# 活跃连接
demo_app_active_connections
在Grafana Explore(http://localhost:3000/explore)中:
# 所有演示应用日志
{job="demo-app"}
# 仅错误日志
{job="demo-app"} |~ "ERROR"
# 包含特定文本的日志
{job="demo-app"} |~ "database"
# 每分钟计数错误
sum(count_over_time({job="demo-app"} |~ "ERROR" [1m]))
症状: 连接期间发生错误
解决方法:
docker ps进行验证docker-compose up -d症状: 端口已被分配
解决方法:
# 查找使用该端口的进程(例如,3000)
netstat -ano | findstr :3000
# 终止进程
taskkill /PID <PID> /F
# 或者更改docker-compose.yml中的端口
诊断:
# 检查失败容器的日志
docker-compose logs [服务名称]
常见修复方法:
# 移除卷并重新启动
docker-compose down -v
docker-compose up -d
# 增加Docker资源
# Docker Desktop → 设置 → 资源
# 将内存设置为4GB以上,CPU设置为2核以上
解决方法:
# 检查MCP服务器状态
docker-compose logs mcp-server
# 验证Grafana是否可访问
curl http://localhost:3000/api/health
# 重启MCP服务器
docker-compose restart mcp-server
解决方法:
# 检查Prometheus目标
# 访问 http://localhost:9090/targets(所有应为UP)
# 验证演示应用是否正在运行
curl http://localhost:8081/metrics
# 重启Prometheus
docker-compose restart prometheus
解决方法:
# 检查Promtail状态
docker-compose logs promtail
# 重启Promtail
docker-compose restart promtail
当其他方法都无效时:
# 停止并移除所有内容
docker-compose down -v
# 移除日志
Remove-Item -Recurse -Force logs\*
# 重新开始
docker-compose up -d
# Grafana
curl http://localhost:3000/api/health
# Prometheus
curl http://localhost:9090/-/healthy
# Loki(启动后等待15秒)
curl http://localhost:3100/ready
# 演示应用
curl http://localhost:8081
# UI
curl http://localhost:8888
docker-compose up -d第一幕:介绍(3分钟)
“今天我将展示如何使用自然语言与Grafana的可观测性数据通过模型上下文协议进行交互。”
第二幕:组件巡览(4分钟)
# 显示运行的服务
docker-compose ps
浏览:
第三幕:对话界面演示(8分钟)
切换到自定义UI(标签页1):
查询1:发现
显示所有可用的仪表板
查询2:指标
当前错误率是多少?
查询3:性能
演示应用的p95延迟是多少?
查询4:日志
显示来自演示应用的最近错误日志
第四幕:实时事件模拟(4分钟)
# 生成流量峰值
curl "http://localhost:8081/simulate/load?pattern=spike"
# 生成错误
curl "http://localhost:8081/simulate/load?pattern= errors"
在UI中输入:
刚刚发生了什么错误率变化?
切换到Grafana以显示仪表板中的峰值。
第五幕:问答环节(3分钟)
常见问题:
Q: 这是使用ChatGPT还是Claude吗?
A: MCP服务器是模型无关的。此演示模拟了响应,但您可以连接任何LLM。
Q: 这可以在Grafana Cloud上工作吗?
A: 是的!适用于任何Grafana实例 - 开源版、企业版或云版。
Q: 关于安全性呢?
A: 这是一个演示。生产环境需要适当的认证、TLS和API令牌管理。
# 快速重置(保留数据)
docker-compose restart
# 完全重置(新鲜数据)
docker-compose down -v
docker-compose up -d
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 检查状态
docker-compose ps
| 服务 | URL |
|---|---|
| UI | http://localhost:8888 |
| Grafana | http://localhost:3000(admin/admin) |
| Prometheus | http://localhost:9090 |
| 演示应用 | http://localhost:8081 |
复制粘贴这些到UI中:
显示所有可用的仪表板
当前错误率是多少?
演示应用的p95延迟是多少?
显示来自演示应用的最近错误日志
G