Prometheus源码专题【左扬精讲】—— 监控系统 Prometheus 3.4.0 源码解析:scrape manager 与 scrapeLoop
Prometheus 作为开源监控系统的标杆,其数据采集机制是整个系统的核心组件。在 Prometheus 3.4.0 版本中,scrape manager(采样管理器)负责管理监控数据的采集流程,是连接服务发现和数据存储的桥梁。本专题将深入剖析 scrape manager 的实现原理,包括其总体工作流程、结构体定义以及对监控目标数据的加工过程,特别是以 scrapeLoop 为核心的样本数据处理机制。
一、scrape manager:监控目标的 “总调度中心”
scrape manager 的 核心职责 是统筹所有监控目标的生命周期管理与采集任务调度,其工作过程可拆解为三个关键阶段:
1.1、初始化与配置加载
启动时,scrape manager 会解析用户配置的 scrape_configs,通过 target_group 结构体封装每个 Job 的目标列表(包括静态配置、服务发现动态获取的目标)。同时初始化目标状态管理器,为每个目标分配唯一标识符(如 instance 标签),并记录其健康状态、上次采集时间等元数据。源码中通过 NewManager 函数完成基础组件初始化,包括注册 appendable 接口(用于将采集数据写入存储层)、启动周期性配置重载协程。
1.2、目标动态管理与调度
对于服务发现(如 Kubernetes、Consul)获取的动态目标,scrape manager 会通过 syncLoop 协程实时监听目标变更:当新增目标时,为其创建对应的 scrapeLoop;当目标下线或配置更新时,终止旧的 scrapeLoop 并清理资源。调度层面,scrape manager 基于每个 Job 的 scrape_interval 计算采集周期,通过时间轮算法(源码中 time.Duration 与 ticker 实现)触发各目标的采集任务,避免集中采集导致的资源峰值。
1.3、异常监控与资源控制
为防止单个目标采集阻塞影响全局,scrape manager 会对 scrapeLoop 进行超时监控(默认 10 秒),超时则强制终止并标记目标为 “不健康”。同时通过并发控制(默认每个 Job 最多 10 个并发采集)避免资源耗尽,这一机制在源码中由 scrapePool 结构体的 limiter 字段实现。
二、scrapeLoop:数据采集的 “执行单元”
每个监控目标对应一个 scrapeLoop 协程,其工作过程聚焦于“数据采集-解析-存储”的完整链路:
2.1、HTTP 请求构建与发送
根据配置的 scrape_timeout、headers 等参数,scrapeLoop 会构建 HTTP 请求(默认 GET 方法),并发送至目标的 /metrics 端点。源码中通过 client.Do 方法执行请求,同时支持 Basic Auth、TLS 加密等安全认证方式(由 config.ScrapeConfig 的 Authorization、TLSConfig 字段配置)。
2.2、指标解析与格式转换
接收到响应后,scrapeLoop 会调用 text.Parse 函数解析文本格式的指标数据,将其转换为 Prometheus 内部的 metric 结构体(包含名称、标签、值、时间戳等信息)。解析过程中会对指标名称进行合法性校验(如替换非法字符为下划线),并自动添加 job、instance 等默认标签(由 relabel_configs 配置可自定义)。
2.3、数据过滤与存储提交
通过 metric_relabel_configs 对指标进行过滤(如保留特定标签的指标)后,scrapeLoop 会将处理后的指标提交至 appendable 接口(通常指向本地 TSDB)。源码中通过 scrapePool.append 方法完成数据写入,同时记录采集成功 / 失败次数(用于 up 指标统计)。
三、解决的核心痛点
- 动态目标管理难题:通过服务发现与 scrapeLoop 动态创建 / 销毁,解决了容器、云环境中目标 IP 频繁变化的问题。
- 采集可靠性保障:超时控制、健康状态标记、并发限制机制,避免了单个故障目标拖垮整个监控系统。
- 数据一致性与标准化:统一的指标解析、标签处理流程,确保不同类型目标的监控数据格式一致,为后续查询、告警提供可靠基础。
- 资源高效利用:基于时间轮的调度算法与并发控制,平衡了采集频率与系统资源消耗,支持单节点监控数万个目标。
-
从源码设计来看,scrape manager 与 scrapeLoop 的分工明确:前者负责 “战略调度”,后者专注 “战术执行”,二者的协同既保证了大规模监控的灵活性,又确保了数据采集的稳定性,这也是 Prometheus 能够成为云原生监控事实标准的核心原因之一。
