最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

prometheus 服務(wù)發(fā)現(xiàn)原理

2023-03-01 01:57 作者:34895505520_bili  | 我要投稿

服務(wù)發(fā)現(xiàn)

概述

prometheus核心流程


如上圖,Prometheus核心功能包括服務(wù)發(fā)現(xiàn)、數(shù)據(jù)采集和數(shù)據(jù)存儲。服務(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)、請求路徑(metrics_path)、請求參數(shù)(params)等;然后數(shù)據(jù)采集模塊就可以基于這些信息構(gòu)建出一個完整的Http Request請求,定時通過pull http協(xié)議不斷的去目標(biāo)采集點(diǎn)(target)拉取監(jiān)控樣本數(shù)據(jù)(sample);最后,將采集到監(jiān)控樣本數(shù)據(jù)交由TSDB模塊進(jìn)行數(shù)據(jù)存儲。

為什么需要服務(wù)發(fā)現(xiàn)模塊?

類似于微服務(wù)通過引入注冊中心組件解決眾多微服務(wù)間錯綜復(fù)雜的依賴調(diào)用。無論是服務(wù)主動停止,意外掛掉,還是因?yàn)榱髁吭黾訉Ψ?wù)實(shí)現(xiàn)進(jìn)行擴(kuò)容,這些服務(wù)數(shù)據(jù)或狀態(tài)上的動態(tài)變化,通過注冊中心屏蔽服務(wù)狀態(tài)變更造成的影響,簡化了調(diào)用方處理邏輯。

同理,Prometheus最開始設(shè)計(jì)是一個面向云原生應(yīng)用程序的,云原生、容器場景下按需的資源使用方式對于監(jiān)控系統(tǒng)而言就意味著沒有了一個固定的監(jiān)控目標(biāo),所有的監(jiān)控對象(基礎(chǔ)設(shè)施、應(yīng)用、服務(wù))都在動態(tài)的變化。Prometheus解決方案就是引入一個中間的代理人,這個代理人掌握著當(dāng)前所有監(jiān)控目標(biāo)的訪問信息,Prometheus只需要向這個代理人詢問有哪些監(jiān)控目標(biāo)控即可,這種模式被稱為服務(wù)發(fā)現(xiàn)(service discovery)。

目前,Prometheus支持的服務(wù)發(fā)現(xiàn)協(xié)議是非常豐富的,最新版本(2.41)已支持接近三十種服務(wù)發(fā)現(xiàn)協(xié)議:

<azure_sd_config>
<consul_sd_config>
<digitalocean_sd_config>
<docker_sd_config>
<dockerswarm_sd_config>
<dns_sd_config>
<ec2_sd_config>
<openstack_sd_config>
<ovhcloud_sd_config>
<puppetdb_sd_config>
<file_sd_config>
<gce_sd_config>
<hetzner_sd_config>
<http_sd_config>
<ionos_sd_config>
<kubernetes_sd_config>
<kuma_sd_config>
<lightsail_sd_config>
<linode_sd_config>
<marathon_sd_config>
<nerve_sd_config>
<nomad_sd_config>
<serverset_sd_config>
<triton_sd_config>
<eureka_sd_config>
<scaleway_sd_config>
<uyuni_sd_config>
<vultr_sd_config>
<static_config>

服務(wù)發(fā)現(xiàn)配置解析

1、Prometheus服務(wù)啟動加載prometheus.yml配置文件會被解析Config結(jié)構(gòu)體:

?

Config結(jié)構(gòu)體是配置類的最頂層結(jié)構(gòu),內(nèi)部包含6個字段分別對應(yīng)prometheus配置的6大組成部分。

?

2、其中數(shù)據(jù)采集配置部分ScrapeConfigs對應(yīng)的是一個*ScrapeConfig類型切片,一個ScrapeConfig對應(yīng)的是scrape_configs配置下的一個job抓取任務(wù),服務(wù)發(fā)現(xiàn)協(xié)議配置對應(yīng)其中ServiceDiscoveryConfigs字段:

