如何用 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'])
# 由中间件在请求完成时传入路由模板、方法、状态和单调时钟测得的秒数
def record_request(endpoint, method, status, elapsed_seconds):
reqs.labels(endpoint=endpoint, method=method, status=str(status)).inc()
latency.labels(endpoint=endpoint).observe(elapsed_seconds)
核心 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 延迟
错误率在无流量时分母为 0,需按告警意图处理;histogram_quantile 是按桶估算而非精确 P95。多 worker Python 应按 prometheus_client 多进程模式配置汇总,不能假定单个 worker registry 覆盖全部请求。
外部探测: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 表示该次目标探测结果;up 仅表示 Prometheus 抓取 exporter 是否成功,不能混为一谈。证书指标 probe_ssl_earliest_cert_expiry 是 Unix 秒时间戳,剩余天数需用 (probe_ssl_earliest_cert_expiry - time()) / 86400。
常见问题(FAQ)
Q:endpoint 标签会不会高基数? 用路由模板(/users/:id)而非真实路径,否则每个 ID 一条序列。
Q:健康检查接口要不要埋点? 埋点但单独打标签,统计时过滤掉,避免稀释真实流量指标。