30分钟搭好 Hermes Agent 性能监控:Prometheus + Grafana + Alertmanager 实战
【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent
深夜,群里有人喊:模型服务 P99 时延翻倍了,但日志一片祥和,根本无从下手。这个场景正是 Hermes Agent 性能监控要解决的问题——用 Prometheus 持续拉取指标、用 Grafana 把它们变成一张能读的大盘、再用 Alertmanager 在恶化前把你叫醒。下面按时间线走,从零到整套可用。
一条命令开启指标暴露,先让数据跑起来
以 Hermes Agent 自带的 vLLM 部署为例,启动时加两个参数即可把指标暴露在 9090 端口的/metrics上:
vllm serve meta-llama/Llama-3-8B-Instruct \ --enable-metrics \ --metrics-port 9090然后写一个最小可用的 Prometheus 配置(prometheus.yml),只保留一个抓取任务:
scrape_configs: - job_name: hermes-agent metrics_path: /metrics scrape_interval: 15s static_configs: - targets: ["localhost:9090"]启动 Prometheus 后,直接访问http://localhost:9091/targets(端口映射见后文),状态是 UP 就说明链路通了。想验证原始数据,curl localhost:9090/metrics | grep vllm能刷出一长串指标就是成功。
核心指标拆解:先盯住这四个信号
先把这四个指标看明白,大盘就成了一半。
| 指标名 | 含义 | PromQL 示例 | 参考告警阈值 |
|---|---|---|---|
vllm_request_success_total/vllm_request_failure_total | 成功/失败请求累计数,rate()换算成每秒速率 | rate(vllm_request_failure_total[5m]) / rate(vllm_request_success_total[5m] + vllm_request_failure_total[5m]) | 5 分钟失败率 > 5% |
vllm_time_to_first_token_seconds_bucket | 首 token 耗时直方图(histogram:把耗时切成一堆区间桶统计落点),用histogram_quantile就能算出任意分位 | histogram_quantile(0.99, sum(rate(vllm_time_to_first_token_seconds_bucket[5m])) by (le)) | P99 > 2s 持续 5 分钟 |
vllm_gpu_cache_usage_perc | GPU 上 KV 缓存(推理中间状态的存储区)占用比例 | vllm_gpu_cache_usage_perc | > 0.95 持续 5 分钟 |
vllm_num_requests_running/vllm_num_requests_waiting | 正在运行 / 排队等待的请求数 | vllm_num_requests_waiting | 排队数 > 0 持续 3 分钟 |
把指标摆进一张 Grafana AI 服务大盘
Grafana 里新建数据源指向 Prometheus,然后按"一眼能看出好坏"的顺序加面板:
- 请求成功率(用上面的失败率 PromQL,加一条 5% 的红色阈值线);
- 首 token 时延 P50 / P99 双曲线,用户体感变化第一时间可见;
- GPU 缓存使用率面积图,配 95% 阈值;
- 活跃 + 排队请求数,容量是否扛得住看这里。
先把这四块跑通,再往里加吞吐、错误分布等细节面板,别一上来就堆二十个图。
三条值得抄的模型服务告警规则
groups: - name: hermes-agent rules: - alert: HighErrorRate expr: rate(vllm_request_failure_total[5m]) / rate(vllm_request_success_total[5m] + vllm_request_failure_total[5m]) > 0.05 for: 2m labels: { severity: critical } - alert: SlowFirstToken expr: histogram_quantile(0.99, sum(rate(vllm_time_to_first_token_seconds_bucket[5m])) by (le)) > 2 for: 5m labels: { severity: warning } - alert: GPUCacheNearFull expr: vllm_gpu_cache_usage_perc > 0.95 for: 5m labels: { severity: warning }阈值为什么这么定:
- HighErrorRate:瞬时毛刺谁都有,用
for: 2m滤掉单次抖动,只留"真的在坏"的信号;5% 是多数推理服务可接受的底线。 - SlowFirstToken:首 token 超过 2 秒用户已经开始骂人,但冷启动、批处理波动会误报,所以
for给到 5 分钟。 - GPUCacheNearFull:KV 缓存快满时调度器会抢占重算,时延会先于错误率劣化,95% 是留出的缓冲线。
通知渠道选型上记住一条原则:critical走能吵醒人的即时通道(IM 强提醒或电话),warning走异步通道(邮件或工单),并按服务名分组抑制——同一服务多条 warning 合并成一条推送,否则你收到的会是风暴而不是信息。
用 Docker Compose 一键拉起监控栈
services: prometheus: image: prom/prometheus ports: ["9091:9090"] volumes: ["./prometheus.yml:/etc/prometheus/prometheus.yml"] grafana: image: grafana/grafana ports: ["3000:3000"] alertmanager: image: prom/alertmanager ports: ["9093:9093"] volumes: ["./alertmanager.yml:/etc/alertmanager/alertmanager.yml"]docker compose up -d之后,Prometheus 在 9091、Grafana 在 3000、Alertmanager 在 9093。模型服务本体按你自己的部署方式跑,只要把它的 9090 端口对 Prometheus 可达即可。生产环境如果跑在 K8s 上,把指标端口写成 Service 暴露、抓取交给集群内的 Prometheus Operator 就行,细节可参考项目里的 vLLM 部署文档。
排查与调优:四个高频问题的最短解法
| 现象 | 原因 | 处理 |
|---|---|---|
| Prometheus target 一直 DOWN,查无指标 | 9090 端口没对 Prometheus 可达,或metrics_path写错 | 在 Prometheus 所在机器curl目标地址的/metrics,通了再查防火墙/网络 |
| 告警风暴,同一问题刷屏 | 阈值太敏感、没加for窗口 | 给每条规则补for,Alertmanager 里按标签分组 + 抑制 |
| 大盘加载慢、查询卡 | 复杂 PromQL 每次实时计算 | 用 recording rules 把高频查询预计算成指标,面板直接引用 |
不知道scrape_interval设多少 | — | 15s 是大多数场景的甜点;关键服务压到 5s,但存储与 CPU 开销约涨 3 倍 |
从"猜"到"看盘定位"
做完这套,下次 P99 飙升时你打开 Grafana 就能在十秒内指认是错误率、时延还是容量先出的问题。更多指标细节和模型服务部署参数,直接翻项目里的 MLOps 模块 和 vLLM 技能文档。
【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考