您现在的位置: 首页> 趋势 > 正文
【播资讯】【prometheus】-02 一张图彻底搞懂Prometheus服务发现机制
发布时间:2023-03-24 06:12:05 来源:腾讯云

概述

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加载进来。

总结

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

标签:

【播资讯】【prometheus】-02 一张图彻底搞懂Prometheus服务发现机制

Prometheus是基于Pull模式抓取监控数据,首先要能够发现需要监控的目标对象target,特别Prometheus最开...

天天热门:胸口左边疼是怎么回事_胸口正中间疼痛怎么回事

1、导致胸中部疼痛的原因有很多。2、比如食管损伤患者,比如误食强酸或强碱,可出现胸中部疼痛,尤其是...

焦点播报:20岁法蒂身价暴跌1500万,降至3500万欧元

德转更新西甲球员身价,对比11月7日的上一次更新,20岁的巴萨前锋法蒂的身价暴跌1500万,从5000万跌至35...

环球简讯:每年6月5日是什么节日

1、6月05日对应节日:芒种。2、芒种,又名“忙种”,是二十四节气之第九个节气,夏季的第三个节气,干支...

天天速看:注意!力合科创将于4月13日召开股东大会

力合科创(SZ002243,收盘价:9 2元)3月23日发布公告称,2023年4月13日(星期四)14:30,公司将在深圳市南...

天天观热点:峰值亮度可达2500nit?OPPO Find X6 Pro大升级,且屏幕还有更多亮点

手机屏幕发展到今天,看起来好像已经没有什么卷点了,高分辨率带来的高ppi、阳光户外足够使用的高激发亮...

天天信息:另字组词语两个字(另字组词语)

一、题文请用 "另 "字组词,3个以上,谢谢!二、解答另辟蹊径、另眼相看、另外、另起炉灶、另谋高就、另...

热点聚焦:震荡市下做养老投资!这类产品今年来近九成“飘红”,能上车吗?

震荡市下做养老投资!这类产品今年来近九成“飘红”,能上车吗?,fof,震荡市,资产配置,养老投资,易方达基金

环球头条:成龙曾被黑社会要挟,60多人围着他,只有洪金宝出手相助

成龙大哥是一个国际巨星,当年在电影盛行的时候,大哥也是票房的保证,没有任何一个人,比成龙大哥的电...

全球通讯!淘宝信誉等级在哪里看?如何提升信誉等级?

不管是淘宝卖家还是消费者,都有自己的信誉等级,一般购物越多信誉等级就越高,那么如果想要查看淘宝信...

世界最资讯丨西行纪之再见悟空结局

1、以素衣跟孙悟空的相识相知相爱为主线。三百年前,孙悟空为花果山一石猴,一日素衣仙子偷偷下界遇见了...

环球观焦点:穆阿尼:世界杯决赛错失绝杀,现在依旧难掩懊悔之情

穆阿尼:世界杯决赛错失绝杀,现在依旧难掩懊悔之情,世界杯,马丁内斯,法兰克福,德国足球,足球竞赛,点球...

天天头条:德商产投服务经营范围新增职业中介活动

?乐居财经吴文婷3月23日,成都德商产投物业服务有限公司(以下简称“德商产投服务”)经营范围发生变更...

【焦点热闻】新航季初期 成都天府机场将开通30余条国际地区航线

将连接北美洲、欧洲、大洋洲、非洲以及中东、中亚、东亚、南亚、东南亚等亚洲地区。

【世界新要闻】佛山市失业补助金如何办理?申领失业补助金要什么条件?

佛山市失业补助金如何办理?申领失业补助金需要什么条件?需要准备什么材料?社保网小编整理办理条件:...

世界动态:20岁应该用什么牌子护肤品

自然堂、FREEPLUS芙丽芳丝、阿芙、曼秀雷敦、ZA这些。维护保养是越快越高。20岁的女生早已必须刚开始在...

环球关注:补肾阴的中成药有哪些_补肾中成药有哪些

1、病情分析:补肾中成药种类繁多,有六味地黄丸、白质地黄丸、杞菊地黄丸、左归丸等。2、有温补肾阳的...

今日要闻!淘宝客服插件_淘宝客插件

1、单体或者整合插件都能达到这样的效果。2、如果你还在问这是什么插件的话,那我觉得楼主你应该先熟悉...

【世界报资讯】夫妻俩 40 分钟内同一地闯红灯撞车,“离奇”巧合敲响安全警钟

近日,在广西桂林秀峰区的一处斑马线上,仅仅相隔40分钟,一对夫妻先后撞上大巴车和跑车,事故的原因都...

世界热点!2023浙江舟山岱东镇下属企业招聘1人公告

岱东镇人民政府下属企业岱山县岱东农业综合服务公司因工作需要,拟招聘工作人员1名,现将有关事项公告如...

世界观焦点:演员张超个人简介

1、张超,毕业于中央戏剧学院表演系,中国内地男演员。2、1997年出演校园剧《十七岁不哭》中的“雷蒙”...

