Prometheus:指标采集与查询¶
Prometheus 以带标签的时间序列保存数值指标,周期性抓取目标的 HTTP Metrics Endpoint,并使用 PromQL 查询、聚合和生成规则。它适合系统、容器和服务的趋势、比例、延迟与告警,不适合保存完整日志或计费明细。
Exporter / Application / Kubernetes
→ /metrics
→ Prometheus:Service Discovery → Scrape → TSDB
→ PromQL / Recording Rules / Alerting Rules
→ Grafana / Alertmanager / Remote Write
数据模型与指标类型¶
一条时序由指标名和完整标签集合唯一确定:
| 类型 | 含义 | 查询要点 |
|---|---|---|
| Counter | 只增或重启归零的累计值 | 用 rate()/increase() 看变化 |
| Gauge | 可增可减的瞬时值 | CPU 温度、连接数、队列长度 |
| Histogram | 按 bucket 统计分布,同时有 count/sum | 用 histogram_quantile() 算近似分位数 |
| Summary | 客户端计算分位数 | 跨实例难聚合,先确认使用边界 |
不要把用户 ID、订单号、原始 URL、异常消息做标签。标签组合数就是活跃时序数,高基数会推高内存、磁盘和查询成本。
抓取配置¶
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_configs:
- job_name: linux
static_configs:
- targets: ["10.0.0.11:9100", "10.0.0.12:9100"]
labels:
environment: production
生产中常通过 Kubernetes 服务发现、Consul 或文件服务发现动态获取目标。Relabel 用于修改发现标签和筛选 Target;Metric Relabel 在抓取后丢弃/修改样本,配置不当会造成静默丢数。
常见 Exporter¶
| 来源 | 方式 |
|---|---|
| Linux | node_exporter |
| HTTP/TCP/DNS/TLS 黑盒探测 | blackbox_exporter |
| Java/Spring | Micrometer + Actuator /actuator/prometheus |
| Kubernetes | kube-state-metrics、kubelet/cAdvisor |
| 数据库/中间件 | 产品原生指标或专用 Exporter |
Exporter 运行正常不代表采集正常,还要在 Prometheus Targets 检查 UP、最后抓取时间和错误。
PromQL 基础¶
# Target 是否可抓取
up == 0
# 每秒请求率
sum by (service) (rate(http_server_requests_total[5m]))
# 5xx 比例
sum by (service) (rate(http_server_requests_total{status=~"5.."}[5m]))
/
sum by (service) (rate(http_server_requests_total[5m]))
# P95 延迟(经典 Histogram)
histogram_quantile(
0.95,
sum by (le, service) (rate(http_server_request_duration_seconds_bucket[5m]))
)
# 主机可用内存比例
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
rate() 窗口过短会因样本不足抖动;聚合时保留告警和定位需要的标签。平均值会掩盖长尾,应结合 P95/P99、最大值和分布。
Recording Rule 与 Alerting Rule¶
复杂且频繁查询可预计算为 Recording Rule,告警规则则产生告警状态:
groups:
- name: service.rules
rules:
- record: service:http_requests:rate5m
expr: sum by (service) (rate(http_server_requests_total[5m]))
- alert: TargetDown
expr: up == 0
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $labels.job }} / {{ $labels.instance }} 无法采集"
Prometheus 计算规则,Alertmanager 负责去重、分组、路由、抑制、静默和通知。告警应有负责人、Runbook 和可执行动作。
Remote Write 与高可用¶
Prometheus 本地 TSDB 适合独立可靠运行;需要长期保留、多集群汇聚或横向查询时,可 Remote Write 到 VictoriaMetrics 等后端。两台 Prometheus 高可用抓取会产生两份带不同 replica 标签的数据,查询端需要正确去重,不能假设共享磁盘即可高可用。
排障顺序¶
- Target 是否在服务发现结果中。
- Prometheus 到目标的 DNS、网络、TLS、认证是否正常。
/metrics是否响应及时、格式是否正确。- Relabel 是否把目标或样本丢掉。
- TSDB/Remote Write 队列是否报错或积压。
- 查询时间、标签和数据源是否正确。
官方参考:Prometheus Overview、PromQL、Rules。