Prometheus(簡稱Prom)前身是SoundCloud的告警工具包,現(xiàn)已演化成一個獨(dú)立的開源監(jiān)控系統(tǒng)。屬于Kurberntes所在的Cloud Native Computing Foundation。
主要特性
多維度數(shù)據(jù)模型
時間序列數(shù)據(jù)通過 metric 名和鍵值對來區(qū)分。
所有的 metrics 都可以設(shè)置任意的多維標(biāo)簽。
數(shù)據(jù)模型更隨意,不需要刻意設(shè)置為以點分隔的字符串。
可以對數(shù)據(jù)模型進(jìn)行聚合,切割和切片操作。
支持雙精度浮點類型,標(biāo)簽可以設(shè)為全 unicode。
靈活的查詢語言:在同一個查詢語句,可以對多個 metrics 進(jìn)行乘法、加法、連接、取分?jǐn)?shù)位等操作。
不依賴任何分布式存儲
通過拉取方式采集數(shù)據(jù),或者通過中間網(wǎng)關(guān)推送方式采集數(shù)據(jù)
通過服務(wù)發(fā)現(xiàn)或者靜態(tài)配置來發(fā)現(xiàn)監(jiān)控目標(biāo)
支持多種圖形界面展示方式
架構(gòu)
下圖描述了 Prometheus 的整體架構(gòu)和其生態(tài)內(nèi)。一些常用組件:
Prometheus Server:用于收集和存儲時間序列數(shù)據(jù)。
Client Library: 客戶端庫,為需要監(jiān)控的服務(wù)生成相應(yīng)的 metrics 并暴露給 Prometheus server。當(dāng) Prometheus server 來 pull 時,直接返回實時狀態(tài)的 metrics。
Push Gateway:主要用于短期的 jobs。由于這類 jobs 存在時間較短,可能在 Prometheus 來 pull 之前就消失了。為此,這次 jobs 可以直接向 Prometheus server 端推送它們的 metrics。這種方式主要用于服務(wù)層面的 metrics,對于機(jī)器層面的 metrices,需要使用 node exporter。
Exporters:用于暴露已有的第三方服務(wù)的 metrics 給 Prometheus。
Alertmanager:從 Prometheus server 端接收到 alerts 后,會進(jìn)行去除重復(fù)數(shù)據(jù),分組,并路由到對收的接受方式,發(fā)出報警。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等。

