【云原生 • Prometheus】图解Prometheus数据抓取原理
discovery模块
利用各种服务发现协议发现目标采集点,并通过channel管道
将最新发现的目标采集点信息实时同步给scrape模块
,scrape模块
负责使用http
协议从目标采集点上抓取监控指标数据。
如上图,discovery服务发现模块
经过Discoverer组件
--> updater组件
--> sender组件
,将服务发现采集点实时动态发送到syncCh通道
上,而该通道的另一端就是scrape模块
,这样discovery模块
和scrape模块
就构建起了关联。
scrape
模块updateTsets
组件通过协程方式运行实时监听syncCh
通道,并将更新写入到scrapeManager
结构体中targetSets
字段对应的map
中,同时触发triggerSend信号
给reloader组件
,告诉该组件采集点有更新,reloader组件
就从scrapeManager
中targetSets
中拉取最新采集点进行加载。
(相关资料图)
reloader组件
基于这些采集点信息生成一个个targetScraper组件
,targetScraper组件
组件主要负责按照job
中配置的interval
时间间隔不停轮训调用采集点的HTTP接口,这样就实现了采集点的指标数据采集。
scrape加载流程
下面来看下scrape
模块reloader
加载采集点具体流程,如下图:
「reloader采集点加载主要分为如下几个主要步骤:」
「1、scrapePool生成并初始化基础数据:」
scrapeManager
结构体中targetSets
字段对应的map中存放了当前服务发现的最新采集点信息,key
是job
名称,遍历该targetSets
中存放的采集点信息,为每个job
对应生成一个scrapePool
结构体的实例,即scrapePool
是封装单个抓取job
的工作单元:
ScrapePools 是单个的Job的抓取目标的工作单位:type scrapePool struct { //存储指标 appendable storage.Appendable //一个scrapePool对应一个job,config即为该job配置 config *config.ScrapeConfig // 基于job配置生成http请求客户端工具,比如封装认证信息等 client *http.Client //每个target都会生成一个loop loops map[uint64]loop //target_limit检查 targetLimitHit bool //relabe后有效的采集点 activeTargets map[uint64]*Target //relabel后无效采集点 droppedTargets []*Target //生成scrapeLoop工厂函数 newLoop func(scrapeLoopOptions) loop}
每个抓取job
生成的scrapePool
存放在scrapeManager
结构体中scrapePools
这个map
中:
scrapePools map[string]*scrapePool
「2、targetgroup.Group构建Target:」
上面生成的scrapePool
中主要初始化config
、client
等信息,并没有涉及到抓取采集点数据,然后对生成的scrapePool
执行Sync
方法,入参就是该抓取job
当前所有采集点信息,这个方法就是对job
的采集点信息进行处理:
func (sp *scrapePool) Sync(tgs []*targetgroup.Group)
遍历采集点,通过targetsFromGroup(tg, sp.config)
解析采集点返回[]*Target
,
var all []*Targetsp.droppedTargets = []*Target{}for _, tg := range tgs { //基于targetgroup.Group构建target集合 targets, err := targetsFromGroup(tg, sp.config) if err != nil { level.Error(sp.logger).Log("msg", "creating targets failed", "err", err) continue } for _, t := range targets { if t.Labels().Len() > 0 {//relabel后符合要求的采集点 all = append(all, t) } else if t.DiscoveredLabels().Len() > 0 {//relabel后不符合要求的采集点:废弃 sp.droppedTargets = append(sp.droppedTargets, t) } }}
Target
结构体主要字段如下,即将服务发现的采集点信息解析成scrape
模块的Target
信息,解析过程中会涉及relabel
操作,从服务发现的目标采集点中过滤出符合要求的真实采集点,一个Target
即代表一个将要真实触发Http
请求对象:
type Target struct { //服务发现标签,即未经过relabel处理的标签 discoveredLabels labels.Labels //经过relabel处理之后标签 labels labels.Labels //http请求参数 params url.Values //采集点状态:up、down、unknown health TargetHealth}
「3、有效Target生成scrapeLoop:」
「Target只是包含采集点信息,scrapeLoop实现loop接口,封装了发送http请求采集数据指标逻辑的Target执行单元:」
type loop interface { run(interval, timeout time.Duration, errc chan<- error) setForcedError(err error) stop() getCache() *scrapeCache disableEndOfRunStalenessMarkers()}
其中run
方法就是启动http
数据抓取,入参interval
指定循环抓取指标间隔;stop
方法则是停止http
数据采集。
我们来看下Target
如何生成scrapeLoop
:
if _, ok := sp.activeTargets[hash]; !ok { //生成targetScraper,其中封装了Target和client //Target封装了采集点请求IP、端口、请求参数等信息,通过这些信息构建HTTP请求Request //client是封装了认证信息的http请求客户端工具,用于将http请求request发送出去 s := &targetScraper{Target: t, client: sp.client, timeout: timeout} l := sp.newLoop(scrapeLoopOptions{ target: t, scraper: s, limit: limit, honorLabels: honorLabels, honorTimestamps: honorTimestamps, mrc: mrc, }) ...}if _, ok := sp.activeTargets[hash]; !ok { //sp.activeTargets不存在则表示新发现的采集点,则创建scrapeLoop //生成targetScraper,其中封装了Target和client //Target封装了采集点请求IP、端口、请求参数等信息,通过这些信息构建HTTP请求Request //client是封装了认证信息的http请求客户端工具,用于将http请求request发送出去 s := &targetScraper{Target: t, client: sp.client, timeout: timeout} l := sp.newLoop(scrapeLoopOptions{ target: t, scraper: s, limit: limit, honorLabels: honorLabels, honorTimestamps: honorTimestamps, mrc: mrc, }) sp.activeTargets[hash] = t sp.loops[hash] = l uniqueLoops[hash] = l} else { //sp.activeTargets存在则可能: //1、重复的采集点:直接忽略即可 //2、之前发现并启动的采集点:设置uniqueLoops[hash] = nil,则后续启动loop时不用启动 //target在sp.activeTargets已存在,但是uniqueLoops不存在,说明该采集点之前就被发现过并被启动,当前发现的和之前一致未变 //uniqueLoops[hash] = nil表示当前还是存在,但是不需要启动,后面对于sp.activeTargets存在但是uniqueLoops中不存在的采集点,则为采集点消失,需要停止loop并移除掉 if _, ok := uniqueLoops[hash]; !ok { uniqueLoops[hash] = nil } sp.activeTargets[hash].SetDiscoveredLabels(t.DiscoveredLabels())}
uniqueLoops
存储当前抓取job
所有有效采集点,不在该集合中的采集点需要停止并移除,如之前存在的采集点,但是当前又消失不见的采集点:
for hash := range sp.activeTargets { //uniqueLoops存储当前抓取job所有有效采集点,不在该集合中的采集点需要停止并移除,如之前存在的采集点,但是当前又消失不见的采集点 //uniqueLoops中value=nil的是不需要启动,之前服务发现过并被启动的;value不是nil则表示需要启动 if _, ok := uniqueLoops[hash]; !ok { //移除 wg.Add(1) go func(l loop) { l.stop() wg.Done() }(sp.loops[hash]) delete(sp.loops, hash) delete(sp.activeTargets, hash) }}
scrapeLoop
中还有个关键的类型targetScraper
,它才是真正执行http
请求组件,其实现scraper
接口(如下),其中scrape
就是一次http
请求逻辑封装:
type scraper interface { scrape(ctx context.Context, w io.Writer) (string, error) Report(start time.Time, dur time.Duration, err error) offset(interval time.Duration, jitterSeed uint64) time.Duration}
「4、启动scrapeLoop
:」
最后,执行scrapeLoop
的run
方法,启动scrapeLoop
组件:
for _, l := range uniqueLoops { if l != nil { go l.run(interval, timeout, nil) }}
组件关系
「scrape模块
加载流程关键是几个核心组件创建、初始化及启动运行的过程:」
标签:
-
快播:【云原生 • Prometheus】图解Prometheus数据抓取原理
discovery模块利用各种服务发现协议发现目标采集点,并通过channel管道将最新发现的目标采集点信息实时同步
-
世界球精选!孔凡才
1、孔凡才,1952年毕业于“国立上海高机”电机专业,1961年毕业于吉林大学物理专业。2、上海理工大学教授,
-
Techland发行商特卖 《消光2》4折优惠119元
今天为大家带来的是Techland发行商特卖,作为Techland最大招牌的《消光》系列一直表现良好,这次不论是1还
-
最资讯丨孔德峰
1、孔德峰男,1984年生于江西省九江市。2、2006年毕业《九江学院》艺术系油画专业,现为江西省美术家协会会员
-
江苏简称怎么念_江苏简称-世界观点
1、江苏省简称为“苏”,因其境内苏州是历来江南名城,苏州则因姑苏山得名。2、所以又称“姑苏城”。本文分
-
倒数是什么数_倒数是什么
1、两个实数的乘积是1,则这两个数互为倒数(这里的“数”是“数字”的数,念四声;“倒”是倒车的倒。2、
-
环球百事通!2023青岛海军知识竞答活动常见问题(更新中)
温馨提示:以下信息,小编根据北海舰队官方信息,进行整理,信息仅供大家参考,实际以官方为准2023青岛海军
-
前沿资讯!2023年宁波绿色出行活动规则+领券攻略
宁波绿色出行攻略一、活动时间2023年4月21日00:00:00-2023年5月3日23:59:59二、活动参与条件仅限绑定手机号
-
菜籽油商品报价动态(2023-04-21) 今日看点
交易商品牌 产地交货地最新报价菜籽油 等级:三级;安徽六安市场安徽六安安徽省 六安市9050元 吨广东东莞市
-
焦点资讯:广州户口市内迁移网上办理流程(附入口)
广州公安2023-04-2016:44第一步:在广州公安微信公众号或广州微警务微信小程序;第二
-
陕西省黄龙县发布霜冻蓝色预警
陕西省黄龙县发布霜冻蓝色预警
-
南航深圳至曼谷廊曼开航、国际诸多航线再加密
中国南方航空公司(以下简称“南航”)4月20日正式开通深圳至泰国曼谷廊曼航线。首个航班CZ6035于当日9
-
澳门面积约多少平方千米 澳门面积是多少平方千米 全球快资讯
今天来聊聊关于澳门面积约多少平方千米,澳门面积是多少平方千米的文章,现在就为大家来简单介绍下澳门面积
-
河北:确保最严格的耕地保护制度落地落实
全省耕地保护工作暨省农村乱占耕地建房专项整治行动领导小组视频会议要求确保最严格的耕地保护制度在河北落
-
股票行情快报:森鹰窗业(301227)4月21日主力资金净卖出625.58万元 全球视点
截至2023年4月21日收盘,森鹰窗业(301227)报收于27 56元,下跌0 9%,换手率4 91%,成交量1 09万手,成交额3011 23万元。
-
我省将组织企业赴六国举办展览
我省将组织企业赴六国举办展览,主流媒体,山西门户。山西新闻网是经国务院新闻办审核批准,由山西日报报业集
-
世界关注:华为宣布实现自主可控的MetaERP研发
4月20日消息,华为宣布已经完成了自主可控的MetaERP系统的研发和替换旧ERP系统的工作。ERP是企业级IT应用中
-
bldc变频电机和直驱电机_bldc变频电机和直驱
1、电机的好坏要看用途。2、滚筒洗衣机上面,DD直驱变频电机比较好(耗电稍高但没有皮带传动),BLDC电机在
-
上海瀚讯(300762):4月21日北向资金减持141.28万股
4月21日北向资金减持141 28万股上海瀚讯。近5个交易日中,获北向资金减持的有3天,累计净减持35 05万股。近
-
中超成都赛区 响起久违的“雄起”声
不负好风光,奋起再出发。4月21日晚上,在39686名球迷“雄起”的助威声中,成都蓉城队时隔111天再次亮相凤
-
推动家电"以旧换新" ,广州出台38条措施促进消费提档升级 今日热文
消费是经济增长的重要引擎,也是人民对美好生活需要的直接体现,正在建设国际消费中心城市的广州,将如何进
-
全球头条:春节有多少年的历史_春节的历史有多长
欢迎观看本篇文章,小升来为大家解答以上问题。春节有多少年的历史,春节的历史有多长很多人还不知道,现在
-
公积金新政抢先看~ 环球精选
公积金新政抢先看~,购房,住房公积金,公积金贷款,公积金新政
-
热点!“地铁一到,公交即发”,郑州地铁4号线出行实现“零等候”
大象新闻记者 王琳“地铁送到站、公交送到家”。4月20日,记者从郑州地铁获悉,为方便市民公共出行,地
-
全球动态:收盘:三大指数均大跌 数字经济类概念领跌
4月21日讯,截至收盘,沪指跌1 95%,报收3301 26点;深成指跌2 28%,报收11450 43点;创业板指跌1 91%,
-
股票行情快报:三德科技(300515)4月21日主力资金净卖出301.17万元
截至2023年4月21日收盘,三德科技(300515)报收于13 53元,下跌4 72%,换手率1 91%,成交量3 45万手,成交额4764 94万元。
-
当前快报:四川“4·20”芦山强烈地震十周年:废墟崛起新家园 产业蝶变谋新机
纺织业之外,芦山还大力发展锂电新能源产业,四川瑞鞍新材料科技有限公司年产10万吨负极材料一体化项目等已
-
车价股价一起降,特斯拉一季度盈利同比暴跌 20%|世界速看
据报道,特斯拉今日发布了2023年第一季度的财报,营业利润率达到11 4%,GAAP营业利润为27亿美元,GAAP净利
-
天天速看:语文研修个人工作计划高中(通用24篇)
语文研修个人工作计划高中第1篇学海无涯,知识是无止境的,因此每个教师都需要终身学习。教育工作是动态的鲜
-
红运竹怎么水养(红运竹怎么水养才能养好)-新视野
1、红运竹通常都是采用水培的方式进行养护的,养护方法很简单,将其放入水中就行。2、应注意经常换水,保证