今日看点:杭州一小区募集6万余元,帮保安妻子对抗病魔

“已助力,希望早日康复!”近日,上城区紫阳街道春江花月小区业主群被这句话刷屏了,大家的助力对象是...

当前资讯!迷你世界头像怎么弄成自定义的

打开迷你世界,点击左上角的用户中心。打开用户中心后,点击红框位置的“编辑”。在资料编辑界面,点击...

每日热文:露营热带火装备产品销售

随着天气回暖,露营成为短途休闲游的首选方式,从户外绿地到野外公园,各式各样的帐篷在春天里“盛开”...

当前快播:盘中异动 | 招商中证云计算与大数据主题ETF涨2.00%

招商中证云计算与大数据主题ETF(159890)3月22日盘中涨2 00%,最新单位净值为1 0710。该基金最近一周...

每日速讯:“第三方测评”:超半数以商养测

环球精选!瑞达期货:增产明确需求有限 后市棉价弱势震荡

速讯:坦克世界v系_坦克世界 什么系的坦克厉害

全球观焦点:春分“分”晴雨 未来一周四川春雨几乎天天“打卡”

环球微资讯!脂溢性头皮炎的症状有哪些_什么是脂溢性头皮炎

最新快讯!天津社保证明怎么查询打印?

天天速递!【榆垡三幼|共育·科学】春日相遇 共育花开——幼小衔接家长专题讲座

世界热议:被微软逼“疯”!谷歌计划招募手机用户测试AI聊天:赶超GPT

环球热资讯!汪小菲再遭重创:麻六记团队20多人集体辞职,张兰将更加辛苦

当前通讯!GPT-4又一应用来了 微软子公司推出AI临床笔记软件 生成仅需几秒

全球今日讯!光大证券:AIGC游戏应用前景广阔 有望助力形态升级和产业变革;

今日精选:大数据Flink进阶(三):Flink核心特性

环球热头条丨《三十而已》的毛晓彤为何演得这样好?其实她就是在演自己

环球讯息:安耐特是什么牌子轮胎

当前资讯!四川省普通高中学业水平考试信息管理系统入口(附网址)

当前速递!031期樊可双色球预测奖号:历史同期奖号定位分析

世界今日报丨5个方向,测试文心一言和chatGPT的不同

焦点!星迈创新完成近2亿元天使轮融资,由高瓴创投等联合投资

世界播报:惨遭伊藤美诚11-0横扫,被称史上最水大满贯,丁宁为何还不退役?

【世界新要闻】误入桃花林———小桃Channel周年故事续写

全球时讯:塔拉库沓的证明_塔拉库沓的证明

每日精选:海拔898米!600多名登山爱好者勇攀东莞第一高峰

当前讯息:795元起!零刻EQ12迷你主机上架:英特尔N100+ 双网口

【环球速看料】自动档小房车百姓接受得了的最低价位_中天的自动挡15万房车

【世界热闻】中国决定访俄后,美国撕下伪装,否定中国方案,拒绝俄乌停火

今日关注:今天最新消息 “OK先生”在河南:我确定我很幸福

全球速递!英士达意美餐厅 豆仔尾路店_关于英士达意美餐厅 豆仔尾路店的简介

全球今日讯!locale-emulator手机版_locale emulator怎么用

讯息:Linux 常用指令

今日精选:尤纳恩是男是女_尤纳恩

全球新消息丨我爸爸绘本故事_我爸爸绘本教案

前沿资讯!修复牙缝一般多少钱_牙缝大修复多少钱

世界快讯:“关键少数”信披要求升级 今年已有50余位董秘领罚单

全球快看:凌侮的读音_荆棘的读音

今日最新!车企相继推“90天保价”,你会选择降价的还是选择保价的?

全球最新:春之怀古张晓风阅读题答案_春之怀古张晓风

环球看点!中国代表呼吁国际社会帮助阿富汗人民早日走出困境

最资讯丨第二代骁龙7+首次支持双5G双卡双通:4.4Gbps网速、Wi-Fi翻倍

天天短讯!浙江交科(002061.SZ):联合体预中标18.19亿元EPC总承包项目

【世界报资讯】江西:春暖花开 耕种正当时

当前最新:泛海控股:连续3日融资净买入累计372.21万元(03-16)

环球观天下!“三月三”去哪里?就来宛田十二滩吧!

天天动态:“香精大米”后续:涉事公司已被调查处理

世界消息!司理理是谁的人_司理理是谁

【世界报资讯】美媒:高通胀正掏空美国人储蓄 近半民众陷入财务困境

当前资讯!卫冕冠军辽宁男篮客场爆冷输给了上海男篮

世界快看点丨吉祥馄饨获得绝味新一轮融资

【天天速看料】当日快讯:最新数据显示日本癌症5年生存率为66.2%

每日动态!发挥大数据产业乘数效应

全球观天下!我熟悉的人600字作文初一_我熟悉的人

x 广告
x 广告

Copyright ©  2015-2022 西南自然网版权所有  备案号:皖ICP备2022009963号-8   联系邮箱:39 60 29 14 2@qq.com