使用说明
# MCP普罗米修斯+洛基📈
用于基于Prometheus+Loki的监控的MCP服务器。
入口点为 main.py是。
快速开始🚀
cd d:\MCPTools
uv sync
uv run python mcp_prometheus/main.py
项目结构🧩
mcp_prometheus/
main.py
core/
config.py
runtime.py
server.py
time_utils.py
domain/
checks.py
infra/
loki_client.py
prom_client.py
tools/
catalog.py
alerts_runner.py
checks_runner.py
loki_query.py
promql.py
utils/
query_utils.py
summarize.py
Tools摘要🛠️
Tool目的备注
|---|---|---|
| list_checks |查看已注册的检查列表| id, name, description 返回|
| list_environments |按环境查询Prometheus URL | prod/dev_test/dr |
| list_servers |查看最近的up标准服务器列表| (instance, job) 标准重复数据删除|
| list_process_groups |查看流程组列表| process_monitoring 标准|
| list_loki_environments |按环境查看Loki URL | prod/dev_test |
| list_loki_hosts |查看基于最近日志的主机候选项|默认最近1小时|
| list_loki_apps |查看基于最近日志的app候选|默认最近1小时|
| find_logs |查看结构化Loki日志| loki_environment, log_env, host, app 需要|
| get_alerts |查看Prometheus活动Alert | /api/v1/alerts 支持基于、标签/状态过滤器|
| run_check |运行单个检查|默认建议|
| run_all_checks |并行执行完整检查| step=5m 固定|
| run_promql |直接运行用户PromQL | approved=True 需要|
Loki Tool输入指南🪵
区分环境
loki_environment:选择要连接到哪个Loki服务器(prod,dev_test)log_env:Loki日志标签env值(prod,DEV,TEST)
这两个不是同一个意思。
例如, dev_test Loki服务器内 DEV哇 TEST 日志可能在一起, find_logs 呼叫时 log_env必须明确放入。
发现工具
list_loki_hostslist_loki_apps
通用规则:
- 默认持续时间为最近1小时
- 绝对时间查询时
start_time_utc_iso,end_time_utc_iso使用 - 结果返回重复数据删除的候选列表
find_logs
必需:
loki_environmentlog_envhostapp
选择:
- 持续时间:
hours,minutes,days - 绝对时间:
start_time_utc_iso,end_time_utc_iso - 终止偏移:
end_offset_minutes,end_offset_hours,end_offset_days - 过滤器:
contains,level - 数量限制:
limit
回复:
- 生成的LogQL
- UTC范围
line_countlogs[](timestamp,timestamp_jakarta,labels,line)
run_check 输入指南🧭
必需
check_id
期间
- 对象:
hours,minutes,days - 绝对:
start_time_utc_iso,end_time_utc_iso - 终止偏移:
end_offset_minutes,end_offset_hours,end_offset_days
目标筛选器
server_nameinstance(例如:host-or-ip:9100)
过滤规则:
server_name哇instance如果同时提供,则应用AND- 只要给我一个,就只适用该标签
run_promql 护栏🔒
approved=False:返回确认消息而不运行approved=True:运行
模式:
instant=True->/api/v1/queryinstant=False->/api/v1/query_range
使用示例📌
1)特定服务器CPU平均值(最近24小时)
{
"check_id": "cpu_avg_pct",
"hours": 24,
"instance": "10.23.12.11:9100",
"environment": "prod"
}
2)特定服务器磁盘利用率(按mountpoint)
{
"check_id": "disk_used_pct_by_mount",
"hours": 24,
"server_name": "CMS AP #1",
"environment": "prod"
}
3)运行用户PromQL(instant)
{
"promql": "up",
"approved": true,
"instant": true,
"environment": "prod"
}
4)查询Loki host候选人
{
"loki_environment": "dev_test",
"log_env": "DEV",
"app": "finast",
"hours": 1
}
5)查看Loki日志
{
"loki_environment": "prod",
"log_env": "prod",
"host": "cms-ap-01",
"app": "cms",
"hours": 1,
"contains": "timeout",
"limit": 200
}
检查目录✅
来源:
domain/checks.py(CHECKS)
系统/资源
cpu_avg_pct:按实例/server_name列出的CPU平均使用率(%)cpu_peak_pct:选定范围内的窗口峰值CPU使用率(%)mem_used_pct:内存使用率(%)mem_swap_used_pct:掉期使用率(%)load15_avg:15分钟平均负载cpu_iowait_pct:CPU等待率(%)
磁盘/文件系统
disk_used_pct_by_mount:装载点/设备使用的文件系统(%)(0-100比例)disk_used_top5_pct:前5名文件系统使用率(%)disk_inodes_used_pct:索引节点使用率(%)fs_readonly:只读文件系统指示符(1=只读)disk_io_busy_pct:磁盘I/O繁忙率(%)
可用性
up:目标活性(1=上升,0=下降)
网络/TCP
net_in_bytes:入站吞吐量(字节/秒)net_out_bytes:出站吞吐量(字节/秒)net_errs_per_sec:每秒RX+TX网络错误数tcp_retrans_per_sec:TCP每秒重新传输段数tcp_established:已建立TCP连接tcp_time_wait:TIME_WAIT TCP套接字tcp_inuse:正在使用的TCP套接字tcp_orphan:孤立TCP套接字
过程监控
proc_cpu_pct:进程组CPU使用率(%)proc_mem_bytes:进程组内存使用情况(字节)proc_count:进程组进程计数
PostgreSQL
pg_up:PostgreSQL导出器向上状态(1=向上,0=向下)pg_qps:PostgreSQL事务/秒(提交+回滚)pg_cache_hit_pct:PostgreSQL缓冲区缓存命中率(%)pg_active_conn:活动PostgreSQL连接
环境变量摘要⚙ENT
PROM_ENV_URLS={"prod":"http://...:9090","dev_test":"http://...:9090","dr":"http://...:9090"}
PROM_URL=http://...:9090
PROM_BEARER_TOKEN=
PROM_TIMEOUT_SEC=15
LOKI_ENV_URLS={"prod":"http://...:3100","dev_test":"http://...:3100"}
LOKI_URL=http://...:3100
LOKI_BEARER_TOKEN=
LOKI_TIMEOUT_SEC=15
ALERT_WARN_PCT=85
ALERT_CRIT_PCT=95
ALERT_SUSTAIN_MINUTES=5
PROM_MAX_SAMPLES_PER_SERIES=5000
PROM_MAX_PARALLEL_CHECKS=6
环境选择优先级:
environmentenv_hintPROM_URL后备方案
Loki环境选择优先级:
loki_environmentLOKI_URL后备方案
操作提示💡
- 输出报告时
%请明确标注单位。 - 单服务器检查
instance或server_name请使用滤镜。 disk_used_pct_by_mount值为0到100刻度。 (0.8=0.8%)- Loki查询前
list_loki_hosts或list_loki_apps先用确认候选值比较安全。
