手机版
位置:筑能财经 > 资讯 >

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

来源:腾讯云 | 2023-03-26 11:09:29

概述

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

总结

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

标签:

上一篇:

下一篇:

精彩放送

新闻资讯

  1. 环球热讯:应急产业板块3月22日涨0.91%,中富通领涨,主力资金净流出3.72亿元
  1. 当前速递!崇信:春风十里,等花也等你,最全赏花指南,请查收!
  1. word语音转换成文字_word语音转换文字
  1. 今热点:夜场赏花成亮点 成都“夜樱”搜索量排前三位
  1. 今日播报!2022深圳封城什么时候解封
  1. 是吖是什么意思(ldquo 吖 rdquo 字是什么意思)
  1. 全球今日讯!国家推出一揽子支持政策稳定大豆生产
  1. 环球讯息:若塔:我的马竞处子秀与托雷斯一同合作,这很特别
  1. 视点!适合带孩子去旅游的地方
  1. 焦点热议:区委常委、宣传部部长仲伟功到天宫院街道督导检查创城工作
  1. 当前视点!益科正润:今年首次全面降准即将落地,时机选择适当,提振市场信心
  1. 世界速看:两把头和架子头_两把头
  1. 【环球新要闻】qv是什么意思网络用语
  1. 金碧辉煌_金碧辉
  1. 今日播报!女人的颜色电视剧剧情介绍_主演都有谁
  1. 全球微头条丨黄金ETF近一个月平均涨近7% 配置价值值得关注
  1. 当前通讯!今年以来最强沙尘天气来袭,最近沙尘天气是否偏多?
  1. 文旅部:提振行业发展信心成为今年市场管理工作的首要任务
  1. 速读:康柏西普打一针可以维持多久_康柏西普打一针多少钱
  1. 每日观察!键盘打不了字按哪个键恢复_键盘锁是哪个键
  1. 每日播报!【机构评级】 大和:下调药明康德(02359)目标价至105元 维持“买入”评级
  1. 千山暮雪续集大结局下部_千山暮雪讲的是什么
  1. 每日速看!你不可不知的“二级债基”
  1. 陈梦和王艺迪这对女子双打的出现,对女乒的影响有多大?
  1. 当前滚动:优胜劣汰趋势显现 “迷你基”分化加剧
  1. 收益又转负了 怎么办?
  1. 神经内科专家:脑梗来临,身体3个月前或有“暗示”,建议早筛查
  1. 暮光之城3迅雷下载 RMVB 下载_暮光之城3迅雷下载
  1. 全球微头条丨星巴克“沿街取” 不止是一脚刹车的事
  1. 【环球新视野】公寓管理如果解决节假日人手不足的问题,为啥要选公寓管理系统?
  1. 每日快讯!臭名昭著的近义词_臭名昭著的意思
  1. 每日播报!百分表的使用方法视频演示(百分表的使用方法视频)
  1. 微速讯:和平方案见效了,俄媒透露:泽连斯基或找中方通话探讨和平计划
  1. 美股异动 | 特斯拉(TSLA.US)涨超3% 穆迪上调其评级至“投资级”
  1. 世界快播:RNG爆冷输给NIP,赛后选手表情冷漠无沟通,季后赛危险了
  1. 今日最新!新牧网3月21日全国鸡价:河北、安徽等省小幅上调【全国鸡价指数】
  1. 益科正润:欧美银行危机中长期助抬金价,关注美联储加息
  1. 环球动态:A股具备整体转强的条件
  1. 每日看点!光遇3月21日每日任务攻略
  1. 全球球精选!梦幻西游赚钱攻略大全2020_梦幻西游赚钱攻略大全
  1. 近1年基民行为带来收益增益?投资者盈利洞察报告揭秘基民投资收益
  1. 全球信息:镇平县乡村振兴局开展万人助万企“企业服务日”活动
  1. 海特生物董秘回复:截止3月10日,公司股东人数为10,138户
  1. 滚动:石头科技发布两款自清洁扫拖机器人,包括年度旗舰 G20 与全新 P10
  1. 天天视点!贵州万山:织牢织密基层医疗“网底”
  1. 环球实时:850万年薪求贤?这一行业火了,多家公司百万高薪挖人
  1. 首张碳中和信用卡来了!招行信用卡持续连接趋势!
  1. 全球关注:研究探索了正念冥想和催眠的神经动力学
  1. 儿童出生证明有什么用
  1. 公募REITs2022年报季启幕:首只披露年报基金“掉粉”超26%
  1. 爆款基难掌控 类指数投资何以“偏向虎山行”
  1. 基金经理“闪离”频现 投资者无所适从
  1. 公告信息语焉不详 基金经理增聘疑云重重
  1. 当前快报:首批基金年报出炉 知名基金经理陆彬表示2023年看好价值成长风格
  1. 天天快看点丨首份基金年报出炉 新能源等受关注
  1. 【天天聚看点】圆锥曲线知识点总结表格_圆锥曲线知识点总结
  1. 茶颜悦色进京 时机未到?
  1. 全球观天下!敕勒歌这首诗的意思是什么(敕勒歌这首诗的解释)
  1. 【全球时快讯】蟹不肉是什么意思英语_蟹不肉是什么意思
  1. 全球今日报丨建设工程施工合同纠纷起诉状代写律师怎么收费
  1. 摔角动态太子爷肖恩·麦克曼练泰拳备战摔角狂热?
  1. 月经不调挂什么科查性激素_月经不调挂什么科
  1. 伟隆股份:2022年净利润增长123.31%至1.36亿元 拟10送3股派3元
  1. 观焦点:蔡雪敏个人资料_蔡雪敏
  1. 张兰被曝海外欠债9.8亿,纽约豪宅被执行!最新回应来了
  1. 世界视讯!脓包痘痘该如何处理_八年级下册历史1到22课的思维导图
  1. 华安基金:美联储加息路径缓和,黄金投资获热捧
  1. “赚钱天堂”难赚钱 这些人偷越国(边)境被临澧警方抓获
  1. 动态焦点:螃蟹手抄报_螃蟹手
  1. 天天快讯:参加社团面试的工作计划(13篇)
  1. 信息:JJPLAY电竞报:TES四连败!教练换了也无用,官博瞬间沦陷
  1. 全球观焦点:广发基金:海外加息预期下修 国内超预期降准改善市场情绪
  1. 肉末粉条_肉末炒粉丝
  1. 今日看点:广西玉林市大智环保工程有限公司
  1. 新版《妇女权益保障法》热点问题解答来了!
  1. 全球热门:“爆款基”规模太大难掌控 类指数投资成标准操作?
  1. 重仓股遇挫下多只新能源基金周内跌逾5% 北向资金重新回归新能源板块
  1. 环球看热讯:汇添富基金马翔:投资成长股的实践心得
  1. 【全球播资讯】嘉实基金苏文杰:经济复苏下看好上游板块,碳中和关注两大方向
  1. 世界滚动:竞争激烈 基金经理与投资者越来越“亲近”
  1. 全新现代悦纳无伪实车内饰曝光,采用了非常运动的前脸
  1. 当前热点-陈光明:今年不应该太悲观 这时候还在看空是对常识的谬视
  1. 焦点热文:震荡市动作频频 基金公司加大“揽客”力度
  1. 全球新资讯:基金风格漂移屡见不鲜 行业积弊何时消除
  1. 全球热资讯!从“翻倍基”到跌破面值 基金经理做错了什么?大佬爆料:背后也有苦衷
  1. 环球今亮点!这场越南直播火了!基金经理“亲近”基民花样多 进化还是内卷?
  1. 世界快报:3月份以来新成立15只券结基金 券商、基金各取所需合作共赢
  1. 【全球报资讯】达美乐“30分钟必达”的烦恼
  1. my stupid heart 歌词_stupid girl zip
  1. 全球消息!腾讯app能扫一扫吗_腾讯app有哪些
  1. 微头条丨蒿俊闵锁喉武磊,金敬道戴琳蜂拥而上 ,义愤填膺,原来有猫腻啊!
  1. 今日聚焦!斯帕莱蒂谈欧冠抽签:若要我选对手,我肯定不会选拜仁和曼城
  1. 中国华融 业绩预亏276亿元!
  1. 环球速递!线上直播 | 锂离子电池开发挑战及应对策略
  1. 当前信息:儿童肺结节能治愈吗_儿童肺结核的早期症状
  1. 银条价格今天多少一克(2023年3月17日)
  1. 【时快讯】马戏团buff怎么选择_选择马戏团buff的攻略
  1. 热点聚焦:细思极恐!女子疑杀夫后藏尸冰柜,知情人:其丈夫朋友圈还有更新
  1. 重点聚焦!青龙鱼的做法_青龙鱼
  1. 高平陵之变,如果曹爽选择挟天子抵抗,有没有机会战胜司马懿?