17.4.8 常见采集故障排查与优化

常见采集故障排查与优化需从目标可达性、Exporter健康、抓取配置、标签设计与存储压力五个维度入手,结合Prometheus自身指标进行闭环定位。以下给出系统化排查流程、命令示例与练习,确保采集稳定、延迟可控与成本可预期。

文章图片

一、抓取失败与目标不可达#

  • 现象:Targets页面显示DOWN,scrape_duration_seconds缺失或up=0

  • 排查步骤与命令
    1. 网络连通性
    ```bash
    # 基础连通性
    ping -c 2 10.10.10.20

    # 端口连通
    nc -zv 10.10.10.20 9100

    # 直接抓取Exporter
    curl -sS http://10.10.10.20:9100/metrics | head
    `` **说明**:nc -zv验证端口,curl`验证HTTP响应与指标内容。

  1. 服务监听检查(以node_exporter为例)
    bash ss -lntp | grep 9100 systemctl status node_exporter journalctl -u node_exporter -n 50 --no-pager

  2. TLS/鉴权验证
    bash # 若启用HTTPS与Bearer Token curl -sS --cacert /etc/prometheus/certs/ca.pem \ -H "Authorization: Bearer $(cat /etc/prometheus/token)" \ https://10.10.10.20:9100/metrics | head

  3. Prometheus抓取配置核查
    bash # 查看配置与目标是否匹配 promtool check config /etc/prometheus/prometheus.yml
    关键配置示例:
    ```yaml
    # /etc/prometheus/prometheus.yml
    scrape_configs:

    • job_name: 'node'
      static_configs:
      • targets: ['10.10.10.20:9100']
        ```
  • 优化建议
  • 使用relabel_configs过滤无效目标,减少无意义抓取。
  • 对易波动目标加drop策略,避免告警风暴。

  • 练习
    1. 故意关闭Exporter:systemctl stop node_exporter,观察Targets变化。
    2. 恢复后确认up恢复为1,并在Graph中查询up{job="node"}

二、采集超时与抓取过慢#

  • 现象scrape_timeout触发,scrape_duration_seconds接近或超过timeout

  • 排查步骤与命令
    1. Exporter性能
    bash top -p $(pgrep -f node_exporter)
    2. 依赖链路阻塞(应用Exporter)
    bash curl -sS -w "\nTotal:%{time_total}s\n" http://10.10.10.30:9113/metrics >/dev/null
    3. 抓取周期确认
    bash grep -n "scrape_interval\|scrape_timeout" /etc/prometheus/prometheus.yml

  • 优化建议(配置示例)
    ```yaml
    # /etc/prometheus/prometheus.yml
    global:
    scrape_interval: 30s
    scrape_timeout: 10s

scrape_configs:
- job_name: 'heavy_app'
scrape_interval: 60s
scrape_timeout: 15s
metrics_path: /metrics
```

  • 练习
    1. 将某个job的scrape_interval设为5s,观察prometheus_target_scrapes_exceeded_sample_limit_total变化。
    2. 调回30s并记录prometheus_target_scrape_pool_exceeded_label_limits_total是否下降。

三、指标缺失或异常波动#

  • 现象:关键指标突然为空、断点或短时间内抖动。

  • 排查步骤与命令
    1. Exporter日志
    bash journalctl -u node_exporter -n 100 --no-pager
    2. 版本兼容性检查
    bash node_exporter --version prometheus --version
    3. 标签变更导致查询失配
    promql # 对比标签集合是否变化 count by(instance,job)(up)

  • 优化建议

  • 版本升级前对比/metrics输出,记录指标名变化。
  • 为关键指标做录制规则,平滑短期波动。

  • 录制规则示例
    ```yaml
    # /etc/prometheus/rules/recording.yml
    groups:

    • name: node_recording
      rules:
      • record: instance:cpu:avg
        expr: avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)
        ```
  • 练习
    1. 修改Exporter版本(或切换到旧版本容器)观察指标名变化。
    2. 通过promtool check rules验证规则文件:
    bash promtool check rules /etc/prometheus/rules/recording.yml

四、标签爆炸与高基数问题#

  • 现象:时序数量暴涨、内存上涨、查询变慢。

  • 排查步骤与命令
    1. TSDB自监控
    promql prometheus_tsdb_head_series prometheus_tsdb_head_chunks
    2. 高基数标签定位
    promql # 查看某指标的标签数量 count by (job)({__name__=~".+"})
    3. Exporter输出检查
    bash curl -sS http://10.10.10.40:9100/metrics | grep -E "request_id|session_id" | head

  • 优化建议(剔除高基数标签)
    ```yaml
    # /etc/prometheus/prometheus.yml
    scrape_configs:

    • job_name: 'app'
      static_configs:
      • targets: ['10.10.10.40:9100']
        metric_relabel_configs:
      • source_labels: [request_id,session_id]
        action: labeldrop
        ```
  • 练习
    1. 人为加入一个动态标签(如请求ID)后,观察prometheus_tsdb_head_series变化。
    2. 应用labeldrop后对比前后变化。

五、抓取与存储资源瓶颈#

  • 现象:Prometheus CPU高、磁盘IO或容量压力大。

  • 排查步骤与命令
    1. 采集规模
    promql count by(job)(up)
    2. TSDB压缩与耗时
    promql rate(prometheus_tsdb_compactions_total[5m]) prometheus_tsdb_compaction_duration_seconds_sum
    3. 磁盘空间
    bash du -sh /var/lib/prometheus df -h /var/lib/prometheus

  • 优化建议

  • 调整保留周期与远程存储。
  • 高查询频次建立录制规则。
  • 拆分Prometheus实例或联邦。

  • 保留周期与远程写示例
    ```yaml
    # /etc/prometheus/prometheus.yml
    global:
    scrape_interval: 30s

storage:
tsdb:
retention_time: 15d

remote_write:
- url: "http://remote-storage:9201/api/v1/write"
```

六、采集配置最佳实践(含示例)#

  • 超时与间隔timeout < interval,推荐1:2或1:3。
  • 目标分组:按业务拆分Job,核心指标优先保障。
  • 限流与保护:为Exporter配置系统层限流。

示例(按业务拆分):

scrape_configs:
  - job_name: 'core'
    scrape_interval: 15s
    static_configs:
      - targets: ['10.10.10.20:9100']

  - job_name: 'non_core'
    scrape_interval: 60s
    static_configs:
      - targets: ['10.10.10.30:9100']

七、典型问题速查表(含命令)#

  • UP=0:网络不通/端口未监听/鉴权错误
    命令:curl http://target:port/metrics
  • Timeout:Exporter响应慢/依赖阻塞/抓取周期过短
    命令:curl -w "Total:%{time_total}s\n" http://target:port/metrics
  • 指标缺失:Exporter报错/版本变更/标签变动
    命令:journalctl -u exporter -n 50
  • 内存暴涨:标签爆炸/采集规模失控
    命令:prometheus_tsdb_head_series
  • 查询慢:高基数查询/缺少录制规则
    命令:top/api/v1/query?query=...

通过以上排查路径与优化措施,并结合命令、配置与自监控指标,可快速定位采集问题根因,控制时序增长与性能风险,保障监控系统稳定运行与可持续扩展。