首页 >要闻 > > 正文

【prometheus】-02 一张图彻底搞懂Prometheus服务发现机制 全球动态

腾讯云 2023-03-24 16:15:15

概述

Prometheus是基于Pull模式抓取监控数据,首先要能够发现需要监控的目标对象target,特别Prometheus最开始设计是一个面向云原生应用程序的,云原生、容器场景下按需的资源使用方式对于监控系统而言就意味着没有了一个固定的监控目标,所有的监控对象(基础设施、应用、服务)都在动态的变化。而对于Prometheus而言其解决方案就是引入一个中间的代理人(服务注册中心),这个代理人掌握着当前所有监控目标的访问信息,Prometheus只需要向这个代理人询问有哪些监控目标控即可, 这种模式被称为服务发现(service discovery)。

如上图,SD模块专门负责去发现需要监控的target信息,Prometheus去从SD模块订阅该信息,有target信息时会推送给Prometheus,然后Prometheus拿到target信息后通过pull http协议去拉取监控指标数据。

Prometheus支持的服务发现协议是非常丰富的,目前已支持多达二十多种服务发现协议:


(相关资料图)

服务发现原理图

上图描述Prometheus服务发现协议比较笼统,Prometheus服务发现实现原理大致如下图:

如上图所述,Prometheus服务发现机制大致涉及到三个部分:

1、配置处理模块解析的prometheus.yml配置中scrape_configs部分,将配置的job生成一个个Discoverer服务,不同的服务发现协议都会有各自的Discoverer实现方式,它们根据实现逻辑去发现target,并将其放入到targets容器中;

2、discoveryManager组件内部有个定时周期触发任务,每5秒检查targets容器,如果有变更则将targets容器中target信息放入到syncCh通道中;

3、scrape组件会监听syncCh通道,这样需要监控的targets信息就传递给scrape组件,然后reloadtarget纳入监控开始抓取监控指标。

配置处理部分会根据scrape_configs部分配置的不同协议类型生成不同Discoverer,然后根据它们内部不同的实现逻辑去发现targetdiscoveryManager组件则相当于一个搬运工,scrape组件则是一个使用者,这两个组件都无感知服务发现协议的差异。

下面分别来分析下配置处理、discoveryManager组件和scrape组件在服务发现方面的具体实现流程。

配置处理

上节分析Prometheus启动流程,有个配置加载组件通过reloadConfig加载解析prometheus配置文件后,在reloader中循环调用各个组件的ApplyConfig(cfg map[string]Configs)方法处理配置,这其中就包括discovery/manager.go:

reloader中定义如下:

