第1章 天降奇兵

公司的監(jiān)控系統(tǒng)有Zabbix和Prometheus+Grafana,對(duì)于Prometheus這一塊本人不大熟悉。掛著下一代監(jiān)控的名號(hào),很有必要學(xué)習(xí)下。下面就是我看書(shū)學(xué)習(xí)的一些筆記,因?yàn)闀?shū)本內(nèi)容已經(jīng)很簡(jiǎn)練了,所以很多都是直接摘取原文。
書(shū)籍原文可以查看作者的Github,https://github.com/yunlzheng/prometheus-book


本章作為全書(shū)的開(kāi)篇,我們會(huì)帶讀者了解Prometheus的前世今生,Prometheus是如何從眾多的監(jiān)控平臺(tái)中脫穎而出成為下一代監(jiān)控系統(tǒng)的首選。同時(shí)通過(guò)一個(gè)簡(jiǎn)單的例子帶領(lǐng)讀者快速了解Prometheus是如何工作的,從而了解Prometheus中的一些概念以及架構(gòu)模式。

1.1 Prometheus簡(jiǎn)介

Prometheus受啟發(fā)于Google的Brogmon監(jiān)控系統(tǒng)(相似的Kubernetes是從Google的Brog系統(tǒng)演變而來(lái)),從2012年開(kāi)始由前Google工程師在Soundcloud以開(kāi)源軟件的形式進(jìn)行研發(fā),并且于2015年早期對(duì)外發(fā)布早期版本。2016年5月繼Kubernetes之后成為第二個(gè)正式加入CNCF基金會(huì)的項(xiàng)目,同年6月正式發(fā)布1.0版本。2017年底發(fā)布了基于全新存儲(chǔ)層的2.0版本,能更好地與容器平臺(tái)、云平臺(tái)配合。

Prometheus作為新一代的云原生監(jiān)控系統(tǒng),目前已經(jīng)有超過(guò)650+位貢獻(xiàn)者參與到Prometheus的研發(fā)工作上,并且超過(guò)120+項(xiàng)的第三方集成。

1.1.1 監(jiān)控的目標(biāo)

在《SRE: Google運(yùn)維解密》一書(shū)中指出,監(jiān)控系統(tǒng)需要能夠有效的支持白盒監(jiān)控和黑盒監(jiān)控。通過(guò)白盒能夠了解其內(nèi)部的實(shí)際運(yùn)行狀態(tài),通過(guò)對(duì)監(jiān)控指標(biāo)的觀察能夠預(yù)判可能出現(xiàn)的問(wèn)題,從而對(duì)潛在的不確定因素進(jìn)行優(yōu)化。而黑盒監(jiān)控,常見(jiàn)的如HTTP探針,TCP探針等,可以在系統(tǒng)或者服務(wù)在發(fā)生故障時(shí)能夠快速通知相關(guān)的人員進(jìn)行處理。通過(guò)建立完善的監(jiān)控體系,從而達(dá)到以下目的:

  • 長(zhǎng)期趨勢(shì)分析:通過(guò)對(duì)監(jiān)控樣本數(shù)據(jù)的持續(xù)收集和統(tǒng)計(jì),對(duì)監(jiān)控指標(biāo)進(jìn)行長(zhǎng)期趨勢(shì)分析。例如,通過(guò)對(duì)磁盤(pán)空間增長(zhǎng)率的判斷,我們可以提前預(yù)測(cè)在未來(lái)什么時(shí)間節(jié)點(diǎn)上需要對(duì)資源進(jìn)行擴(kuò)容。

  • 對(duì)照分析:兩個(gè)版本的系統(tǒng)運(yùn)行資源使用情況的差異如何?在不同容量情況下系統(tǒng)的并發(fā)和負(fù)載變化如何?通過(guò)監(jiān)控能夠方便的對(duì)系統(tǒng)進(jìn)行跟蹤和比較。

  • 告警:當(dāng)系統(tǒng)出現(xiàn)或者即將出現(xiàn)故障時(shí),監(jiān)控系統(tǒng)需要迅速反應(yīng)并通知管理員,從而能夠?qū)?wèn)題進(jìn)行快速的處理或者提前預(yù)防問(wèn)題的發(fā)生,避免出現(xiàn)對(duì)業(yè)務(wù)的影響。

  • 故障分析與定位:當(dāng)問(wèn)題發(fā)生后,需要對(duì)問(wèn)題進(jìn)行調(diào)查和處理。通過(guò)對(duì)不同監(jiān)控監(jiān)控以及歷史數(shù)據(jù)的分析,能夠找到并解決根源問(wèn)題。

  • 數(shù)據(jù)可視化:通過(guò)可視化儀表盤(pán)能夠直接獲取系統(tǒng)的運(yùn)行狀態(tài)、資源使用情況、以及服務(wù)運(yùn)行狀態(tài)等直觀的信息。

