- 深入淺出Prometheus:原理、應用、源碼與拓展詳解
- 陳曉宇 楊川胡 陳嘯編著
- 1648字
- 2019-06-19 15:57:28
1.8 本書主角——Prometheus
1.簡介
Prometheus是由SoundCloud開發(fā)的開源監(jiān)控告警系統(tǒng)并且?guī)r序數(shù)據(jù)庫,基于Go語言,是Google BorgMon監(jiān)控系統(tǒng)的開源版本。2016年,由Google發(fā)起的Linux基金會旗下的原生云基金會(Cloud Native Computing Foundation,CNCF)將Prometheus納入其第二大開源項目。Prometheus在開源社區(qū)也十分活躍,在GitHub上擁有兩萬多Star,并且系統(tǒng)每隔一兩周就會有一個小版本的更新。
隨著 Kubernetes 在容器調度和管理上確定領頭羊的地位,Prometheus 也成為Kubernetes容器監(jiān)控的標配。
2.優(yōu)點
Prometheus的優(yōu)點有很多,如下所述。
(1)提供多維度數(shù)據(jù)模型和靈活的查詢方式,通過將監(jiān)控指標關聯(lián)多個tag,來將監(jiān)控數(shù)據(jù)進行任意維度的組合,并且提供簡單的PromQL查詢方式,還提供HTTP查詢接口,可以很方便地結合Grafana等GUI組件展示數(shù)據(jù)。
(2)在不依賴外部存儲的情況下,支持服務器節(jié)點的本地存儲,通過Prometheus自帶的時序數(shù)據(jù)庫,可以完成每秒千萬級的數(shù)據(jù)存儲;不僅如此,在保存大量歷史數(shù)據(jù)的場景中,Prometheus可以對接第三方時序數(shù)據(jù)庫如OpenTSDB等。
(3)定義了開放指標數(shù)據(jù)標準,以基于HTTP的Pull方式采集時序數(shù)據(jù),只有實現(xiàn)了Prometheus監(jiān)控數(shù)據(jù)格式的監(jiān)控數(shù)據(jù)才可以被Prometheus采集、匯總,并支持以Push方式向中間網(wǎng)關推送時序列數(shù)據(jù),能更加靈活地應對多種監(jiān)控場景。
(4)支持通過靜態(tài)文件配置和動態(tài)發(fā)現(xiàn)機制發(fā)現(xiàn)監(jiān)控對象,自動完成數(shù)據(jù)采集。Prometheus目前已經(jīng)支持Kubernetes、etcd、Consul等多種服務發(fā)現(xiàn)機制,可以減少運維人員的手動配置環(huán)節(jié),在容器運行環(huán)境中尤為重要。
(5)易于維護,可以通過二進制文件直接啟動,并且提供了容器化部署鏡像。
(6)支持數(shù)據(jù)的分區(qū)采樣和聯(lián)邦部署,支持大規(guī)模集群監(jiān)控。
3.架構
下面簡單介紹Prometheus的架構。
Prometheus的基本原理是通過 HTTP周期性抓取被監(jiān)控組件的狀態(tài),任意組件只要提供對應的 HTTP 接口并且符合 Prometheus 定義的數(shù)據(jù)格式,就可以接入Prometheus監(jiān)控。
如圖1-9所示為 Prometheus 的整體架構圖(來自 Prometheus 官網(wǎng)),展現(xiàn)了Prometheus內部模塊及相關的外圍組件之間的關系。

