名称: 指标分析 描述: Prometheus/Grafana指标分析和PromQL查询。用于调查延迟、错误率、资源使用或任何时间序列指标。 允许工具: Bash(python *)
指标分析
认证
重要: 凭据通过代理层自动注入。不要检查环境变量中的GRAFANA_API_KEY或PROMETHEUS_URL——它们不会对您可见。直接运行脚本即可;认证是透明处理的。
核心原则: USE & RED方法
USE方法(用于基础设施):
- Utilization - 资源有多忙?
- Saturation - 有多少工作排队?
- Errors - 是否有错误事件?
RED方法(用于服务):
- Rate - 每秒请求数
- Errors - 错误率
- Duration - 延迟分布
可用脚本
所有脚本都在.claude/skills/metrics-analysis/scripts/中
query_prometheus.py - 执行PromQL查询
python .claude/skills/metrics-analysis/scripts/query_prometheus.py --query PROMQL [--time-range MINUTES] [--step STEP]
# 示例:
python .claude/skills/metrics-analysis/scripts/query_prometheus.py --query "up"
python .claude/skills/metrics-analysis/scripts/query_prometheus.py --query "rate(http_requests_total[5m])" --time-range 60
python .claude/skills/metrics-analysis/scripts/query_prometheus.py --query "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))"
list_dashboards.py - 查找Grafana仪表板
python .claude/skills/metrics-analysis/scripts/list_dashboards.py [--query SEARCH_TERM]
# 示例:
python .claude/skills/metrics-analysis/scripts/list_dashboards.py
python .claude/skills/metrics-analysis/scripts/list_dashboards.py --query "api"
get_alerts.py - 检查触发警报
python .claude/skills/metrics-analysis/scripts/get_alerts.py [--state STATE]
# 示例:
python .claude/skills/metrics-analysis/scripts/get_alerts.py
python .claude/skills/metrics-analysis/scripts/get_alerts.py --state alerting
PromQL快速参考
基本查询
# 瞬时向量 - 当前值
http_requests_total{service="api"}
# 范围向量 - 时间内的值(用于速率计算)
http_requests_total{service="api"}[5m]
# 每秒增长率
rate(http_requests_total{service="api"}[5m])
常见运算符
# 速率(计数器→仪表,每秒)
rate(http_requests_total[5m])
# 增量(时间范围内的总增量)
increase(http_requests_total[1h])
# 时间平均
avg_over_time(cpu_usage[5m])
# 直方图分位数(p95, p99)
histogram_quantile(0.95, rate(http_request_duration_bucket[5m]))
聚合
# 跨所有实例求和
sum(rate(http_requests_total[5m]))
# 按标签分组
sum by (service) (rate(http_requests_total[5m]))
# 按标签平均
avg by (instance) (cpu_usage)
# 按值前5
topk(5, sum by (service) (rate(http_requests_total[5m])))
标签匹配
# 精确匹配
http_requests_total{status="500"}
# 正则匹配
http_requests_total{status=~"5.."}
# 不等于
http_requests_total{status!="200"}
# 多标签
http_requests_total{service="api", status=~"5.."}
调查工作流程
1. 延迟调查
# 步骤1: 检查整体延迟趋势
python query_prometheus.py --query 'histogram_quantile(0.95, rate(http_request_duration_seconds_bucket{service="api"}[5m]))' --time-range 60
# 步骤2: 比较p50与p99
python query_prometheus.py --query 'histogram_quantile(0.50, rate(http_request_duration_seconds_bucket{service="api"}[5m]))'
# 步骤3: 按端点细分
python query_prometheus.py --query 'histogram_quantile(0.95, sum by (endpoint) (rate(http_request_duration_seconds_bucket{service="api"}[5m])))'
2. 错误率调查
# 步骤1: 整体错误率
python query_prometheus.py --query 'sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))'
# 步骤2: 按状态码错误
python query_prometheus.py --query 'sum by (status) (rate(http_requests_total{status=~"[45].."}[5m]))'
# 步骤3: 按服务错误
python query_prometheus.py --query 'sum by (service) (rate(http_requests_total{status=~"5.."}[5m]))'
3. 资源调查(CPU/内存)
# CPU使用率
python query_prometheus.py --query 'avg by (instance) (rate(container_cpu_usage_seconds_total{pod=~"api-.*"}[5m]))'
# 内存使用百分比
python query_prometheus.py --query 'container_memory_usage_bytes{pod=~"api-.*"} / container_spec_memory_limit_bytes{pod=~"api-.*"}'
快速命令参考
| 目标 | 命令 |
|---|---|
| 请求速率 | query_prometheus.py --query "sum(rate(http_requests_total[5m]))" |
| 错误速率 | query_prometheus.py --query "sum(rate(http_requests_total{status=~'5..'}[5m]))" |
| P95延迟 | query_prometheus.py --query "histogram_quantile(0.95, ...)" |
| CPU使用率 | query_prometheus.py --query "rate(container_cpu_usage_seconds_total[5m])" |
| 查找仪表板 | list_dashboards.py --query "api" |
| 检查警报 | get_alerts.py --state alerting |
常见指标模式
请求指标
http_requests_total # 计数器
http_request_duration_seconds_bucket # 直方图
http_requests_in_flight # 仪表
Kubernetes指标
container_cpu_usage_seconds_total
container_memory_usage_bytes
kube_pod_container_status_restarts_total
kube_pod_status_phase
应避免的反模式
- ❌ 使用
rate()没有范围向量 - 总是包含[5m]或类似 - ❌ 直接比较计数器 - 先使用
rate()或increase() - ❌ 错误的分位数计算 -
histogram_quantile需要_bucket指标 - ❌ 缺少标签过滤器 - 没有过滤器的查询返回所有系列
- ❌ 时间范围太短 - 使用至少2倍的抓取间隔用于
rate()