1.1.2 與常見(jiàn)監(jiān)控系統(tǒng)比較

對(duì)于常用的監(jiān)控系統(tǒng),如Nagios、Zabbix的用戶(hù)而言,往往并不能很好的解決上述問(wèn)題。這里以Nagios為例,如下圖所示是Nagios監(jiān)控系統(tǒng)的基本架構(gòu):

Nagios的主要功能是監(jiān)控服務(wù)和主機(jī)。Nagios軟件需要安裝在一臺(tái)獨(dú)立的服務(wù)器上運(yùn)行,該服務(wù)器稱(chēng)為監(jiān)控中心。每一臺(tái)被監(jiān)控的硬件主機(jī)或者服務(wù)都需要運(yùn)行一個(gè)與監(jiān)控中心服務(wù)器進(jìn)行通信的Nagios軟件后臺(tái)程序,可以理解為Agent或者插件。

首先對(duì)于Nagios而言,大部分的監(jiān)控能力都是圍繞系統(tǒng)的一些邊緣性的問(wèn)題,主要針對(duì)系統(tǒng)服務(wù)和資源的狀態(tài)以及應(yīng)用程序的可用性。 例如:Nagios通過(guò)check_disk插件可以用于檢查磁盤(pán)空間,check_load用于檢查CPU負(fù)載等。這些插件會(huì)返回4種Nagios可識(shí)別的狀態(tài),0(OK)表示正常,1(WARNING)表示警告,2(CRITTCAL)表示錯(cuò)誤,3(UNKNOWN)表示未知錯(cuò)誤,并通過(guò)Web UI顯示出來(lái)。

對(duì)于Nagios這類(lèi)系統(tǒng)而言,其核心是采用了測(cè)試和告警(check&alert)的監(jiān)控系統(tǒng)模型。 對(duì)于基于這類(lèi)模型的監(jiān)控系統(tǒng)而言往往存在以下問(wèn)題:

  • 與業(yè)務(wù)脫離的監(jiān)控:監(jiān)控系統(tǒng)獲取到的監(jiān)控指標(biāo)與業(yè)務(wù)本身也是一種分離的關(guān)系。好比客戶(hù)可能關(guān)注的是服務(wù)的可用性、服務(wù)的SLA等級(jí),而監(jiān)控系統(tǒng)卻只能根據(jù)系統(tǒng)負(fù)載去產(chǎn)生告警;

  • 運(yùn)維管理難度大:Nagios這一類(lèi)監(jiān)控系統(tǒng)本身運(yùn)維管理難度就比較大,需要有專(zhuān)業(yè)的人員進(jìn)行安裝,配置和管理,而且過(guò)程并不簡(jiǎn)單;

  • 可擴(kuò)展性低: 監(jiān)控系統(tǒng)自身難以擴(kuò)展,以適應(yīng)監(jiān)控規(guī)模的變化;

  • 問(wèn)題定位難度大:當(dāng)問(wèn)題產(chǎn)生之后(比如主機(jī)負(fù)載異常增加)對(duì)于用戶(hù)而言,他們看到的依然是一個(gè)黑盒,他們無(wú)法了解主機(jī)上服務(wù)真正的運(yùn)行情況,因此當(dāng)故障發(fā)生后,這些告警信息并不能有效的支持用戶(hù)對(duì)于故障根源問(wèn)題的分析和定位。

1.1.3 Prometheus的優(yōu)勢(shì)

Prometheus是一個(gè)開(kāi)源的完整監(jiān)控解決方案,其對(duì)傳統(tǒng)監(jiān)控系統(tǒng)的測(cè)試和告警模型進(jìn)行了徹底的顛覆,形成了基于中央化的規(guī)則計(jì)算、統(tǒng)一分析和告警的新模型。 相比于傳統(tǒng)監(jiān)控系統(tǒng)Prometheus具有以下優(yōu)點(diǎn):