圖1-9
Prometheus Server負責定時在目標上抓取metrics(指標)數(shù)據(jù),每個抓取目標都需要暴露一個HTTP服務接口用于Prometheus定時抓取。這種調用被監(jiān)控對象獲取監(jiān)控數(shù)據(jù)的方式被稱為Pull(拉)。Pull方式體現(xiàn)了Prometheus獨特的設計哲學與大多數(shù)采用了Push(推)方式的監(jiān)控系統(tǒng)不同。
Pull方式的優(yōu)勢是能夠自動進行上游監(jiān)控和水平監(jiān)控,配置更少,更容易擴展,更靈活,更容易實現(xiàn)高可用。展開來說就是Pull方式可以降低耦合。由于在推送系統(tǒng)中很容易出現(xiàn)因為向監(jiān)控系統(tǒng)推送數(shù)據(jù)失敗而導致被監(jiān)控系統(tǒng)癱瘓的問題,所以通過Pull方式,被采集端無須感知監(jiān)控系統(tǒng)的存在,完全獨立于監(jiān)控系統(tǒng)之外,這樣數(shù)據(jù)的采集完全由監(jiān)控系統(tǒng)控制,增強了整個系統(tǒng)的可控性。
Prometheus 通過 Pull 方式采集數(shù)據(jù),那么它如何獲取監(jiān)控對象呢?Prometheus支持兩種方式:第1種是通過配置文件、文本文件等進行靜態(tài)配置;第2種是支持ZooKeeper、Consul、Kubernetes等方式進行動態(tài)發(fā)現(xiàn),例如對于Kubernetes的動態(tài)發(fā)現(xiàn),Prometheus使用Kubernetes的API查詢和監(jiān)控容器信息的變化,動態(tài)更新監(jiān)控對象,這樣容器的創(chuàng)建和刪除就都可以被Prometheus感知。
Storage通過一定的規(guī)則清理和整理數(shù)據(jù),并把得到的結果存儲到新的時間序列中,這里有兩種存儲方式。
◎ 一種是本地存儲。通過 Prometheus 自帶的時序數(shù)據(jù)庫將數(shù)據(jù)保存到本地磁盤,為了性能考慮,建議使用SSD。但本地存儲的容量畢竟有限,建議不要保存超過一個月的數(shù)據(jù)。
◎ 另一種是遠端存儲,適用于存儲大量監(jiān)控數(shù)據(jù)。通過中間層的適配器的轉化,目前Prometheus支持OpenTSDB、InfluxDB、Elasticsearch等后端存儲,通過適配器實現(xiàn)Prometheus存儲的remote write和remote read接口,便可以接入Prometheus作為遠端存儲使用。如圖1-10所示展現(xiàn)了Prometheus當前支持的遠端數(shù)據(jù)庫。

圖1-10
Prometheus通過PromQL和其他 API可視化地展示收集的數(shù)據(jù)。Prometheus支持多種方式的圖表可視化,例如Grafana、自帶的PromDash及自身提供的模版引擎等。Prometheus還提供HTTP API查詢方式,自定義所需要的輸出。
Prometheus通過Pull方式拉取數(shù)據(jù),但某些現(xiàn)有系統(tǒng)是通過 Push方式實現(xiàn)的,為了接入這些系統(tǒng),Prometheus提供了對 PushGateway的支持,這些系統(tǒng)主動推送metrics到PushGateway,而Prometheus只是定時去Gateway上抓取數(shù)據(jù)。
AlertManager 是獨立于 Prometheus 的一個組件,在觸發(fā)了預先設置在Prometheus 中的高級規(guī)則后,Prometheus 便會推送告警信息到 AlertManager。AlertManager提供了十分靈活的告警方式,可以通過郵件、slack或者釘釘?shù)韧緩酵扑汀2⑶?AlertManager支持高可用部署,為了解決多個AlertManager重復告警的問題,引入了Gossip,在多個AlertManager之間通過Gossip同步告警信息。
AlertManager的整體工作流程如圖1-11所示。

圖1-11
- C語言程序設計實踐教程(第2版)
- 觸·心:DT時代的大數(shù)據(jù)精準營銷
- Modular Programming with Python
- ASP.NET Core Essentials
- VMware vSphere 6.7虛擬化架構實戰(zhàn)指南
- MATLAB實用教程
- 深入淺出RxJS
- 飛槳PaddlePaddle深度學習實戰(zhàn)
- PySide 6/PyQt 6快速開發(fā)與實戰(zhàn)
- 速學Python:程序設計從入門到進階
- Java網(wǎng)絡編程實戰(zhàn)
- Building Dynamics CRM 2015 Dashboards with Power BI
- Android Game Programming by Example
- Java高并發(fā)編程詳解:深入理解并發(fā)核心庫
- PHP項目開發(fā)全程實錄(第4版)