如何用 Prometheus 监控 REST API?
监控 REST API 的两条路径:应用内埋点暴露 /metrics(请求数、延迟、错误率 RED 三指标),或用 blackbox_exporter 从外部探测可用性与响应时间。本文给出两种方案的配置与查询示例。
监控 REST API 标准做法是"内外结合":应用内用客户端库暴露 RED 指标(Rate/Errors/Duration),外部用 blackbox_exporter 定时探测端点可用性——前者看服务质量,后者看用户视角的可达性。
内部埋点:RED 三指标
以 Python 为例:
from prometheus_client import Counter, Histogram
reqs = Counter('api_requests_total', 'API requests', ['endpoint', 'method', 'status'])
latency = Histogram('api_request_duration_seconds', 'API latency', ['endpoint'])
# 中间件里:
reqs.labels(endpoint='/users', method='GET', status='200').inc()
latency.labels(endpoint='/users').observe(elapsed)
核心 PromQL:
sum(rate(api_requests_total{status=~"5.."}[5m])) / sum(rate(api_requests_total[5m])) # 错误率
histogram_quantile(0.95, sum(rate(api_request_duration_seconds_bucket[5m])) by (le)) # P95 延迟
外部探测:blackbox_exporter
# prometheus.yml
- job_name: 'api-probe'
metrics_path: /probe
params: {module: [http_2xx]}
static_configs:
- targets: ['https://api.example.com/health']
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
产出 probe_success(可用性)、probe_duration_seconds(响应时间)、证书剩余天数等指标。
观测云对照
观测云把这两条路径都产品化了:内部——应用接入 OpenTelemetry 后经 DataKit 上报,APM 自动产出每个接口的请求量、错误率、延迟分位数;外部——「可用性监测」(云拨测)从全球节点定时探测 API,TLS 证书到期、响应超时自动告警,无需自建 blackbox_exporter。
常见问题(FAQ)
Q:endpoint 标签会不会高基数? 用路由模板(/users/:id)而非真实路径,否则每个 ID 一条序列。
Q:健康检查接口要不要埋点? 埋点但单独打标签,统计时过滤掉,避免稀释真实流量指标。