易于管理

Prometheus核心部分只有一個(gè)單獨(dú)的二進(jìn)制文件,不存在任何的第三方依賴(lài)(數(shù)據(jù)庫(kù),緩存等等)。唯一需要的就是本地磁盤(pán),因此不會(huì)有潛在級(jí)聯(lián)故障的風(fēng)險(xiǎn)。

Prometheus基于Pull模型的架構(gòu)方式,可以在任何地方(本地電腦,開(kāi)發(fā)環(huán)境,測(cè)試環(huán)境)搭建我們的監(jiān)控系統(tǒng)。對(duì)于一些復(fù)雜的情況,還可以使用Prometheus服務(wù)發(fā)現(xiàn)(Service Discovery)的能力動(dòng)態(tài)管理監(jiān)控目標(biāo)。

監(jiān)控服務(wù)的內(nèi)部運(yùn)行狀態(tài)

Pometheus鼓勵(lì)用戶(hù)監(jiān)控服務(wù)的內(nèi)部狀態(tài),基于Prometheus豐富的Client庫(kù),用戶(hù)可以輕松的在應(yīng)用程序中添加對(duì)Prometheus的支持,從而讓用戶(hù)可以獲取服務(wù)和應(yīng)用內(nèi)部真正的運(yùn)行狀態(tài)。

強(qiáng)大的數(shù)據(jù)模型

所有采集的監(jiān)控?cái)?shù)據(jù)均以指標(biāo)(metric)的形式保存在內(nèi)置的時(shí)間序列數(shù)據(jù)庫(kù)當(dāng)中(TSDB)。所有的樣本除了基本的指標(biāo)名稱(chēng)以外,還包含一組用于描述該樣本特征的標(biāo)簽。

如下所示:

http_request_status{code='200',content_path='/api/path', environment='produment'} => [value1@timestamp1,value2@timestamp2...]
http_request_status{code='200',content_path='/api/path2', environment='produment'} => [value1@timestamp1,value2@timestamp2...]

每一條時(shí)間序列由指標(biāo)名稱(chēng)(Metrics Name)以及一組標(biāo)簽(Labels)唯一標(biāo)識(shí)。每條時(shí)間序列按照時(shí)間的先后順序存儲(chǔ)一系列的樣本值。

表示維度的標(biāo)簽可能來(lái)源于你的監(jiān)控對(duì)象的狀態(tài),比如code=404或者content_path=/api/path。也可能來(lái)源于的你的環(huán)境定義,比如environment=produment?;谶@些Labels我們可以方便地對(duì)監(jiān)控?cái)?shù)據(jù)進(jìn)行聚合,過(guò)濾,裁剪。

強(qiáng)大的查詢(xún)語(yǔ)言PromQL

Prometheus內(nèi)置了一個(gè)強(qiáng)大的數(shù)據(jù)查詢(xún)語(yǔ)言PromQL。 通過(guò)PromQL可以實(shí)現(xiàn)對(duì)監(jiān)控?cái)?shù)據(jù)的查詢(xún)、聚合。同時(shí)PromQL也被應(yīng)用于數(shù)據(jù)可視化(如Grafana)以及告警當(dāng)中。

通過(guò)PromQL可以輕松回答類(lèi)似于以下問(wèn)題:

  • 在過(guò)去一段時(shí)間中95%應(yīng)用延遲時(shí)間的分布范圍?

  • 預(yù)測(cè)在4小時(shí)后,磁盤(pán)空間占用大致會(huì)是什么情況?

  • CPU占用率前5位的服務(wù)有哪些?(過(guò)濾)

高效

對(duì)于監(jiān)控系統(tǒng)而言,大量的監(jiān)控任務(wù)必然導(dǎo)致有大量的數(shù)據(jù)產(chǎn)生。而Prometheus可以高效地處理這些數(shù)據(jù),對(duì)于單一Prometheus Server實(shí)例而言它可以處理:

  • 數(shù)以百萬(wàn)的監(jiān)控指標(biāo)

  • 每秒處理數(shù)十萬(wàn)的數(shù)據(jù)點(diǎn)。