Prometheus 架構(gòu)圖
Prometheus以其Server為核心,用于收集和存儲時間序列數(shù)據(jù)。Prometheus Server 從監(jiān)控目標(biāo)中拉取數(shù)據(jù),或通過中間網(wǎng)關(guān)間接的把監(jiān)控目標(biāo)的監(jiān)控數(shù)據(jù)存儲到本地HDD/SSD中。
用戶接口界面通過各種UI使用PromQL查詢語言從Server獲取數(shù)據(jù)。
一旦Server檢測到異常,會推送告警到AlertManager,由告警管理負(fù)責(zé)去通知相關(guān)方。
Prometheus 核心概念
數(shù)據(jù)模型
Prometheus 從根本上存儲的所有數(shù)據(jù)都是時間序列數(shù)據(jù)(Time Serie Data,簡稱時序數(shù)據(jù))。時序數(shù)據(jù)是具有時間戳的數(shù)據(jù)流,該數(shù)據(jù)流屬于某個度量指標(biāo)(Metric)和該度量指標(biāo)下的多個標(biāo)簽(Label)。除了提供存儲功能,Prometheus 還可以利用查詢表達(dá)式來執(zhí)行非常靈活和復(fù)雜的查詢。
度量指標(biāo)和標(biāo)簽
每個時間序列(Time Serie,簡稱時序)由度量指標(biāo)和一組標(biāo)簽鍵值對唯一確定。
度量指標(biāo)名稱描述了被監(jiān)控系統(tǒng)的某個測量特征(比如 http_requests_total 表示 http 請求總數(shù))。度量指標(biāo)名稱由 ASCII 字母、數(shù)字、下劃線和冒號組成,須匹配正則表達(dá)式[a-zA-Z_:][a-zA-Z0-9_:]*。
標(biāo)簽開啟了 Prometheus 的多維數(shù)據(jù)模型。對于同一個度量指標(biāo),不同標(biāo)簽值組合會形成特定維度的時序。Prometheus 的查詢語言可以通過度量指標(biāo)和標(biāo)簽對時序數(shù)據(jù)進(jìn)行過濾和聚合。改變?nèi)魏味攘恐笜?biāo)上的任何標(biāo)簽值,都會形成新的時序。標(biāo)簽名稱可以包含 ASCII 字母、數(shù)字和下劃線,須匹配正則表達(dá)式[a-zA-Z_][a-zA-Z0-9_]*,帶有_下劃線的標(biāo)簽名稱保留為內(nèi)部使用。標(biāo)簽值可以包含任意 Unicode 字符,包括中文。
采樣值(Sample)
時序數(shù)據(jù)其實就是一系列采樣值。每個采樣值包括2部分:
一個 64 位的浮點數(shù)值
一個精確到毫秒的時間戳
注解(Notation)
一個注解由一個度量指標(biāo)和一組標(biāo)簽鍵值對構(gòu)成。形式如下:
[metric name]{[label name]=[labelvalue],...}
例如,度量指標(biāo)為api_http_requests_total,標(biāo)簽為method="POST"、handler="/messages"的注解表示如下:
api_http_requests_total{method="POST", handler="/messages"}
度量指標(biāo)類型
Prometheus 里的度量指標(biāo)有以下幾種類型。
1. 計數(shù)器(Counter)
計數(shù)器是一種累計型的度量指標(biāo),它是一個只能遞增的數(shù)值。計數(shù)器主要用于統(tǒng)計類似于服務(wù)請求數(shù)、任務(wù)完成數(shù)和錯誤出現(xiàn)次數(shù)這樣的數(shù)據(jù)。
2. 計量器(Gauge)
計量器表示一個既可增又可減的度量指標(biāo)值。計量器主要用于測量類似于溫度、內(nèi)存使用量這樣的瞬時數(shù)據(jù)。
3. 直方圖(Histogram)
直方圖對觀察結(jié)果(通常是請求持續(xù)時間或者響應(yīng)大小這樣的數(shù)據(jù))進(jìn)行采樣,并在可配置的桶中對其進(jìn)行統(tǒng)計。有以下幾種方式來產(chǎn)生直方圖(假設(shè)度量指標(biāo)為<basename>):
按桶計數(shù),相當(dāng)于<basename>_bucket{le="<upper inclusive bound>"}
采樣值總和,相當(dāng)于<basename>_sum
采樣值總數(shù),相當(dāng)于<basename>_count,也等同于把所有采樣值放到一個桶里來計數(shù)<basename>_bucket{le="+Inf"}
Histogram可以理解為柱狀圖,典型的應(yīng)用如:請求持續(xù)時間,響應(yīng)大小??梢詫τ^察結(jié)果采樣,分組及統(tǒng)計。
例如,查詢 http_request_duration_microseconds_sum{job="Prometheus", handler="query"} 時,返回結(jié)果如下:

4. 匯總(Summary)
類似于直方圖,匯總也對觀察結(jié)果進(jìn)行采樣。除了可以統(tǒng)計采樣值總和和總數(shù),它還能夠按分位數(shù)統(tǒng)計。有以下幾種方式來產(chǎn)生匯總(假設(shè)度量指標(biāo)為<basename>):
按分位數(shù),也就是采樣值小于該分位數(shù)的個數(shù)占總數(shù)的比例小于 φ,相當(dāng)于<basename>{quantile="<φ>"}
采樣值總和,相當(dāng)于<basename>_sum
采樣值總數(shù),相當(dāng)于<basename>_count
5. 任務(wù)(Job)和實例(Instance)
在 Prometheus 里,可以從中抓取采樣值的端點稱為實例,為了性能擴(kuò)展而復(fù)制出來的多個這樣的實例形成了一個任務(wù)。
例如下面的 api-server 任務(wù)有四個相同的實例:
job:api-serverinstance 1:1.2.3.4:5670instance 2:1.2.3.4:5671instance 3:5.6.7.8:5670instance 4:5.6.7.8:5671
Prometheus 抓取完采樣值后,會自動給采樣值添加下面的標(biāo)簽和值:
job: 抓取所屬任務(wù)。
instance: 抓取來源實例
另外每次抓取時,Prometheus 還會自動在以下時序里插入采樣值:
up{job="[job-name]", instance="instance-id"}:采樣值為 1 表示實例健康,否則為不健康
scrape_duration_seconds{job="[job-name]", instance="[instance-id]"}:采樣值為本次抓取消耗時間
scrape_samples_post_metric_relabeling{job="<job-name>", instance="<instance-id>"}:采樣值為重新打標(biāo)簽后的采樣值個數(shù)
scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}:采樣值為本次抓取到的采樣值個數(shù)