当前位置: 首页>关注 >
【prometheus】-02 一张图彻底搞懂Prometheus服务发现机制 天天快看
2023-03-25 12:54:37 来源:腾讯云
概述
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
组件,然后reload
将target
纳入监控开始抓取监控指标。
配置处理部分会根据scrape_configs
部分配置的不同协议类型生成不同Discoverer
,然后根据它们内部不同的实现逻辑去发现target
,discoveryManager
组件则相当于一个搬运工,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服务发现机制 天天快看
-
快资讯:去年的毛衣可以丢掉了,今秋流行的针织衫太漂亮了,显气质更时髦
-
今年重庆计划供地14762公顷 重点保障重大基础设施项目等 前沿资讯
-
桧木是什么木材_环球百事通
-
数十家品牌上百款车型扎堆降价促销 多家车企高管宣称要打“价值战”|即时
-
钢力士厉害吗_钢力士-世界速递
-
焦点关注:社科院专家:中巴可在多个领域深化合作
-
今日播报!英雄联盟实名注册信息存在问题_英雄联盟实名注册
-
新产业:“医用耗材存储盒加载装置的扫描检测装置及方法”取得专利证书 全球即时
-
天天播报:工作的第二年,可以享受几天年休假?
-
全球要闻:2017年端午节是几月几日
-
中泰共同举办语言与职业教育人才合作交流会
-
如何快速实现一个定时器 环球新资讯
-
最新消息:高校女生被强奸后与男友跳楼?警方:强奸案与跳楼事件当事人无关联
-
环球观天下!广州增城幼儿园生均补助使用注意事项2023
-
桑植县人民医院荣获湖南省全科专业指导医师教学查房技能竞赛二等奖-世界微头条
-
良法促善治 发展添活力(基层治理新实践)
-
延禧攻略顺嫔介绍-世界速讯
-
观想科技:融资净买入186.7万元,融资余额5439.98万元(03-23)
-
www.haeea.cn河南省普通高校招生考生服务平台_河南省普通高校招生考生服务平台进不去 实时焦点
推荐内容
- 【prometheus】-02 一张图彻底搞懂Prometheus服
- 快资讯:去年的毛衣可以丢掉了,今秋流行的针织衫
- 今年重庆计划供地14762公顷 重点保障重大基础设
- 桧木是什么木材_环球百事通
- 数十家品牌上百款车型扎堆降价促销 多家车企高管
- 钢力士厉害吗_钢力士-世界速递
- 焦点关注:社科院专家:中巴可在多个领域深化合作
- 今日播报!英雄联盟实名注册信息存在问题_英雄联盟
- 新产业:“医用耗材存储盒加载装置的扫描检测装置
- 天天播报:工作的第二年,可以享受几天年休假?
- 全球要闻:2017年端午节是几月几日
- 中泰共同举办语言与职业教育人才合作交流会
- 如何快速实现一个定时器 环球新资讯
- 最新消息:高校女生被强奸后与男友跳楼?警方:强
- 环球观天下!广州增城幼儿园生均补助使用注意事项
- 桑植县人民医院荣获湖南省全科专业指导医师教学查
- 良法促善治 发展添活力(基层治理新实践)
- 延禧攻略顺嫔介绍-世界速讯
- 观想科技:融资净买入186.7万元,融资余额5439.98
- www.haeea.cn河南省普通高校招生考生服务平台_河
- 3月23日基金净值:招商中证银行指数A最新净值1.10
- 天天简讯:美俄博弈黑海地区:两国在黑海地区存在
- 北京今年第四批次集中供地:2宗商品住宅用地已成
- 采字的偏旁 每日讯息
- 机构今日抛售这13股,买入中际旭创5.77亿元丨龙虎
- 忐忑不安的心理活动片段_忐忑不安的心理活动片段
- 视讯!销量锐减4成,市值暴跌近2亿,这个网红品牌
- 环球消息!“走基层 看备耕”系列报道④“大家伙
- 世界速讯:西部最新形势:湖人重回第10勇士守住第
- 怎么辨别天梭t461真假
- 《云顶之弈》S8.5爱爱福牛阵容搭配攻略-全球微资讯
- 天天热议:395万元/亩,商丘成功出让1宗优质住宅用地
- 世界简讯:2023年省重点文旅产业项目公布 80个项
- 东方基金调研超图软件 世界快播报
- 红米3x上市时间
- 消息!抗菌面料板块3月22日涨0.45%,酷特智能领涨
- 红烧鳖肉怎么做_制作红烧鳖肉的方法_世界球精选
- 小学一年级上学期学生期末评语_小学一年级第一学
- 长源电力:拟潜江新能源增资2.16亿元 投建浩口光
- varsden是什么档次
产业
-
传音控股上半年营收231.09亿元 非洲智能机市场占有率超过40% 妥妥的“非洲之王”
2022-08-25
-
2022-08-17
-
2021-10-20
油气
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
经济
-
中新网通辽10月18日电 (记者 张林虎)18日,记者从内蒙古自治区通辽市奈曼旗公安局获悉,国家一级保护动物--梅花鹿误入当地村民羊群,
-
中新网杭州10月18日电 (王题题 胡燕婕)云天收夏色,浅秋正渐浓。10月18日,浙江杭州市西湖游船有限公司推出的惠民多站点“西湖环湖游
-
中新网福州10月18日电 (记者 龙敏 王东明)福州市晋安区官方18日晚间通报,18日14时47分,晋安区岳峰镇化工路爱摩轮商业广场项目摩天
-
中新网兰州10月18日电 (闫姣 艾庆龙 吉翔)“红山白土头,黄河向西流。”不少人疑问,天下黄河向东流,为何甘肃永靖县这段黄河却向西
-
中新网北京10月18日电 《清华城市健康设施指数》18日在北京发布。报告成果显示,城市健康设施指数领先城市以中心城市和东部沿海城市