可擴(kuò)展

Prometheus是如此簡(jiǎn)單,因此你可以在每個(gè)數(shù)據(jù)中心、每個(gè)團(tuán)隊(duì)運(yùn)行獨(dú)立的Prometheus Sevrer。Prometheus對(duì)于聯(lián)邦集群的支持,可以讓多個(gè)Prometheus實(shí)例產(chǎn)生一個(gè)邏輯集群,當(dāng)單實(shí)例Prometheus Server處理的任務(wù)量過(guò)大時(shí),通過(guò)使用功能分區(qū)(sharding)+聯(lián)邦集群(federation)可以對(duì)其進(jìn)行擴(kuò)展。

易于集成

使用Prometheus可以快速搭建監(jiān)控服務(wù),并且可以非常方便地在應(yīng)用程序中進(jìn)行集成。目前支持: Java, JMX, Python, Go,Ruby, .Net, Node.js等等語(yǔ)言的客戶(hù)端SDK,基于這些SDK可以快速讓?xiě)?yīng)用程序納入到Prometheus的監(jiān)控當(dāng)中,或者開(kāi)發(fā)自己的監(jiān)控?cái)?shù)據(jù)收集程序。同時(shí)這些客戶(hù)端收集的監(jiān)控?cái)?shù)據(jù),不僅僅支持Prometheus,還能支持Graphite這些其他的監(jiān)控工具。
同時(shí)Prometheus還支持與其他的監(jiān)控系統(tǒng)進(jìn)行集成:Graphite, Statsd, Collected, Scollector, muini, Nagios等。
Prometheus社區(qū)還提供了大量第三方實(shí)現(xiàn)的監(jiān)控?cái)?shù)據(jù)采集支持:JMX, CloudWatch, EC2, MySQL, PostgresSQL, Haskell, Bash, SNMP, Consul, Haproxy, Mesos, Bind, CouchDB, Django, Memcached, RabbitMQ, Redis, RethinkDB, Rsyslog等等。

可視化

Prometheus Server中自帶了一個(gè)Prometheus UI,通過(guò)這個(gè)UI可以方便地直接對(duì)數(shù)據(jù)進(jìn)行查詢(xún),并且支持直接以圖形化的形式展示數(shù)據(jù)。同時(shí)Prometheus還提供了一個(gè)獨(dú)立的基于Ruby On Rails的Dashboard解決方案Promdash。最新的Grafana可視化工具也已經(jīng)提供了完整的Prometheus支持,基于Grafana可以創(chuàng)建更加精美的監(jiān)控圖標(biāo)?;赑rometheus提供的API還可以實(shí)現(xiàn)自己的監(jiān)控可視化UI。

開(kāi)放性

通常來(lái)說(shuō)當(dāng)我們需要監(jiān)控一個(gè)應(yīng)用程序時(shí),一般需要該應(yīng)用程序提供對(duì)相應(yīng)監(jiān)控系統(tǒng)協(xié)議的支持。因此應(yīng)用程序會(huì)與所選擇的監(jiān)控系統(tǒng)進(jìn)行綁定。為了減少這種綁定所帶來(lái)的限制。對(duì)于決策者而言要么你就直接在應(yīng)用中集成該監(jiān)控系統(tǒng)的支持,要么就在外部創(chuàng)建單獨(dú)的服務(wù)來(lái)適配不同的監(jiān)控系統(tǒng)。

而對(duì)于Prometheus來(lái)說(shuō),使用Prometheus的client library的輸出格式不止支持Prometheus的格式化數(shù)據(jù),也可以輸出支持其它監(jiān)控系統(tǒng)的格式化數(shù)據(jù),比如Graphite。

因此你甚至可以在不使用Prometheus的情況下,采用Prometheus的client library來(lái)讓你的應(yīng)用程序支持監(jiān)控?cái)?shù)據(jù)采集。

接下來(lái),在本書(shū)當(dāng)中,將帶領(lǐng)讀者感受Prometheus是如何對(duì)監(jiān)控系統(tǒng)的重新定義。

1.2 初識(shí)Prometheus

