当前位置: 首页 > news >正文

Prometheus源码专题【左扬精讲】—— 监控系统 Prometheus 3.4.0 源码解析:scrape manager 与 scrapeLoop

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.Durationticker 实现)触发各目标的采集任务,避免集中采集导致的资源峰值。

1.3、异常监控与资源控制​

为防止单个目标采集阻塞影响全局,scrape manager 会对 scrapeLoop 进行超时监控(默认 10 秒),超时则强制终止并标记目标为 “不健康”。同时通过并发控制(默认每个 Job 最多 10 个并发采集)避免资源耗尽,这一机制在源码中由 scrapePool 结构体的 limiter 字段实现。

二、scrapeLoop:数据采集的 “执行单元”

每个监控目标对应一个 scrapeLoop 协程,其工作过程聚焦于“数据采集-解析-存储”的完整链路:

2.1、HTTP 请求构建与发送

根据配置的 scrape_timeoutheaders 等参数,scrapeLoop 会构建 HTTP 请求(默认 GET 方法),并发送至目标的 /metrics 端点。源码中通过 client.Do 方法执行请求,同时支持 Basic Auth、TLS 加密等安全认证方式(由 config.ScrapeConfigAuthorizationTLSConfig 字段配置)。

2.2、指标解析与格式转换

接收到响应后,scrapeLoop 会调用 text.Parse 函数解析文本格式的指标数据,将其转换为 Prometheus 内部的 metric 结构体(包含名称、标签、值、时间戳等信息)。解析过程中会对指标名称进行合法性校验(如替换非法字符为下划线),并自动添加 job、instance 等默认标签(由 relabel_configs 配置可自定义)。​

2.3、数据过滤与存储提交

通过 metric_relabel_configs 对指标进行过滤(如保留特定标签的指标)后,scrapeLoop 会将处理后的指标提交至 appendable 接口(通常指向本地 TSDB)。源码中通过 scrapePool.append 方法完成数据写入,同时记录采集成功 / 失败次数(用于 up 指标统计)。

三、解决的核心痛点

    1. 态目标管理难题:通过服务发现与 scrapeLoop 动态创建 / 销毁,解决了容器、云环境中目标 IP 频繁变化的问题。​
    2. 采集可靠性保障:超时控制、健康状态标记、并发限制机制,避免了单个故障目标拖垮整个监控系统。​
    3. 数据一致性与标准化:统一的指标解析、标签处理流程,确保不同类型目标的监控数据格式一致,为后续查询、告警提供可靠基础。​
    4. 资源高效利用:基于时间轮的调度算法与并发控制,平衡了采集频率与系统资源消耗,支持单节点监控数万个目标。
    5. 从源码设计来看,scrape manager 与 scrapeLoop 的分工明确:前者负责 “战略调度”,后者专注 “战术执行”,二者的协同既保证了大规模监控的灵活性,又确保了数据采集的稳定性,这也是 Prometheus 能够成为云原生监控事实标准的核心原因之一。
       

 

http://www.aitangshan.cn/news/66.html

相关文章:

  • 洛谷P13030 [GCJ 2021 #1B] Subtransmutation
  • idempiere安装
  • 如何安装 Git (windows/mac/linux)
  • 拆解Agent如何实现“听懂→规划→搞定”全流程
  • ActiveMQ 设置用户名密码
  • MySQL 8.0.42 手动部署全过程(CentOS 7 虚拟机 Linux)
  • PDF处理控件Aspose.PDF教程:在C#、Java、Python中快速缩小PDF
  • 自动化测试框架选型指南:5大主流工具实战对比
  • Re:从零开始的动态凸壳
  • 资产管理系统 - microsoft
  • G1 垃圾回收器调优
  • 面相对象编程:类和对象
  • 学习笔记:Query Transformation- Distinct Aggregate Transformation
  • 安卓
  • 妈妈再也不用担心我画图太丑了,画图神器:plantUML
  • 测试用例精简技术全解析:从原理到实践
  • 优化DeepSpeed ZeRO在低成本硬件上的运行效率
  • 读书笔记:数据库事务处理的那些坑与妙招
  • arduino 工具栏消失
  • # 常见算法板子(一)
  • 【算法分享】字典树 — 插入、查询与状态标记详解
  • 8.10
  • Windows 2003 系统如何修改网卡DNS?
  • Python 内置模块 base64:编码与解码的艺术
  • Webstorm运行显示404 not found的问题解决方案。
  • 一文带你彻底学会 Git 代码管理
  • arcgispro的软件说明文档和使用技巧
  • InnoDB为什么不用跳表,Redis为什么不用B+树?
  • c++算法竞赛输入输出优化
  • JS中对输入的金额进行大写转换(支持两位小数)