prometheus相關(guān)概念
在安裝好Prometheus后,會暴露一個(gè)/metrics的http服務(wù)(相當(dāng)于安裝了prometheus_exporter),通過配置,Prometheus就可以采集到這個(gè)/metrics下的所有監(jiān)控樣本數(shù)據(jù).
樣本
Prometheus會將所有采集到的監(jiān)控樣本數(shù)據(jù)以時(shí)間序列的方式保存在內(nèi)存數(shù)據(jù)庫中,并且定時(shí)保存到硬盤上.時(shí)間序列是按照時(shí)間戳和值的序列順序存放的,我們稱之為向量,每條時(shí)間序列通過指標(biāo)名稱和一組標(biāo)簽集命名.如下所示,可以將時(shí)間序列理解為一個(gè)以時(shí)間為X軸的數(shù)字矩陣:
在時(shí)間序列中的每一個(gè)點(diǎn)稱為一個(gè)樣本(sample),樣本由以下三部分組成:
- 指標(biāo)(metric): 指標(biāo)名和描述當(dāng)前樣本特征的標(biāo)簽集合
- 時(shí)間戳(timestamp): 一個(gè)精確到毫秒的時(shí)間戳
- 樣本值(value): 一個(gè)float64的浮點(diǎn)型數(shù)據(jù)表示當(dāng)前樣本的值
示例:
前面一段為指標(biāo)名,中間那段為標(biāo)簽后面那段為時(shí)間戳和樣本值
指標(biāo)(Metric)
在形式上,所有的指標(biāo)(Metric)都通過如下格式表示:
<metric name>{<label name> = <label value>,...}
指標(biāo)的名稱(metric name)可以反映被監(jiān)控樣本的含義(比如,process_open_fds-表示當(dāng)前系統(tǒng)打開的文件描述),指標(biāo)名稱由ASCll字符,數(shù)字,下劃線以及冒號組成必須符合正則表達(dá)式
[a-ZA_:][a-zA-Z0-9_]
標(biāo)簽(label)反映了當(dāng)前樣本的特征維度,通過這些維度Prometheus可以對樣本數(shù)據(jù)進(jìn)行過濾,聚合等.標(biāo)簽的名稱只能由ASCll字符,數(shù)字,下劃線以及冒號組成必須符合正則表達(dá)式.
其實(shí)以下劃線作為前綴的標(biāo)簽,是系統(tǒng)保留的關(guān)鍵字,只能在系統(tǒng)內(nèi)部使用.標(biāo)簽的值則可以包含任何Unicode編碼的字符.在Prometheus的底層實(shí)現(xiàn)中指標(biāo)名稱實(shí)際上是以name = 形式保存在數(shù)據(jù)庫中的,因此以下倆種方式均表示同一條time-series:
process_open_fds{instance="Prometheus服務(wù)器", job="cadvisor"}
等同于:
{_name_="process_open_fds",instance="Prometheus服務(wù)器", job="cadvisor"}
指標(biāo)(Metric)的四種類型
Prometheus底層存儲上其實(shí)沒有對指標(biāo)做類型的區(qū)分,都是以時(shí)間序列的形式存儲,但是為了方便用戶的使用和理解不同監(jiān)控指標(biāo)之間的差異,Prometheus定義了counter(計(jì)數(shù)器),gauge(儀表盤),histogram(直方圖),以及sunmmary(摘要)這四種指標(biāo)類型.
Gauge/Counter是數(shù)值指標(biāo),代表數(shù)據(jù)的變化情況,Histogram/Summary是統(tǒng)計(jì)類型的指標(biāo),表示數(shù)據(jù)的分布情況
在Exporter返回的樣本數(shù)據(jù)中,其注釋中也包含了該樣本的類型.例如:
# HELP go_info Information about the Go environment.
# TYPE go_info gauge
go_info{version="go1.19.3"} 1
Counter:只增不減的計(jì)數(shù)器
Counter類型的指標(biāo)其工作方式和計(jì)數(shù)器一樣,只增不減(除非系統(tǒng)發(fā)生重置).常見的監(jiān)控指標(biāo).如http_request_total,node_cpud都是Counter類型的監(jiān)控指標(biāo).一般定義Counter類型指標(biāo)的名稱是推薦使用_total作為后綴.
通過Counter指標(biāo)可以統(tǒng)計(jì)HTTP請求數(shù)量,請求錯(cuò)誤數(shù),接口調(diào)用次數(shù)等單調(diào)遞增的數(shù)據(jù),同事可結(jié)合increase和rate等函數(shù)統(tǒng)計(jì)變化速率
例如,通過PromQL內(nèi)置的聚合rate()函數(shù)獲取HTTP請求量的評價(jià)增長率:
rate(promhttp_metric_handler_requests_total[5m])
查詢當(dāng)前系統(tǒng)中訪問量前十的HTTP地址
topk(10,promhttp_metric_handler_requests_total)
[圖片上傳失敗...(image-100e58-1703511923645)]
Gauge:可增可減的儀表盤
與Counter不同,Gauge類型的指標(biāo)側(cè)重于反應(yīng)系統(tǒng)的當(dāng)前狀態(tài).因此這類指標(biāo)的樣本數(shù)據(jù)可增可減.常見指標(biāo)如:node_memory_memFree_bytes(主機(jī)當(dāng)前空閑的物理內(nèi)存大小),node_memory_MemAvailable_bytes(可用內(nèi)存大小)都是Gauge類型的監(jiān)控指標(biāo).
通過Gauge指標(biāo),通過ProQL可以直接查看系統(tǒng)的當(dāng)前物理內(nèi)存大小:
node_memory_MemFree_bytes
[圖片上傳失敗...(image-862b76-1703511923645)]
對于Gauge類型的監(jiān)控指標(biāo),通過PromQL內(nèi)置函數(shù)delta()可以獲取樣本在一段時(shí)間返回內(nèi)的變化情況.例如,計(jì)算CPU溫度在倆個(gè)小時(shí)內(nèi)的差異:
delta(cpu_temp_celsius{host="zeus"}[2h])
還可以使用deriv()計(jì)算樣本的線性回歸模型,甚至使用predict_linear()對數(shù)據(jù)的變化趨勢進(jìn)行預(yù)測.例如,預(yù)測系統(tǒng)磁盤空間在4個(gè)小時(shí)之后的剩余情況:
predict_linear(node_filesystem_avail_bytes{}[1h],4*3600)
[圖片上傳失敗...(image-ff832a-1703511923645)]
需要將最終結(jié)果78637829682.74074/1024/1024/1024得到最終GB為單位的空間大小
[圖片上傳失敗...(image-894ebf-1703511923645)]
也就是73GB左右
Histogram :直方圖
Histogram 會在一段時(shí)間范圍內(nèi)對數(shù)據(jù)進(jìn)行采樣(通常是請求持續(xù)時(shí)間或響應(yīng)大小等),并將其計(jì)入可配置的存儲桶(bucket)中。但這句話還是不太好理解兔乞,下面通過具體的示例來說明次慢。
假設(shè)我們想監(jiān)控某個(gè)應(yīng)用在一段時(shí)間內(nèi)的響應(yīng)時(shí)間,最后監(jiān)控到的樣本的響應(yīng)時(shí)間范圍為 0s~10s。現(xiàn)在我們將樣本的值域劃分為不同的區(qū)間,即不同的 bucket
,每個(gè) bucket 的寬度是 0.2s极舔。那么第一個(gè) bucket 表示響應(yīng)時(shí)間小于等于 0.2s 的請求數(shù)量,第二個(gè) bucket 表示響應(yīng)時(shí)間大于 0.2s 小于等于 0.4s 的請求數(shù)量链瓦,以此類推拆魏。
[圖片上傳失敗...(image-7e8e74-1703511923645)]
Prometheus 的 histogram 是一種累積直方圖盯桦,與上面的區(qū)間劃分方式是有差別的,它的劃分方式如下:還假設(shè)每個(gè) bucket 的寬度是 0.2s渤刃,那么第一個(gè) bucket 表示響應(yīng)時(shí)間小于等于 0.2s 的請求數(shù)量拥峦,第二個(gè) bucket 表示響應(yīng)時(shí)間小于等于 0.4s 的請求數(shù)量,以此類推卖子。也就是說略号,每一個(gè) bucket 的樣本包含了之前所有 bucket 的樣本,所以叫累積直方圖洋闽。
[圖片上傳失敗...(image-d90fb8-1703511923645)]
分位數(shù)計(jì)算
Prometheus 通過 histogram_quantile
函數(shù)來計(jì)算分位數(shù)(quantile)玄柠,而且是一個(gè)預(yù)估值,并不完全準(zhǔn)確诫舅,因?yàn)檫@個(gè)函數(shù)是假定每個(gè)區(qū)間內(nèi)的樣本分布是線性分布來計(jì)算結(jié)果值的羽利。預(yù)估的準(zhǔn)確度取決于 bucket 區(qū)間劃分的粒度,粒度越大骚勘,準(zhǔn)確度越低铐伴。
假設(shè)有 10000
個(gè)樣本,第 9501
個(gè)樣本落入了第 8 個(gè) bucket俏讹。第 8 個(gè) bucket 總共有 368
個(gè)樣本,其中第 9501
個(gè)樣本在該 bucket 中屬于第 93
個(gè)樣本畜吊。
Summary:摘要
摘要用于記錄某些東西的平均大小泽疆,可能是計(jì)算所需的時(shí)間或處理的文件大小,摘要顯示兩個(gè)相關(guān)的信息:count(事件發(fā)生的次數(shù))和 sum(所有事件的總大辛嵯住)
例如殉疼,指標(biāo) prometheus_tsdb_wal_fsync_duration_seconds 的指標(biāo)類型為 Summary,它記錄了 Prometheus Server 中 wal_fsync 的處理時(shí)間捌年,通過訪問 Prometheus Server 的 /metrics 地址瓢娜,可以獲取到以下監(jiān)控樣本數(shù)據(jù):
# HELP prometheus_tsdb_wal_fsync_duration_seconds Duration of WAL fsync.
# TYPE prometheus_tsdb_wal_fsync_duration_seconds summary
prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} 0.012352463
prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.9"} 0.014458005
prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.99"} 0.017316173
prometheus_tsdb_wal_fsync_duration_seconds_sum 2.888716127000002
prometheus_tsdb_wal_fsync_duration_seconds_count 216
Job(任務(wù))和instances(實(shí)例)
概述
在Prometheus中,任何被采集的目標(biāo),即每一個(gè)暴露監(jiān)控樣本數(shù)據(jù)的HTTP服務(wù)都被稱為一個(gè)實(shí)例,例如在當(dāng)前主機(jī)上運(yùn)行的node exporter可以被稱為一個(gè)實(shí)例.而具有相同采集目的的實(shí)例集合稱為任務(wù).
Job(任務(wù))
例如,一下2個(gè)復(fù)制實(shí)例的node
* job: node
* instances 2:1.2.3.4:9100
* instances 4:5.6.7.8:9100
instances(實(shí)例)
通過在Prometheus.yml配置文件中,添加如下配置,我們讓Prometheus可以從node exporter暴露的服務(wù)中獲取監(jiān)控指標(biāo)數(shù)據(jù).
- job_name: 'node-exporter'
scrape_interval: 15s
static_configs:
- targets: ['node_exporter:9100']
labels:
instance: Prometheus服務(wù)器
可以在targets處配置多個(gè)地址進(jìn)行監(jiān)控