Prometheus是一個(gè)開(kāi)放性的監(jiān)控解決方案,用戶(hù)可以非常方便的安裝和使用Prometheus并且能夠非常方便的對(duì)其進(jìn)行擴(kuò)展。為了能夠更加直觀的了解Prometheus Server,接下來(lái)我們將在本地部署并運(yùn)行一個(gè)Prometheus Server實(shí)例,通過(guò)Node Exporter采集當(dāng)前主機(jī)的系統(tǒng)資源使用情況。 并通過(guò)Grafana創(chuàng)建一個(gè)簡(jiǎn)單的可視化儀表盤(pán)。

這部分的內(nèi)容主要包括4個(gè)方面,其中Prometheus+Grafana的安裝配置以及使用Node Exporter收集當(dāng)前主機(jī)信息部分可以查看我的博客。這里還初步介紹了如何使用PromQL去查詢(xún)監(jiān)控?cái)?shù)據(jù),下面是摘取的部分:

1.2.1 使用PromQL查詢(xún)監(jiān)控?cái)?shù)據(jù)

在前面我們已經(jīng)安裝好了Node Export并且在Prometheus界面上能看到這個(gè)實(shí)例了,為了能夠通過(guò)點(diǎn)擊直接查看這些metrics,我們把Prometheus配置文件稍微修改下,然后重啟Prometheus。

   #采集node exporter監(jiān)控?cái)?shù)據(jù)
  - job_name: 'node'
    static_configs:
    - targets: ['192.168.113.52:9100']   ##原來(lái)是 localhost:9100

下面我們來(lái)看下Node Exporter采集到的數(shù)據(jù)都有些什么的吧,訪問(wèn) http://192.168.113.52:9100/metrics ,可以看到當(dāng)前主機(jī)的Node Exporter的采集數(shù)據(jù),如下所示:

我們來(lái)看下其中的一些指標(biāo)信息的解析:

# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 77887.17

其中Help用于解析當(dāng)前指標(biāo)的含義,Type則說(shuō)明了數(shù)據(jù)的類(lèi)型,這是一個(gè) counter(計(jì)數(shù)器)類(lèi)型的數(shù)據(jù),接下來(lái)就是具體的指標(biāo)的值,counter是一個(gè)只增不減的類(lèi)型。
除此之外,我們還能看到其他的信息比如:

  • node_boot_time_seconds 系統(tǒng)啟動(dòng)時(shí)間
  • node_memory* 內(nèi)存信息

從上面可以看到,node exporter采集到的數(shù)據(jù)非常多,有什么快速的辦法能夠?qū)@些數(shù)據(jù)進(jìn)行查詢(xún)么,就好像SQL一樣。答案就是PromQL了,在Prometheus的web頁(yè)面上,一打開(kāi)就是一個(gè)查詢(xún)頁(yè)面,我們輸入 up 看下會(huì)篩選出什么。

這里能看到查詢(xún)出來(lái)的結(jié)果是當(dāng)前的兩個(gè)定義在Prometheus的實(shí)例(一個(gè)是自帶的),其中1表示正常,0的話(huà)則為異常。

up{instance="192.168.113.52:9090",job="prometheus"} 1
up{instance="192.168.113.52:9100",job="node"}   1

打開(kāi)Prometheus web界面默認(rèn)的面板叫做Graph面板,下面我們給出更多的示例來(lái)學(xué)習(xí)下如何使用PromQL。
我們要查看主機(jī)的負(fù)載情況的變化,比如一分鐘的負(fù)載情況,我們可以使用關(guān)鍵字 node_load1 來(lái)查詢(xún),點(diǎn)擊執(zhí)行后切換到Graph界面可以看到一個(gè)折線圖:

這里有個(gè)坑要注意了,Prometheus這里顯示的時(shí)間是UTC時(shí)間,和我們的時(shí)間有8小時(shí)的時(shí)差。

PromQL是Prometheus自定義的一套強(qiáng)大的數(shù)據(jù)查詢(xún)語(yǔ)言,除了使用監(jiān)控指標(biāo)作為查詢(xún)關(guān)鍵字以為,還內(nèi)置了大量的函數(shù),幫助用戶(hù)進(jìn)一步對(duì)時(shí)序數(shù)據(jù)進(jìn)行處理。例如使用rate()函數(shù),可以計(jì)算在單位時(shí)間內(nèi)樣本數(shù)據(jù)的變化情況即增長(zhǎng)率,因此通過(guò)該函數(shù)我們可以近似的通過(guò)CPU使用時(shí)間計(jì)算CPU的利用率:

