Prometheus(簡稱Prom)前身是SoundCloud的告警工具包喘沿,現(xiàn)已演化成一個獨立的開源監(jiān)控系統(tǒng)闸度。屬于Kurberntes所在的Cloud Native Computing Foundation莺禁。
主要特性
- 多維度數(shù)據(jù)模型
- 時間序列數(shù)據(jù)通過 metric 名和鍵值對來區(qū)分哟冬。
- 所有的 metrics 都可以設置任意的多維標簽楼熄。
- 數(shù)據(jù)模型更隨意,不需要刻意設置為以點分隔的字符串红符。
- 可以對數(shù)據(jù)模型進行聚合,切割和切片操作伐债。
- 支持雙精度浮點類型预侯,標簽可以設為全 unicode。
- 靈活的查詢語言:在同一個查詢語句峰锁,可以對多個 metrics 進行乘法萎馅、加法、連接虹蒋、取分數(shù)位等操作糜芳。
- 不依賴任何分布式存儲
- 通過拉取方式采集數(shù)據(jù),或者通過中間網(wǎng)關推送方式采集數(shù)據(jù)
- 通過服務發(fā)現(xiàn)或者靜態(tài)配置來發(fā)現(xiàn)監(jiān)控目標
- 支持多種圖形界面展示方式
架構(gòu)
下圖描述了 Prometheus 的整體架構(gòu)和其生態(tài)內(nèi)魄衅。一些常用組件:
- Prometheus Server:用于收集和存儲時間序列數(shù)據(jù)峭竣。
- Client Library: 客戶端庫,為需要監(jiān)控的服務生成相應的 metrics 并暴露給 Prometheus server晃虫。當 Prometheus server 來 pull 時,直接返回實時狀態(tài)的 metrics滥比。
- Push Gateway:主要用于短期的 jobs山憨。由于這類 jobs 存在時間較短棚亩,可能在 Prometheus 來 pull 之前就消失了纺阔。為此,這次 jobs 可以直接向 Prometheus server 端推送它們的 metrics。這種方式主要用于服務層面的 metrics,對于機器層面的 metrices蝎土,需要使用 node exporter醋拧。
- Exporters:用于暴露已有的第三方服務的 metrics 給 Prometheus菌赖。
- Alertmanager:從 Prometheus server 端接收到 alerts 后策幼,會進行去除重復數(shù)據(jù),分組沫浆,并路由到對收的接受方式,發(fā)出報警本股。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等。
- Prometheus以其Server為核心里伯,用于收集和存儲時間序列數(shù)據(jù)狼电。Prometheus Server 從監(jiān)控目標中拉取數(shù)據(jù)削祈,或通過中間網(wǎng)關間接的把監(jiān)控目標的監(jiān)控數(shù)據(jù)存儲到本地HDD/SSD中。
- 用戶接口界面通過各種UI使用PromQL查詢語言從Server獲取數(shù)據(jù)叙凡。
- 一旦Server檢測到異常,會推送告警到AlertManager,由告警管理負責去通知相關方燥撞。
Prometheus 核心概念
數(shù)據(jù)模型
Prometheus 從根本上存儲的所有數(shù)據(jù)都是時間序列數(shù)據(jù)(Time Serie Data锦针,簡稱時序數(shù)據(jù))悉盆。時序數(shù)據(jù)是具有時間戳的數(shù)據(jù)流馋吗,該數(shù)據(jù)流屬于某個度量指標(Metric)和該度量指標下的多個標簽(Label)京髓。除了提供存儲功能堰怨,Prometheus 還可以利用查詢表達式來執(zhí)行非常靈活和復雜的查詢。
度量指標和標簽
每個時間序列(Time Serie雪标,簡稱時序)由度量指標和一組標簽鍵值對唯一確定逆粹。
度量指標名稱描述了被監(jiān)控系統(tǒng)的某個測量特征(比如 http_requests_total 表示 http 請求總數(shù))扭勉。度量指標名稱由 ASCII 字母鹊奖、數(shù)字、下劃線和冒號組成涂炎,須匹配正則表達式 [a-zA-Z_:][a-zA-Z0-9_:]*
忠聚。
標簽開啟了 Prometheus 的多維數(shù)據(jù)模型。對于同一個度量指標唱捣,不同標簽值組合會形成特定維度的時序两蟀。Prometheus 的查詢語言可以通過度量指標和標簽對時序數(shù)據(jù)進行過濾和聚合。改變?nèi)魏味攘恐笜松系娜魏螛撕炛嫡痃裕紩纬尚碌臅r序赂毯。標簽名稱可以包含 ASCII 字母、數(shù)字和下劃線,須匹配正則表達式[a-zA-Z_][a-zA-Z0-9_]*
党涕,帶有 _
下劃線的標簽名稱保留為內(nèi)部使用烦感。標簽值可以包含任意 Unicode 字符,包括中文膛堤。
采樣值(Sample)
時序數(shù)據(jù)其實就是一系列采樣值手趣。每個采樣值包括2部分:
- 一個 64 位的浮點數(shù)值
- 一個精確到毫秒的時間戳
注解(Notation)
一個注解由一個度量指標和一組標簽鍵值對構(gòu)成。形式如下:
[metric name]{[label name]=[label value], ...}
例如骑祟,度量指標為 api_http_requests_total
回懦,標簽為 method="POST"、handler="/messages"
的注解表示如下:
api_http_requests_total{method="POST", handler="/messages"}
度量指標類型
Prometheus 里的度量指標有以下幾種類型次企。
1. 計數(shù)器(Counter)
計數(shù)器是一種累計型的度量指標怯晕,它是一個只能遞增的數(shù)值。計數(shù)器主要用于統(tǒng)計類似于服務請求數(shù)缸棵、任務完成數(shù)和錯誤出現(xiàn)次數(shù)這樣的數(shù)據(jù)舟茶。
2. 計量器(Gauge)
計量器表示一個既可增又可減的度量指標值。計量器主要用于測量類似于溫度堵第、內(nèi)存使用量這樣的瞬時數(shù)據(jù)吧凉。
3. 直方圖(Histogram)
直方圖對觀察結(jié)果(通常是請求持續(xù)時間或者響應大小這樣的數(shù)據(jù))進行采樣,并在可配置的桶中對其進行統(tǒng)計踏志。有以下幾種方式來產(chǎn)生直方圖(假設度量指標為 <basename>
):
- 按桶計數(shù)阀捅,相當于
<basename>_bucket{le="<upper inclusive bound>"}
- 采樣值總和,相當于
<basename>_sum
- 采樣值總數(shù)针余,相當于
<basename>_count
饲鄙,也等同于把所有采樣值放到一個桶里來計數(shù)<basename>_bucket{le="+Inf"}
Histogram可以理解為柱狀圖,典型的應用如:請求持續(xù)時間圆雁,響應大小忍级。可以對觀察結(jié)果采樣伪朽,分組及統(tǒng)計轴咱。
例如,查詢 http_request_duration_microseconds_sum{job="Prometheus", handler="query"} 時烈涮,返回結(jié)果如下:
4. 匯總(Summary)
類似于直方圖朴肺,匯總也對觀察結(jié)果進行采樣。除了可以統(tǒng)計采樣值總和和總數(shù)坚洽,它還能夠按分位數(shù)統(tǒng)計宇挫。有以下幾種方式來產(chǎn)生匯總(假設度量指標為 <basename>
):
- 按分位數(shù),也就是采樣值小于該分位數(shù)的個數(shù)占總數(shù)的比例小于 φ酪术,相當于
<basename>{quantile="<φ>"}
- 采樣值總和器瘪,相當于
<basename>_sum
- 采樣值總數(shù)翠储,相當于
<basename>_count
5. 任務(Job)和實例(Instance)
在 Prometheus 里,可以從中抓取采樣值的端點稱為實例橡疼,為了性能擴展而復制出來的多個這樣的實例形成了一個任務援所。
例如下面的 api-server 任務有四個相同的實例:
job: api-server
instance 1: 1.2.3.4:5670
instance 2: 1.2.3.4:5671
instance 3: 5.6.7.8:5670
instance 4: 5.6.7.8:5671
Prometheus 抓取完采樣值后,會自動給采樣值添加下面的標簽和值:
- job: 抓取所屬任務欣除。
- 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>"}
:采樣值為重新打標簽后的采樣值個數(shù) -
scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}
:采樣值為本次抓取到的采樣值個數(shù)