4. 指标采集优化:Scrape Interval、Scrape Timeout、Sample Limit 的合理配置策略

指标采集是 Prometheus 生态中最基础也最关键的环节。Scrape Interval(采集间隔)、Scrape Timeout(采集超时)和 Sample Limit(样本数限制)三个参数直接决定了采集系统的稳定性、资源消耗和数据完整性。本章从工程实践角度,给出这三者的配置策略与调优方法。

4.1 三个核心参数的定义与关系

在 Prometheus 的 scrape_config 中,这三个参数共同作用于每一次采集任务:

参数 默认值 作用域 核心作用
scrape_interval 1m 全局 / Job / 实例 控制采集频率,决定数据时间粒度
scrape_timeout 10s 全局 / Job / 实例 单次采集的最大等待时间,防止挂起
sample_limit 0(无限制) 全局 / Job / 实例 限制单次采集返回的样本数上限,防止内存爆炸

三者之间存在严格的约束关系:scrape_timeout 必须小于 scrape_interval,否则超时设置将失去意义。通常建议 scrape_timeout ≤ scrape_interval × 0.8,为网络抖动和重试预留缓冲。

关键公式: 采集成功率 = 成功采集次数 / 总采集次数。当 scrape_timeout 接近 scrape_interval 时,一次超时可能导致后续采集队列阻塞,形成“超时雪崩”。

4.2 Scrape Interval:频率与成本的平衡

采集间隔越短,数据点越密集,但 CPU、内存、网络和存储开销也线性增长。不同场景的推荐配置:

  • 基础设施指标(CPU、内存、磁盘): 15s – 30s。变化较慢,无需过密采集。
  • 业务关键指标(QPS、延迟、错误率): 10s – 15s。需要快速感知异常。
  • 高基数指标(HTTP 请求标签、用户维度): 30s – 60s。降低采集频率以控制样本总量。
  • 批处理或离线任务指标: 60s – 120s。任务周期长,高频采集无意义。
实践建议: 在全局配置中设置保守的默认值(如 30s),然后在每个 Job 中按需覆盖。避免全局使用 5s 或 10s 这种激进值,除非你有充足的资源预算。

4.3 Scrape Timeout:防止采集挂起

超时设置过短会导致正常指标被丢弃;设置过长则可能让采集协程长时间阻塞,耗尽连接池。配置策略如下:

  • 基础原则: scrape_timeout = scrape_interval × 0.6 ~ 0.8。
  • 对于慢速 exporter(如 SNMP、数据库查询): 适当放宽超时,但不要超过 scrape_interval 的 90%。
  • 对于高并发 exporter: 缩短超时,快速失败,避免排队阻塞。
  • 监控超时率: 通过 prometheus_target_scrapes_exceeded_sample_limit_total 和 prometheus_target_scrapes_timeout_total 指标观察超时趋势。
常见陷阱: 当 scrape_timeout 设置为 10s,scrape_interval 设置为 10s 时,如果某次采集耗时 9.9s,下一次采集将立即开始,导致两个采集协程重叠,CPU 和内存瞬时翻倍。务必留出时间余量。

4.4 Sample Limit:内存保护的最后防线

Sample Limit 是防止 Prometheus 内存溢出的关键参数。当某个 exporter 返回的样本数超过限制时,Prometheus 会丢弃该次采集并记录错误,而不是继续处理。

场景 推荐 sample_limit 说明
常规 exporter(node_exporter) 5000 – 10000 node_exporter 通常返回 2000-5000 个样本
业务应用(Java、Go 应用) 10000 – 50000 根据业务指标数量调整
高基数 exporter(kube-state-metrics) 50000 – 200000 需要结合标签基数评估
未知或不可控 exporter 5000(保守值) 先限制,再逐步放宽

设置 sample_limit 后,务必监控 prometheus_target_scrapes_exceeded_sample_limit_total 指标。如果该指标持续增长,说明限制过紧,需要分析 exporter 的指标输出并调整限制值。

4.5 三参数协同配置流程

下图展示了从评估到部署的完整配置流程:

三参数协同配置流程 评估指标基数与变化频率 确定 scrape_interval 计算 scrape_timeout(0.6~0.8倍) 设置 sample_limit(保守值) 监控超时/超限指标,逐步调整 反馈循环 根据监控指标持续 优化三个参数

4.6 典型配置示例

以下是一个生产环境的 Job 配置示例,展示了三个参数的协同设置:

scrape_configs:
  - job_name: 'node_exporter_production'
    scrape_interval: 30s
    scrape_timeout: 20s
    sample_limit: 10000
    static_configs:
      - targets: ['10.0.1.10:9100', '10.0.1.11:9100']

  - job_name: 'business_api_high_freq'
    scrape_interval: 10s
    scrape_timeout: 8s
    sample_limit: 50000
    static_configs:
      - targets: ['10.0.2.20:8080']

  - job_name: 'kube_state_metrics'
    scrape_interval: 60s
    scrape_timeout: 30s
    sample_limit: 200000
    static_configs:
      - targets: ['10.0.3.30:8080']

4.7 参数配置的常见误区

误区 后果 正确做法
全局使用 5s 采集间隔 CPU 和内存飙升,存储膨胀 12 倍 按 Job 差异化设置,默认 30s
scrape_timeout = scrape_interval 采集重叠,协程堆积 超时 ≤ 间隔 × 0.8
不设置 sample_limit 单个 exporter 异常导致 OOM 至少设置 5000 作为保护
sample_limit 设置过小 正常指标被丢弃,监控缺失 监控超限指标,逐步放宽

4.8 监控参数效果的指标

部署配置后,通过以下 Prometheus 内置指标验证效果:

  • prometheus_target_scrapes_exceeded_sample_limit_total — 样本超限次数
  • prometheus_target_scrapes_timeout_total — 采集超时次数
  • prometheus_target_scrapes_sample_duplicate_timestamp_total — 重复时间戳样本数
  • prometheus_target_scrapes_sample_out_of_order_total — 乱序样本数
  • scrape_duration_seconds — 实际采集耗时分布
调优目标: 确保 prometheus_target_scrapes_exceeded_sample_limit_total 和 prometheus_target_scrapes_timeout_total 在 24 小时内保持为 0 或极低值。如果持续增长,说明参数配置需要调整。

4.9 总结

Scrape Interval、Scrape Timeout 和 Sample Limit 是 Prometheus 采集优化的三个核心旋钮。合理的配置策略应遵循以下原则:

  • 差异化: 不同 Job 使用不同参数,避免一刀切。
  • 留余量: 超时时间必须小于采集间隔,为网络抖动预留空间。
  • 设上限: 始终设置 sample_limit,防止异常 exporter 拖垮 Prometheus。
  • 可观测: 通过内置指标持续监控采集健康度,形成闭环调优。