rate(node_cpu_seconds_total[2m])

這個(gè)圖顯示的內(nèi)容太多了,比如說(shuō)我這里有兩個(gè)CPU,但是我想要忽略掉CPU,去除CPU標(biāo)簽后的聚合語(yǔ)句:

avg without(cpu) (rate(node_cpu_seconds_total[2m]))

因?yàn)槲业闹鳈C(jī)的CPU負(fù)載非常低,所以看起來(lái)很平整,并且這里面的內(nèi)容太多了,我們只看idle的情況:

avg without(cpu) (rate(node_cpu_seconds_total{mode='idle'}[2m]))

現(xiàn)在的顯示終于是單一的數(shù)據(jù)了,看到這里有兩個(gè)顏色,原因是這里還有我們前面 "localhost:9100"的數(shù)據(jù)。如果只看幾分鐘的數(shù)據(jù)的話(huà),那就只有綠色的部分。

通過(guò)PromQL我們可以非常方便的對(duì)數(shù)據(jù)進(jìn)行查詢(xún),過(guò)濾,以及聚合,計(jì)算等操作。通過(guò)這些豐富的表達(dá)書(shū)語(yǔ)句,監(jiān)控指標(biāo)不再是一個(gè)單獨(dú)存在的個(gè)體,而是一個(gè)個(gè)能夠表達(dá)出正式業(yè)務(wù)含義的語(yǔ)言。

1.3 任務(wù)和實(shí)例

在上一小節(jié)中,通過(guò)在prometheus.yml配置文件中,添加如下配置。我們讓Prometheus可以從node exporter暴露的服務(wù)中獲取監(jiān)控指標(biāo)數(shù)據(jù)。

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['192.168.113.52:9090']

   #采集node exporter監(jiān)控?cái)?shù)據(jù)
  - job_name: 'node'
    static_configs:
    - targets: ['192.168.113.52:9100']

當(dāng)我們需要采集不同的監(jiān)控指標(biāo)(例如:主機(jī)、MySQL、Nginx)時(shí),我們只需要運(yùn)行相應(yīng)的監(jiān)控采集程序,并且讓Prometheus Server知道這些Exporter實(shí)例的訪問(wèn)地址。在Prometheus中,每一個(gè)暴露監(jiān)控樣本數(shù)據(jù)的HTTP服務(wù)稱(chēng)為一個(gè)實(shí)例。例如在當(dāng)前主機(jī)上運(yùn)行的node exporter可以被稱(chēng)為一個(gè)實(shí)例(Instance)。

而一組用于相同采集目的的實(shí)例,或者同一個(gè)采集進(jìn)程的多個(gè)副本則通過(guò)一個(gè)一個(gè)任務(wù)(Job)進(jìn)行管理。

* job: node
    * instance 2: 1.2.3.4:9100
    * instance 4: 5.6.7.8:9100

當(dāng)前在每一個(gè)Job中主要使用了靜態(tài)配置(static_configs)的方式定義監(jiān)控目標(biāo)。除了靜態(tài)配置每一個(gè)Job的采集Instance地址以外,Prometheus還支持與DNS、Consul、E2C、Kubernetes等進(jìn)行集成實(shí)現(xiàn)自動(dòng)發(fā)現(xiàn)Instance實(shí)例,并從這些Instance上獲取監(jiān)控?cái)?shù)據(jù)。

除了通過(guò)使用“up”表達(dá)式查詢(xún)當(dāng)前所有Instance的狀態(tài)以外,還可以通過(guò)Prometheus UI中的Targets頁(yè)面查看當(dāng)前所有的監(jiān)控采集任務(wù),以及各個(gè)任務(wù)下所有實(shí)例的狀態(tài):

我們也可以訪問(wèn)http://192.168.113.52:9090/targets直接從Prometheus的UI中查看當(dāng)前所有的任務(wù)以及每個(gè)任務(wù)對(duì)應(yīng)的實(shí)例信息。

1.4 Prometheus核心組件