{name:"scrape_sd",//从配置文件中提取Section:scrape_configsreloader:func(cfg*config.Config)error{c:=make(map[string]discovery.Configs)for_,v:=rangecfg.ScrapeConfigs{c[v.JobName]=v.ServiceDiscoveryConfigs}returndiscoveryManagerScrape.ApplyConfig(c)},}

那下面就从discovery/manager.go中定义的ApplyConfig()方法分析。

1、根据配置注册provider:

forname,scfg:=rangecfg{//根据配置注册providerfailedCount+=m.registerProviders(scfg,name)discoveredTargets.WithLabelValues(m.name,name).Set()}

其中关键的是m.registerProviders(scfg, name),继续跟踪:

d,err:=cfg.NewDiscoverer(DiscovererOptions{Logger:log.With(m.logger,"discovery",typ),})

2、然后将所有注册到m.providers数组中的provider进行启动:

for_,prov:=rangem.providers{//启动服务发现实例m.startProvider(m.ctx,prov)}

跟踪到m.startProvider(m.ctx, prov)方法中:

updates:=make(chan[]*targetgroup.Group)//执行run 每个服务发现都有自己的run方法。gop.d.Run(ctx,updates)//更新发现的服务gom.updater(ctx,p,updates)

发现这里主要是启动两个协程,它们之间使用updates通道类型变量进行通信。

总结来说(见下图):

1、每个Config都会对应创建一个Discoverer实例,并被封装到provider存储在m.providers数组中;

2、然后遍历providers数组进行启动操作,启动操作启动了两个协程:

a、Discoverer.Run协程逻辑中主要根据发现协议发现targets

b、然后通过通道传递给discovery/Manager.updater协程中,将其存放到m.targets集合map中;

配置处理这里还有个比较关键的:Discoverer会根据不同协议实现发现target,它是如何实现的呢?

首先,我们来看下Discoverer实例创建:d, err := cfg.NewDiscoverer(),它是一个接口定义:

typeConfiginterface{Name()stringNewDiscoverer(DiscovererOptions)(Discoverer,error)}

每种服务发现协议都在自己的SDConfig中实现了各自的NewDiscoverver()方法,这样就可以将服务发现逻辑封装到Discovererver实现中:

discoveryManager组件

上节《Prometheus启动流程》一节分析过会启动discoveryManagerScrape组件通过通道将targets数据信息传递给scrapeManager组件(见下图):

1、discoveryManagerScrape组件启动入口:

g.Add(func()error{err:=discoveryManagerScrape.Run()level.Info(logger).Log("msg","Scrapediscoverymanagerstopped")returnerr},func(errerror){level.Info(logger).Log("msg","Stoppingscrapediscoverymanager...")cancelScrape()},)

2、一直跟踪会进入到sender()方法中,配置处理模块说过,有个协程会将Discoverer组件发现的targets信息存储到m.targets集合map中,然后给m.triggerSend发送信号,sender方法中就是启动定时周期触发器监听m.triggerSend信号:

func(m*Manager)sender(){//周期性定时器定时触发任务,这里是5s触发一次ticker:=time.NewTicker(m.updatert)deferticker.Stop()for{select{case<-m.ctx.Done():returncase<-ticker.C://Somediscovererssendupdatestoooftensowethrottlethesewiththeticker.select{case<-m.triggerSend:sentUpdates.WithLabelValues(m.name).Inc()select{casem.syncCh<-m.allGroups():default:delayedUpdates.WithLabelValues(m.name).Inc()level.Debug(m.logger).Log("msg","Discoveryreceiver"schannelwasfullsowillretrythenextcycle")select{casem.triggerSend<-struct{}{}:default:}}default:}}}}

监听到m.triggerSend信号,则执行m.syncCh <- m.allGroups(),我们来看下m.allGroups()干了什么?

func(m*Manager)allGroups()map[string][]*targetgroup.Group{m.mtx.RLock()deferm.mtx.RUnlock()tSets:=map[string][]*targetgroup.Group{}forpkey,tsets:=rangem.targets{varnintfor_,tg:=rangetsets{//Evenifthetargetgroup"tg"isemptywestillneedtosendittothe"Scrapemanager"//tosignalthatitneedstostopallscrapeloopsforthistargetset.tSets[pkey.setName]=append(tSets[pkey.setName],tg)n+=len(tg.Targets)}discoveredTargets.WithLabelValues(m.name,pkey.setName).Set(float64(n))}returntSets}

其实就是将m.targets数据发送到m.syncCh通道上,所以,discoveryManager组件比较简单,就是一个搬运工。

scrape组件

scrapeManager组件启动:scrapeManager.Run(discoveryManagerScrape.SyncCh()),通道syncCh是被scrapeManager组件持有的,跟踪进入Run方法中:

func(m*Manager)Run(tsets<-chanmap[string][]*targetgroup.Group)error{gom.reloader()for{select{//通过管道获取被监控的服务(targets)casets:=<-tsets:m.updateTsets(ts)select{//关闭ScrapeManager处理信号//若从服务发现(serviceDiscover)有服务(targets)变动,则给管道triggerReload传值,并触发reloader()方法更新服务casem.triggerReload<-struct{}{}:default:}case<-m.graceShut:returnnil}}}

通过case ts := <-tsets获取到syncCh通道上传递过来的targets数据,然后调用m.updateTsets(ts)targets数据存储到scrapeManager.targetSets中,然后给m.triggerReload发送信号。

这个方法中go m.reloader()启动了一个协程,进入reloader()方法中:

func(m*Manager)reloader(){//定时器5sticker:=time.NewTicker(*time.Second)deferticker.Stop()for{select{case<-m.graceShut:return//若服务发现(serviceDiscovery)有服务(targets)变动,就会向管道triggerReload写入值,定时器每5s判断一次triggerReload管道是否有值,若有值,则触发reload方法case<-ticker.C:select{case<-m.triggerReload:m.reload()case<-m.graceShut:return}}}}

也是通过定时周期触发任务监听m.triggerReload信号,执行m.reload()targets加载进来。

总结

前面分析了服务发现运行机制,可以看下面图梳理下前面流程逻辑:

上一篇: 下一篇:
x
推荐阅读

【prometheus】-02 一张图彻底搞懂Prometheus服务发现机制 全球动态

2023-03-24

天天即时看!最不像小说里的史强 让于和伟演活了

2023-03-24

中国农业银行招聘报名入口_天天看点

2023-03-24

多喝热水可以减肥吗_多喝热水能够帮助减肥吗

2023-03-24

enchanted歌词

2023-03-24

达州市开江县考察团一行参观深圳南头古城及THESILS大筒仓|新闻

2023-03-24

在“上好学”上迈出坚实步伐|播报

2023-03-24

葡萄牙4比0列支敦士登完全在意料之中,实力使然,...

2023-03-24

欧央行的Stournaras:央行不应就后续利率行动做出预先承诺

2023-03-24

台式电脑怎么锁屏快捷键_台式电脑怎么锁屏快捷键 独家

2023-03-24

亮目标新闻发布会|壮大科技创新主体力量,探索科创赋能产业新路径_全球独家

2023-03-23

世界速读:4.7英寸等于多少厘米

2023-03-23

广东多地下冰雹,有房顶被砸穿……气象部门紧急提醒:这两天流感高发!-消息

2023-03-23

安河村

2023-03-23

本川智能:股东拟减持股份不超过2%|天天即时看

2023-03-23

买车像买衣服一样简单 沃尔沃城市中心店体验 焦点简讯

2023-03-23

当前动态:武汉看白癜风较好的医院?如何照顾青少年白癜风患者?

2023-03-23

全球速讯:绝爱大结局

2023-03-23

消费、医药为什么总是“一波三折” 难以涨上去? 新动态

2023-03-23

世界新资讯:钓鱼什么意思抖音_钓鱼什么意思

2023-03-23

steam错误102解决办法-steam错误102 热门看点

2023-03-23

全球快讯:3月24日 Delfino Lozano将瓜达拉哈拉的传统房屋改造成光线充足的家庭住宅

2023-03-23

世界时讯:沙尘天气突袭山东济南 有人停车揉眼睛 空气里有泥土的味道

2023-03-23

如果岁月可回头演员表_快播

2023-03-23

福建教育学院学报官网查询_福建教育学院学报官网-世界今日报

2023-03-23

网红国岳夫妇为女儿庆满月,多位大V随礼500万,明星集体成小丑

2023-03-23

环球时讯:湖人队危险了,前有强敌后有追兵,詹姆斯何时伤愈归队成为关键

2023-03-22

美国鸡蛋价格翻5倍,日本麦当劳下架蛋堡,为啥全球都缺鸡蛋了?

2023-03-22

【播资讯】S7新版本皎月女神打野怎么出装

2023-03-22

安森美推出仿真工具,助力加速复杂电力电子应用上市周期

2023-03-22

中国知识产权局专利检索是怎样?国家知识产权局专利检索咨询中心的概述-每日速看

2023-03-22

新款 Model 3 改进细节曝光!大灯、保险杠、内饰都有变化,新 Model Y 也在路上 每日资讯

2023-03-22

环球快看点丨上海夫妻家中的高级场面,巧用黑白灰,装出大宅范!未来很难过时

2023-03-22

【时快讯】韬略

2023-03-22

卓创资讯(301299)3月21日主力资金净卖出158.97万元

2023-03-22

冰箱工作原理_有两种

2023-03-22

当前讯息:年报速递|恒基地产去年股东应占基础盈利约96亿港元

2023-03-22

今日热搜:中国电建、中国能建分别中标大唐海南和南澳海上风电设计项目

2023-03-21

又有4名中国青年疑被骗缅甸失联具体详细内容是什么-世界看热讯

2023-03-21

cces是什么快递公司_cces快递查询

2023-03-21

当前视点!3月21日白银最新行情:白银震荡上行,关注23关口压力

2023-03-21

起亚发布EV5概念车:预演未来品牌SUV新形象

2023-03-21

当前热门:哪吒汽车在安徽铜陵成立浩智科技公司,注册资本3亿元

2023-03-21

当日快讯:韩国3月前20天出口同比降17.4% 焦点资讯

2023-03-21

世界今日讯!赣粤高速(600269)2022年年报财务简析:增收不增利

2023-03-21

鑫铂股份: 2022年度董事会工作报告

2023-03-21

黑龙江一精神病院“开业典礼”放烟花?院方:是揭牌仪式和学术交流会

2023-03-20

试述中国传统政治研究的特点?_试述中国传统政治研究的特点

2023-03-20

全球信息:沃尔沃V60越野评测豪华全天候旅行车

2023-03-20

同轴度测试仪_同轴度

2023-03-20

古代“人生七十古来稀”,那为何70岁才退休?《白虎通》点出原因

2023-03-20

2023亚太金融论坛开幕 贵州摘要酒见证全球智脑共话开放合作

2023-03-20

优化口岸营商环境 促进外贸高质量发展_环球观焦点

2023-03-20

麤靐飍朤淼馫譶龘灥怎么读_cubing-世界热点

2023-03-20

世界最资讯丨马英九将赴大陆

2023-03-20

雷神岛开门任务怎么开_雷神岛开门任务

2023-03-19

扬农化工: 2022年度利润分配方案公告-环球今亮点

2023-03-19

兴业银行吕家进:商业银行要把构建生育友好型社会作为一个重大课题-全球视讯

2023-03-19

安徽芜湖市民收到旅游大礼包:嵊泗所有国有景区免费开放

2023-03-19

千年盛世手游:二层介绍|热门

2023-03-19

【全球新要闻】英城子山城_关于英城子山城的简介

2023-03-19

【天天新要闻】新疆代表在联合国人权理事会第52届会议介绍暴恐危害

2023-03-18

全球看热讯:永达汽车(03669.HK)3月17日收盘涨2.5%

2023-03-18

Doit2移动支架筹集了120000美元

2023-03-18

全球新消息丨海水珍珠的价格表_海水珍珠和淡水珍珠哪个好

2023-03-18

焦点热议:X5TBSOG是什么文件?

2023-03-18

出纳简历工作描述 出差怎么写_出纳简历工作描述_全球新动态

2023-03-18

iphone11promax和12哪个好(iphone11promax和12哪个值得买)_独家

2023-03-18

美人如画结局_美人如画大结局解析

2023-03-17

【聚看点】寄奴曾住典故完整版_寄奴

2023-03-17

复方感冒灵颗粒退烧吗_感冒灵颗粒退烧吗

2023-03-17

新资讯:享受生育津贴的情况有哪些 生育保险怎么报销

2023-03-17

scp基金会是真的吗?

2023-03-17

宁波:农业科技下乡 助力春耕备耕 当前观察

2023-03-17

天天快资讯:打好打赢新时代“辽沈战役”铁岭攻坚战|千帆竞发势如虹 潮涌天南地北——全市一季度招商引资工作综述

2023-03-17

环球热文:初一正负数加减法练习题_负数加减法练习题

2023-03-17

喝牛奶与不喝牛奶的老人,有什么差别?医生说出实话

2023-03-17

三大“热词”解读1-2月国民经济:企稳回升 消费被给予厚望

2023-03-16

Mysteel日报:山东建筑钢材大幅下跌 成交较差

2023-03-16

全球快资讯丨“铁拳”出击护民生

2023-03-16

五连败后迎四连胜!戈登:这总是需要些调整 我们会变得越来越好

2023-03-16

国药一致业绩翻身,医药零售行业景气持续

2023-03-16

不再押宝美元,沙特与中国关系再近一步,敲定首笔人民币贷款合作_环球新消息

2023-03-16

印信的意思是书信吗_印信的意思_每日头条

2023-03-16

那不勒斯、法兰克福球迷爆发大规模冲突,疯狂投掷燃烧瓶、椅子等|精选

2023-03-16

[快讯]映翰通:光大证券股份有限公司北京映翰通网络技术股份有限公司部分募投项目结项并将节余募集资金永久补充流动资金的核查意见_环球即时

2023-03-15

扇舞丹青音乐是什么_扇舞丹青音乐 全球观速讯

2023-03-15

詹皇若离开湖人会去哪?西部高管列4大潜在下家:最可能重回骑士_每日速递

2023-03-15

环球今日报丨当浓眉哥轰下35+17时,你才会发现拉塞尔的可怕之处

2023-03-15

03月15日从迪庆出发到铜仁的防疫政策

2023-03-15

硅谷银行倒了 比特币“站”起来了!市值直追特斯拉 更有公募悄然布局

2023-03-15

百强房企2月销售额同比环比双增长,拿地热情有所提升_世界快看点

2023-03-15

詹姆斯伤后首次球场训练!本人宣告回归倒计时 专家详解康复进展-天天时讯

2023-03-15

招标网站排名大全_招标网站排名_微动态

2023-03-15

天天热消息:俊知集团(01300)发盈警 预期2022年业绩同比盈转亏至不多于6000万元

2023-03-14

旅游公司怎么经营_旅游公司经营范围

2023-03-14

天天微速讯:今年2月全国受理网络违法和不良信息举报1459.9万件

2023-03-14

西安人才公租房可以买吗

2023-03-14

苏农银行今起正式纳入港交所沪股通标的名单 快看点

2023-03-14

热点聚焦:康龙化成:硅谷银行是公司境外合作银行之一 公司仅有少量资金存放于该银行

2023-03-14