3. Prometheus 采集架构:Pull模型、Push模型、采集作业生命周期

Prometheus 的采集架构是其性能基准测试与压测设计的核心基础。理解 Pull 模型、Push 模型 以及 采集作业(Scrape Job)生命周期,是后续制定压测指标、配置负载模型、分析瓶颈的前提。本章从架构原理出发,逐步拆解这三个关键概念。

3.1 Pull 模型:主动拉取架构

Prometheus 默认采用 Pull(拉取)模型。在这种架构中,Prometheus Server 作为主动方,定期向配置好的目标(Target)发起 HTTP 请求,获取指标数据。这种设计将采集控制权集中在 Server 端,便于统一调度与故障管理。

核心特征: Server 主动连接 Target,Target 只需暴露 /metrics 端点,无需感知 Prometheus 的存在。

Pull 模型工作流程

  1. 服务发现 / 静态配置: Prometheus 通过服务发现(Consul、Kubernetes)或静态配置文件(scrape_configs)获取目标列表。
  2. HTTP GET 请求: 每个采集周期,Prometheus 向目标的 /metrics 端点发送 HTTP GET 请求。
  3. 响应解析: 接收并解析返回的文本格式指标数据(Prometheus Exposition Format)。
  4. 数据存储: 解析后的样本数据经过标签处理、时间戳对齐后写入本地存储(TSDB)。

Pull 模型优缺点对比

维度 优势 劣势
控制权 Server 端统一控制采集频率、超时、重试,易于做负载均衡 Target 必须网络可达,对网络防火墙策略要求较高
健康检查 Pull 失败即代表 Target 不可用,天然具备 Up/Down 检测 无法主动推送告警,依赖 Server 端判断
扩展性 可通过分片(Sharding)水平扩展采集能力 大量短生命周期任务(如 CronJob)可能导致采集遗漏
安全性 Server 端可配置 TLS、Basic Auth 统一认证 Target 需暴露端口,增加攻击面

3.2 Push 模型:被动接收架构

虽然 Prometheus 原生是 Pull 模型,但在某些场景(如批处理任务、防火墙隔离的网络、IoT 设备)下,Target 无法被 Server 直接访问。此时需要 Push 模型 作为补充。Prometheus 通过 Pushgateway 组件实现 Push 能力。

适用场景: 短生命周期任务(如 Spark Job)、网络隔离区(DMZ)内的服务、无法长期暴露 /metrics 端点的临时进程。

Push 模型工作流程

  • 客户端推送: 任务进程在结束时,将指标数据通过 HTTP POST 推送到 Pushgateway。
  • 中间缓存: Pushgateway 作为指标缓存层,持久保留最后一次推送的数据。
  • Server 拉取: Prometheus Server 仍然使用 Pull 模型,从 Pushgateway 的 /metrics 端点拉取聚合后的指标。

Pull vs Push 模型决策矩阵

决策条件 推荐模型 原因
长期运行的服务(Web、DB) Pull 便于统一管理采集周期、健康检查、水平分片
批处理 / 定时任务 Push 任务结束后进程退出,无法被 Pull;Pushgateway 缓存最终状态
网络隔离 / NAT 环境 Push Target 无法被 Server 直接路由,只能主动外连 Pushgateway
高基数 / 大规模集群 Pull Pushgateway 会成为单点瓶颈,且无法处理高基数标签

3.3 采集作业生命周期

一个完整的 Scrape Job(采集作业) 从配置加载到数据落盘,经历多个阶段。理解每个阶段的耗时与资源消耗,是压测中定位瓶颈的关键。

生命周期阶段分解

  1. 配置加载与目标发现: Prometheus 定期重新加载 scrape_configs,通过服务发现或文件 SD 更新目标列表。此阶段涉及网络请求(如 Consul API)或文件 I/O。
  2. 目标实例化: 为每个目标创建 ScrapePool 和 ScrapeLoop,分配采集周期、超时、标签等参数。
  3. HTTP 请求阶段:
    • DNS 解析(如果目标使用主机名)
    • TCP 连接建立(三次握手)
    • TLS 握手(如果启用 HTTPS)
    • 发送 HTTP GET 请求
    • 等待响应(Server 处理时间 + 网络延迟)
    • 读取响应体(指标数据流)
  4. 数据解析与标签处理:
    • 解析 Prometheus Exposition Format 或 Protobuf
    • 应用 relabel_configs(标签重写、丢弃、保留)
    • 执行 metric_relabel_configs(指标级标签操作)
  5. 样本存储: 将解析后的样本追加到 TSDB 的 Head Block,触发预写日志(WAL)写入。
压测关注点: 在压测中,HTTP 请求阶段 和 数据解析阶段 是 CPU 和网络 I/O 的主要消耗点。如果目标响应缓慢或返回大量指标,会导致采集超时(scrape_timeout)和样本丢失。

采集作业生命周期流程图

Scrape Job 生命周期 Scrape Job 生命周期阶段 1. 配置加载 服务发现 / 文件 SD 2. 目标实例化 ScrapePool / Loop 3. HTTP 请求 GET /metrics 4. 数据解析 Relabel / 格式转换 5. 样本存储 TSDB / WAL 写入 压测关注点 • 阶段3 (HTTP请求): 网络延迟、目标响应时间、连接池耗尽 • 阶段4 (数据解析): CPU 消耗、Relabel 规则复杂度、指标基数

3.4 采集性能关键参数

在压测中,以下参数直接影响采集作业的性能表现,需要在测试方案中明确配置:

参数 默认值 压测影响
scrape_interval 1m 决定采集频率,越短则 Server 负载越高,网络连接数越多
scrape_timeout 10s 超时后该次采集失败,影响 up 指标和样本完整性
sample_limit 0(无限制) 限制每个目标返回的最大样本数,防止内存溢出
relabel_configs 无 复杂的正则匹配和标签操作会显著增加解析阶段的 CPU 开销
honor_labels false 控制冲突标签处理策略,影响最终存储的标签数量
压测基线建议: 在基准测试中,建议从 scrape_interval=15s、scrape_timeout=10s、sample_limit=10000 开始,逐步增加目标数量和指标基数,观察 Server 的 CPU、内存、网络 I/O 变化曲线。