3、discovery.Configs對應(yīng)的是Config切片:

type?Configs?[]Config

所以,一個job抓取任務(wù)下可以配置多個服務(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是一個接口:

prometheus config接口

Config是一個接口的定義,每種服務(wù)發(fā)現(xiàn)協(xié)議都會存在一個對應(yīng)Config接口的實(shí)現(xiàn)(見下圖)。該接口主要定義兩個方法:

1、Name()?string:定義服務(wù)發(fā)現(xiàn)協(xié)議類型,如eureka、kubernetes等等;
2、NewDiscoverer(DiscovererOptions)?(Discoverer,?error):返回一個Discoverer類型變量,該類型也是一個接口,其只定義了一個方法Run方法,即Discoverer是對應(yīng)的服務(wù)發(fā)現(xiàn)協(xié)議具體運(yùn)行邏輯封裝,通過Run方法提供統(tǒng)一的運(yùn)行入口。

服務(wù)發(fā)現(xiàn)核心原理

prometheus 服務(wù)發(fā)現(xiàn)核心流程


說明:

  1. Prometheus服務(wù)發(fā)現(xiàn)核心邏輯的入口主要關(guān)注Manager結(jié)構(gòu)體的ApplyConfig方法:基于服務(wù)發(fā)現(xiàn)的配置使其生效;

  2. ApplyConfig方法包括四個主要步驟:

    type?provider?struct?{
    ?name???string
    ?d??????Discoverer
    ?subs???[]string
    ?config?interface{}
    }

    ?

    一個job下一個服務(wù)發(fā)現(xiàn)協(xié)議對應(yīng)一個Discoverer。

    ?

    provider還有額外三個字段:

    1、nameprovider名稱,格式:fmt.Sprintf("%s/%d", typ, len(m.providers));

    2、subsstring切片,存放job名稱,因?yàn)榭赡懿煌?code>job下存在一致的服務(wù)發(fā)現(xiàn)配置,就只會生成一個provider,然后subs存放job列表;

    3、config:服務(wù)發(fā)現(xiàn)配置

    1. 啟動Discoverer接口Run方法,讓服務(wù)發(fā)現(xiàn)邏輯運(yùn)行;

    2. 協(xié)程中運(yùn)行updater方法;

    3. Discoverer接口Run方法主要基于具體服務(wù)發(fā)現(xiàn)協(xié)議發(fā)現(xiàn)target,然后通過通道傳遞給updater處理邏輯,將其解析處理放入到Manager結(jié)構(gòu)體中targets字段中,并向triggerSend通道發(fā)送信號,表示當(dāng)前targets發(fā)生變更;

    4. Manager結(jié)構(gòu)體sender方法每5秒監(jiān)聽triggerSend通道信號,并將Manager結(jié)構(gòu)體中targets字段處理后放入到syncCh通道中;

    5. 數(shù)據(jù)采集模塊(scrape)監(jiān)聽syncCh通道,就可以獲取到服務(wù)發(fā)現(xiàn)生成的targets信息,然后reloadtarget納入監(jiān)控開始抓取監(jiān)控指標(biāo)。

    6. 啟動provider:遍歷Manager結(jié)構(gòu)體中providers切片,啟動每個provider,該步驟主要是啟動兩個協(xié)程:

      ?

      Manager結(jié)構(gòu)體sender方法是在Prometheus啟動時discoveryManagerScrape.Run()方法中啟動。

      ?
    7. 取消服務(wù)發(fā)現(xiàn):配置變更也會調(diào)用ApplyConfig方法,這時就要把基于之前配置運(yùn)行的服務(wù)發(fā)現(xiàn)服務(wù)取消,然后基于當(dāng)前配置重新生成;

    8. 清空:主要清空discoverCanceltargetsproviders幾個容器元素,因?yàn)橐诋?dāng)前配置重新生成;

    9. 注冊providerprovider是對Discoverer的封裝,不同服務(wù)發(fā)現(xiàn)協(xié)議都會實(shí)現(xiàn)Config接口,其中NewDiscoverer方法就是創(chuàng)建Discoverer

