3、采集作业概念:什么是采集作业(scrape job)、静态配置与动态发现、作业的生命周期
3.1 什么是采集作业(Scrape Job)
采集作业(Scrape Job)是 Prometheus 获取监控指标数据的核心执行单元。它定义了一组具有相同采集策略的目标端点集合,以及如何从这些端点拉取(Pull)数据的规则。每个采集作业在 Prometheus 配置文件中通过 scrape_configs 字段定义,是连接 Prometheus 服务器与监控目标的桥梁。
核心要点: 一个 Scrape Job = 一组目标 + 一套采集参数(间隔、超时、标签、认证等)。
| 配置项 | 说明 | 示例值 |
|---|---|---|
job_name |
作业名称,唯一标识 | node_exporter |
scrape_interval |
采集频率 | 15s |
scrape_timeout |
单次采集超时 | 10s |
metrics_path |
指标路径 | /metrics |
scheme |
协议 | http / https |
static_configs |
静态目标列表 | targets: ['localhost:9100'] |
# 一个完整的采集作业配置示例
scrape_configs:
- job_name: 'node_exporter'
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: '/metrics'
scheme: 'http'
static_configs:
- targets:
- '192.168.1.10:9100'
- '192.168.1.11:9100'
labels:
env: 'production'
region: 'us-east-1'
3.2 静态配置与动态发现
Prometheus 支持两种目标管理方式:静态配置和动态发现。静态配置适用于基础设施稳定、目标数量固定的场景;动态发现则适用于云原生、容器化等目标频繁变动的环境。
选型建议: 生产环境中,建议将静态配置用于核心基础设施(如 Prometheus 自身、关键数据库),动态发现用于弹性伸缩的工作负载(如 Kubernetes Pods、ECS 实例)。
3.2.1 静态配置(Static Config)
在配置文件中直接列出所有目标地址和标签。配置简单直观,但每次目标变更都需要重启 Prometheus 或触发配置重载。
3.2.2 动态发现(Service Discovery)
Prometheus 通过集成各种服务发现机制,自动获取目标列表并实时更新。支持的发现方式包括:
- Kubernetes SD:自动发现 Pod、Service、Node、Endpoint 等资源。
- Consul SD:通过 Consul 注册中心发现服务。
- EC2 SD:自动发现 AWS EC2 实例。
- File SD:监听本地文件变化,动态加载目标列表。
- DNS SD:通过 DNS SRV 记录发现目标。
# 基于文件发现的动态配置示例
scrape_configs:
- job_name: 'file_sd_demo'
file_sd_configs:
- files:
- 'targets/*.json'
refresh_interval: 5m
注意: 动态发现虽然灵活,但会增加 Prometheus 的 CPU 和内存开销。对于大规模集群(数千个目标),需要合理配置
relabel_configs 来过滤和缩减目标数量。
3.3 采集作业的生命周期
一个采集作业从定义到停止,经历完整的生命周期阶段。理解每个阶段有助于排查采集问题、优化性能。
| 阶段 | 触发条件 | 关键行为 | 常见问题 |
|---|---|---|---|
| 1. 定义 | 配置文件加载 / 重载 | 解析 scrape_configs,校验语法 |
YAML 格式错误、job_name 重复 |
| 2. 初始化 | 作业首次生效 | 创建采集器、初始化目标列表、应用 relabel | 服务发现超时、认证失败 |
| 3. 采集循环 | 每个 scrape_interval |
HTTP GET 请求 → 解析响应 → 存储样本 | 超时、目标不可达、指标格式错误 |
| 4. 目标更新 | 动态发现变更 / 文件更新 | 增删目标、更新标签、重新计算 hash | 目标抖动、标签冲突 |
| 5. 停止/移除 | 配置删除 / Prometheus 关闭 | 清理采集器、释放内存、停止 goroutine | 残留指标、内存泄漏(罕见) |
3.4 作业生命周期中的关键指标
Prometheus 为每个采集作业自动生成以下内置指标,用于监控作业自身的运行状态:
up{job="<job_name>"}:目标是否可达(1=正常,0=失败)。scrape_duration_seconds:单次采集耗时。scrape_samples_scraped:本次采集到的样本数。scrape_samples_post_metric_relabeling:经过 relabel 后的样本数。scrape_series_added:新增的时间序列数量。
运维最佳实践: 在 Prometheus 告警规则中,对
up == 0 设置告警,并监控 scrape_duration_seconds 是否接近 scrape_timeout,以提前发现采集瓶颈。