上一小節(jié),通過(guò)部署Node Exporter我們成功的獲取到了當(dāng)前主機(jī)的資源使用情況。接下來(lái)我們將從Prometheus的架構(gòu)角度詳細(xì)介紹Prometheus生態(tài)中的各個(gè)組件。

下圖展示Prometheus的基本架構(gòu):

Prometheus架構(gòu)

1.4.1 Prometheus Server

Prometheus Server是Prometheus組件中的核心部分,負(fù)責(zé)實(shí)現(xiàn)對(duì)監(jiān)控?cái)?shù)據(jù)的獲取,存儲(chǔ)以及查詢(xún)。
Prometheus Server可以通過(guò)靜態(tài)配置管理監(jiān)控目標(biāo),也可以配合使用Service Discovery的方式動(dòng)態(tài)管理監(jiān)控目標(biāo),并從這些監(jiān)控目標(biāo)中獲取數(shù)據(jù)。其次Prometheus Server需要對(duì)采集到的監(jiān)控?cái)?shù)據(jù)進(jìn)行存儲(chǔ),Prometheus Server本身就是一個(gè)時(shí)序數(shù)據(jù)庫(kù),將采集到的監(jiān)控?cái)?shù)據(jù)按照時(shí)間序列的方式存儲(chǔ)在本地磁盤(pán)當(dāng)中。最后Prometheus Server對(duì)外提供了自定義的PromQL語(yǔ)言,實(shí)現(xiàn)對(duì)數(shù)據(jù)的查詢(xún)以及分析。

Prometheus Server內(nèi)置的Express Browser UI,通過(guò)這個(gè)UI可以直接通過(guò)PromQL實(shí)現(xiàn)數(shù)據(jù)的查詢(xún)以及可視化。

Prometheus Server的聯(lián)邦集群能力可以使其從其他的Prometheus Server實(shí)例中獲取數(shù)據(jù),因此在大規(guī)模監(jiān)控的情況下,可以通過(guò)聯(lián)邦集群以及功能分區(qū)的方式對(duì)Prometheus Server進(jìn)行擴(kuò)展。

1.4.2 Exporters

Exporter將監(jiān)控?cái)?shù)據(jù)采集的端點(diǎn)通過(guò)HTTP服務(wù)的形式暴露給Prometheus Server,Prometheus Server通過(guò)訪問(wèn)該Exporter提供的Endpoint端點(diǎn),即可獲取到需要采集的監(jiān)控?cái)?shù)據(jù)。

一般來(lái)說(shuō)可以將Exporter分為2類(lèi):

  • 直接采集:這一類(lèi)Exporter直接內(nèi)置了對(duì)Prometheus監(jiān)控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接內(nèi)置了用于向Prometheus暴露監(jiān)控?cái)?shù)據(jù)的端點(diǎn)。
  • 間接采集:間接采集,原有監(jiān)控目標(biāo)并不直接支持Prometheus,因此我們需要通過(guò)Prometheus提供的Client Library編寫(xiě)該監(jiān)控目標(biāo)的監(jiān)控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。

1.4.3 AlertManager

在Prometheus Server中支持基于PromQL創(chuàng)建告警規(guī)則,如果滿(mǎn)足PromQL定義的規(guī)則,則會(huì)產(chǎn)生一條告警,而告警的后續(xù)處理流程則由AlertManager進(jìn)行管理。在AlertManager中我們可以與郵件,Slack等等內(nèi)置的通知方式進(jìn)行集成,也可以通過(guò)Webhook自定義告警處理方式。AlertManager即Prometheus體系中的告警處理中心。

1.4.4 PushGateway

由于Prometheus數(shù)據(jù)采集基于Pull模型進(jìn)行設(shè)計(jì),因此在網(wǎng)絡(luò)環(huán)境的配置上必須要讓Prometheus Server能夠直接與Exporter進(jìn)行通信。 當(dāng)這種網(wǎng)絡(luò)需求無(wú)法直接滿(mǎn)足時(shí),就可以利用PushGateway來(lái)進(jìn)行中轉(zhuǎn)。可以通過(guò)PushGateway將內(nèi)部網(wǎng)絡(luò)的監(jiān)控?cái)?shù)據(jù)主動(dòng)Push到Gateway當(dāng)中。而Prometheus Server則可以采用同樣Pull的方式從PushGateway中獲取到監(jiān)控?cái)?shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容