「Prometheus服務(wù)發(fā)現(xiàn)核心就是三個協(xié)程之間協(xié)作:」

  1. 「協(xié)程1:」負(fù)責(zé)運(yùn)行Discoverer接口Run方法,基于協(xié)議發(fā)現(xiàn)采集點(diǎn);

  2. 「協(xié)程2:」負(fù)責(zé)將協(xié)程1發(fā)現(xiàn)的采集點(diǎn)信息更新到Manager結(jié)構(gòu)體中targets字段的map中;

  3. 「協(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個,都定義在discovery/manager.go中:

prometheus_sd_discovered_targets
prometheus_sd_failed_configs
prometheus_sd_received_updates_total
prometheus_sd_updates_delayed_total
prometheus_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)反饋各個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é)議異常錯誤指標(biāo)」

服務(wù)發(fā)現(xiàn)會給每個發(fā)現(xiàn)配置項(xiàng)生成一個provider,并為每個provider使用協(xié)程運(yùn)行,如果基于配置項(xiàng)生成provider錯誤就可以通過prometheus_sd_failed_configs指標(biāo)反饋:

prometheus_sd_failed_configs:gauge類型,當(dāng)前無法加載的服務(wù)發(fā)現(xiàn)配置數(shù)
配置數(shù):一個job可能存在多個服務(wù)發(fā)現(xiàn)協(xié)議配置,對應(yīng)配置項(xiàng)則是多個
示例:
prometheus_sd_failed_configs{name="scrape"}??10
prometheus_sd_failed_configs{name="notify"}?5

一個job可能對應(yīng)多個服務(wù)發(fā)現(xiàn)配置項(xiàng),如下:這個job下配置了static_configsfile_sd_configs兩個服務(wù)發(fā)現(xiàn)協(xié)議配置,則對應(yīng)兩個服務(wù)發(fā)現(xiàn)配置項(xiàng),注冊兩個provider,每個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é)程:

  1. Discoverer協(xié)程(多個):封裝provider,基于協(xié)議發(fā)現(xiàn)采集點(diǎn),這里可能會存在多個,一個provider對應(yīng)一個Discoverer協(xié)程;

  2. updater協(xié)程(1個):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有更新;

  3. sender協(xié)程(1個):sender協(xié)程每5秒檢測triggerSend通道數(shù)據(jù),檢測到更新則將Manager結(jié)構(gòu)體targets數(shù)據(jù)處理封裝寫入到Manager結(jié)構(gòu)體syncCh通道中,scrape模塊監(jiān)測該通道,即完成將服務(wù)發(fā)現(xiàn)模塊scrape模塊交互。

這其中涉及三個指標(biāo):

prometheus_sd_received_updates_total
prometheus_sd_updates_delayed_total
prometheus_sd_updates_total


了解更多云原生監(jiān)控運(yùn)維,微信搜一搜:Reactor2020



prometheus 服務(wù)發(fā)現(xiàn)原理的評論 (共 條)

分享到微博請遵守國家法律
塘沽区| 南宫市| 英德市| 堆龙德庆县| 邵阳县| 宜州市| 辉南县| 普兰店市| 浦东新区| 开原市| 搜索| 临泽县| 桐柏县| 长阳| 喀喇沁旗| 台山市| 永登县| 墨竹工卡县| 井研县| 河北省| 富裕县| 郎溪县| 宣恩县| 丰宁| 庄河市| 应用必备| 射阳县| 华蓥市| 天峨县| 崇明县| 财经| 通辽市| 桂林市| 南靖县| 申扎县| 芜湖市| 五莲县| 两当县| 新营市| 安吉县| 大庆市|