服務(wù)發(fā)現(xiàn)
概述
如上圖,Prometheus核心功能包括服務(wù)發(fā)現(xiàn)、數(shù)據(jù)采集和數(shù)據(jù)存儲(chǔ)。服務(wù)發(fā)現(xiàn)模塊專門負(fù)責(zé)發(fā)現(xiàn)需要監(jiān)控的目標(biāo)采集點(diǎn)(target
)信息,數(shù)據(jù)采集模塊從服務(wù)發(fā)現(xiàn)模塊訂閱該信息,獲取到target
信息后,其中就包含協(xié)議(scheme
)、主機(jī)地址:端口(instance
)、請(qǐng)求路徑(metrics_path
)、請(qǐng)求參數(shù)(params
)等;然后數(shù)據(jù)采集模塊就可以基于這些信息構(gòu)建出一個(gè)完整的Http Request
請(qǐng)求,定時(shí)通過pull http
協(xié)議不斷的去目標(biāo)采集點(diǎn)(target
)拉取監(jiān)控樣本數(shù)據(jù)(sample
);最后,將采集到監(jiān)控樣本數(shù)據(jù)交由TSDB
模塊進(jìn)行數(shù)據(jù)存儲(chǔ)。
【資料圖】
為什么需要服務(wù)發(fā)現(xiàn)模塊?
類似于微服務(wù)通過引入注冊(cè)中心組件解決眾多微服務(wù)間錯(cuò)綜復(fù)雜的依賴調(diào)用。無論是服務(wù)主動(dòng)停止,意外掛掉,還是因?yàn)榱髁吭黾訉?duì)服務(wù)實(shí)現(xiàn)進(jìn)行擴(kuò)容,這些服務(wù)數(shù)據(jù)或狀態(tài)上的動(dòng)態(tài)變化,通過注冊(cè)中心屏蔽服務(wù)狀態(tài)變更造成的影響,簡化了調(diào)用方處理邏輯。
同理,Prometheus
最開始設(shè)計(jì)是一個(gè)面向云原生應(yīng)用程序的,云原生、容器場(chǎng)景下按需的資源使用方式對(duì)于監(jiān)控系統(tǒng)而言就意味著沒有了一個(gè)固定的監(jiān)控目標(biāo),所有的監(jiān)控對(duì)象(基礎(chǔ)設(shè)施、應(yīng)用、服務(wù))都在動(dòng)態(tài)的變化。Prometheus
解決方案就是引入一個(gè)中間的代理人,這個(gè)代理人掌握著當(dāng)前所有監(jiān)控目標(biāo)的訪問信息,Prometheus
只需要向這個(gè)代理人詢問有哪些監(jiān)控目標(biāo)即可,這種模式被稱為服務(wù)發(fā)現(xiàn)(service discovery
)。
目前,Prometheus
支持的服務(wù)發(fā)現(xiàn)協(xié)議是非常豐富的,最新版本(2.41
)已支持接近三十種服務(wù)發(fā)現(xiàn)協(xié)議:
服務(wù)發(fā)現(xiàn)配置解析
1、Prometheus
服務(wù)啟動(dòng)加載prometheus.yml
配置文件會(huì)被解析Config
結(jié)構(gòu)體:
?
Config
結(jié)構(gòu)體是配置類的最頂層結(jié)構(gòu),內(nèi)部包含6個(gè)字段分別對(duì)應(yīng)prometheus
配置的6大組成部分。
?
2、其中數(shù)據(jù)采集配置部分ScrapeConfigs
對(duì)應(yīng)的是一個(gè)*ScrapeConfig類型
切片,一個(gè)ScrapeConfig
對(duì)應(yīng)的是scrape_configs
配置下的一個(gè)job
抓取任務(wù),服務(wù)發(fā)現(xiàn)協(xié)議配置對(duì)應(yīng)其中ServiceDiscoveryConfigs
字段:
3、discovery.Configs
對(duì)應(yīng)的是Config
切片:
type Configs []Config
所以,一個(gè)job
抓取任務(wù)下可以配置多個(gè)服務(wù)發(fā)現(xiàn)協(xié)議,如:
- job_name: "prometheus" metrics_path: /metrics static_configs: - targets: ["124.222.45.207:9090"] file_sd_configs: - files: - targets/t1.json - targets/t2.json refresh_interval: 5m
4、Config
是一個(gè)接口:
Config
是一個(gè)接口的定義,每種服務(wù)發(fā)現(xiàn)協(xié)議都會(huì)存在一個(gè)對(duì)應(yīng)Config
接口的實(shí)現(xiàn)(見下圖)。該接口主要定義兩個(gè)方法:
1、Name() string:定義服務(wù)發(fā)現(xiàn)協(xié)議類型,如eureka、kubernetes等等;2、NewDiscoverer(DiscovererOptions) (Discoverer, error):返回一個(gè)Discoverer類型變量,該類型也是一個(gè)接口,其只定義了一個(gè)方法Run方法,即Discoverer是對(duì)應(yīng)的服務(wù)發(fā)現(xiàn)協(xié)議具體運(yùn)行邏輯封裝,通過Run方法提供統(tǒng)一的運(yùn)行入口。
服務(wù)發(fā)現(xiàn)核心原理
說明:
Prometheus
服務(wù)發(fā)現(xiàn)核心邏輯的入口主要關(guān)注Manager
結(jié)構(gòu)體的ApplyConfig
方法:基于服務(wù)發(fā)現(xiàn)的配置使其生效;
ApplyConfig
方法包括四個(gè)主要步驟:
type provider struct { name string d Discoverer subs []string config interface{}}
?一個(gè)job下一個(gè)服務(wù)發(fā)現(xiàn)協(xié)議對(duì)應(yīng)一個(gè)Discoverer。?
provider
還有額外三個(gè)字段:
1、name
:provider
名稱,格式:fmt.Sprintf("%s/%d", typ, len(m.providers))
;
2、subs
:string
切片,存放job
名稱,因?yàn)榭赡懿煌?code>job下存在一致的服務(wù)發(fā)現(xiàn)配置,就只會(huì)生成一個(gè)provider
,然后subs
存放job
列表;
3、config
:服務(wù)發(fā)現(xiàn)配置
Discoverer
接口Run
方法,讓服務(wù)發(fā)現(xiàn)邏輯運(yùn)行;協(xié)程中運(yùn)行updater
方法;Discoverer
接口Run
方法主要基于具體服務(wù)發(fā)現(xiàn)協(xié)議發(fā)現(xiàn)target
,然后通過通道傳遞給updater
處理邏輯,將其解析處理放入到Manager
結(jié)構(gòu)體中targets
字段中,并向triggerSend
通道發(fā)送信號(hào),表示當(dāng)前targets
發(fā)生變更;Manager
結(jié)構(gòu)體sender
方法每5秒監(jiān)聽triggerSend
通道信號(hào),并將Manager
結(jié)構(gòu)體中targets
字段處理后放入到syncCh
通道中;數(shù)據(jù)采集模塊(scrape
)監(jiān)聽syncCh
通道,就可以獲取到服務(wù)發(fā)現(xiàn)生成的targets
信息,然后reload
將target
納入監(jiān)控開始抓取監(jiān)控指標(biāo)。啟動(dòng)provider
:遍歷Manager
結(jié)構(gòu)體中providers
切片,啟動(dòng)每個(gè)provider
,該步驟主要是啟動(dòng)兩個(gè)協(xié)程:?Manager
結(jié)構(gòu)體sender
方法是在Prometheus
啟動(dòng)時(shí)discoveryManagerScrape.Run()
方法中啟動(dòng)。?取消服務(wù)發(fā)現(xiàn):配置變更也會(huì)調(diào)用ApplyConfig
方法,這時(shí)就要把基于之前配置運(yùn)行的服務(wù)發(fā)現(xiàn)服務(wù)取消,然后基于當(dāng)前配置重新生成;清空:主要清空discoverCancel
、targets
和providers
幾個(gè)容器元素,因?yàn)橐诋?dāng)前配置重新生成;注冊(cè)provider
:provider
是對(duì)Discoverer
的封裝,不同服務(wù)發(fā)現(xiàn)協(xié)議都會(huì)實(shí)現(xiàn)Config
接口,其中NewDiscoverer
方法就是創(chuàng)建Discoverer
「Prometheus服務(wù)發(fā)現(xiàn)核心就是三個(gè)協(xié)程之間協(xié)作:」
「協(xié)程1:」負(fù)責(zé)運(yùn)行Discoverer
接口Run
方法,基于協(xié)議發(fā)現(xiàn)采集點(diǎn);「協(xié)程2:」負(fù)責(zé)將協(xié)程1發(fā)現(xiàn)的采集點(diǎn)信息更新到Manager
結(jié)構(gòu)體中targets
字段的map
中;「協(xié)程3:」負(fù)責(zé)將Manager
結(jié)構(gòu)體中targets
字段的數(shù)據(jù)通過通道發(fā)送給scrape
模塊;scrape模塊獲取到采集點(diǎn)如何進(jìn)行數(shù)據(jù)采集后續(xù)scrape模塊分析。
監(jiān)控指標(biāo)
Prometheus
服務(wù)發(fā)現(xiàn)通用指標(biāo)主要有如下5個(gè),都定義在discovery/manager.go
中:
prometheus_sd_discovered_targetsprometheus_sd_failed_configsprometheus_sd_received_updates_totalprometheus_sd_updates_delayed_totalprometheus_sd_updates_total
「1、采集點(diǎn)數(shù)量指標(biāo)」
服務(wù)發(fā)現(xiàn)主要基于協(xié)議發(fā)現(xiàn)采集目標(biāo),prometheus_sd_discovered_targets
指標(biāo)反饋各個(gè)job
發(fā)現(xiàn)的采集目標(biāo)數(shù):
prometheus_sd_discovered_targets:gauge類型,當(dāng)前發(fā)現(xiàn)的目標(biāo)數(shù)config:job名稱name:取值scrape和notify,區(qū)分指標(biāo)抓取服務(wù)發(fā)現(xiàn)還是告警通知服務(wù)發(fā)現(xiàn)示例:prometheus_sd_discovered_targets{config="auth_es1", name="scrape"} 12
?這里基于協(xié)議發(fā)現(xiàn)的目標(biāo)數(shù),還未進(jìn)入采集模塊,并不能區(qū)分是在線還是離線。?
「2、服務(wù)發(fā)現(xiàn)協(xié)議異常錯(cuò)誤指標(biāo)」
服務(wù)發(fā)現(xiàn)會(huì)給每個(gè)發(fā)現(xiàn)配置項(xiàng)生成一個(gè)provider
,并為每個(gè)provider
使用協(xié)程運(yùn)行,如果基于配置項(xiàng)生成provider
錯(cuò)誤就可以通過prometheus_sd_failed_configs
指標(biāo)反饋:
prometheus_sd_failed_configs:gauge類型,當(dāng)前無法加載的服務(wù)發(fā)現(xiàn)配置數(shù)配置數(shù):一個(gè)job可能存在多個(gè)服務(wù)發(fā)現(xiàn)協(xié)議配置,對(duì)應(yīng)配置項(xiàng)則是多個(gè)示例:prometheus_sd_failed_configs{name="scrape"} 10prometheus_sd_failed_configs{name="notify"} 5
一個(gè)job
可能對(duì)應(yīng)多個(gè)服務(wù)發(fā)現(xiàn)配置項(xiàng),如下:這個(gè)job
下配置了static_configs
和file_sd_configs
兩個(gè)服務(wù)發(fā)現(xiàn)協(xié)議配置,則對(duì)應(yīng)兩個(gè)服務(wù)發(fā)現(xiàn)配置項(xiàng),注冊(cè)兩個(gè)provider
,每個(gè)provider
在獨(dú)立協(xié)程中運(yùn)行:
scrape_configs: # The job name is added as a label `job=` to any timeseries scraped from this config. - job_name: "test" static_configs: - targets: ["localhost:9090"] file_sd_configs: - refresh_interval: 5m files: - targets/manual.*.json
「3、協(xié)程交互指標(biāo)」
服務(wù)發(fā)現(xiàn)主要涉及3類協(xié)程:
Discoverer協(xié)程
(多個(gè)):封裝provider
,基于協(xié)議發(fā)現(xiàn)采集點(diǎn),這里可能會(huì)存在多個(gè),一個(gè)provider
對(duì)應(yīng)一個(gè)Discoverer協(xié)程
;updater協(xié)程
(1個(gè)):Discoverer協(xié)程
發(fā)現(xiàn)采集點(diǎn),通過channel通道
通知到updater協(xié)程
,updater協(xié)程
將采集點(diǎn)更新到Manager結(jié)構(gòu)體
中targets字段
中,然后向Manager結(jié)構(gòu)體
中triggerSend通道
寫入數(shù)據(jù),告訴sender
協(xié)程targets
有更新;sender協(xié)程
(1個(gè)):sender協(xié)程
每5秒檢測(cè)triggerSend
通道數(shù)據(jù),檢測(cè)到更新則將Manager
結(jié)構(gòu)體targets
數(shù)據(jù)處理封裝寫入到Manager
結(jié)構(gòu)體syncCh
通道中,scrape
模塊監(jiān)測(cè)該通道,即完成將服務(wù)發(fā)現(xiàn)模塊
和scrape模塊
交互。這其中涉及三個(gè)指標(biāo):
prometheus_sd_received_updates_totalprometheus_sd_updates_delayed_totalprometheus_sd_updates_total
關(guān)鍵詞: