Prometheus所有的指標類型都是用一種數據類型或由多個單一數據類型的組合表示,這個數據類型包括一個指標名稱,一組標簽和一個浮點數,時間戳是由監控后端在抓取指標時自動添加的,指標名稱和標簽集的每個叭一組合定義了一條時間序列,而每個時間戳和浮點數定義了一個系列中的樣本,也就是一個數據點,以下是通過Prometheus暴露的一個指標示例:
# HELP http_requests_total Total number of http api requests 4633433
# TYPE http_requests_total counter
http_requests_total{api="add_product"}
# HELP用來為指標提供描述,#TYPE 說明指標類型,接下來,我們來詳細介紹每個Prometheus指標類型。
1、計數器(Counter)
Counter類型指標被用于單調增加的測量結果。因此它們總是累積的數值,值只能上升。唯一的例外是Counter重啟,在這種情況下,它的值會被重置為零。
Counter的實際值通常本身并不十分有用。一個計數器的值經常被用來計算兩個時間戳之間的delta或者隨時間變化的速率。
例如,Counter的一個典型用例是記錄API調用次數,這是一個總是會增加的測量值。
# HELP http_requests_total Total number of http api requests
# TYPE http_requests_total counter
http_requests_total{api="add_product"} 4633433
指標名稱是http_requests_total,它有一個名為api的標簽,值為add_product,Counter的值為4633433。這意味著自從上次服務啟動或Counter重置以來,add_product的API已經被調用了4633433次。按照慣例,Counter類型的指標通常以_total為后綴。
這個絕對數字并沒有給我們提供多少信息,但當與PromQL的rate函數(或其他監控后端的類似函數)一起使用時,它可以幫助我們了解該API每秒收到的請求數。下面的PromQL查詢計算了過去5分鐘內每秒的平均請求數。
rate(http_requests_total{api="add_product"}[5m])
為了計算一段時期內的絕對變化,我們將使用delta函數,在PromQL中稱為increate():
increase(http_requests_total{api="add_product"}[5m])
這將返回過去5分鐘內的總請求數,這相當于用每秒的速率乘以間隔時間的秒數(在我們的例子中是5分鐘):
rate(http_requests_total{api="add_product"}[5m]) * 5 * 60
2、儀表(Gauge)
Gauge指標用于可以任意增加或減少的測量。這是你可能更熟悉的指標類型,因為即使沒有經過額外處理的實際值也是有意義的,它們經常被使用到。例如,測量溫度、CPU和內存使用的指標,或者隊列的大小都是Gauge。例如,為了測量一臺主機的內存使用情況,我們可以使用一個Gauge指標,比如:
# HELP node_memory_used_bytes Total memory used in the node in bytes
# TYPE node_memory_used_bytes gauge
node_memory_used_bytes{hostname="host1.domain.com"} 943348382
上面的指標表明,在測量時,節點host1.domain.com使用的內存約為900 MB。該指標的值是有意義的,不需要任何額外的計算,因為它告訴我們該節點上消耗了多少內存。
與使用Counter指標時不同,rate和delta函數對Gauge沒有意義。然而,計算特定時間序列的平均數、最大值、最小值或百分比的函數經常與Gauge一起使用。在Prometheus中,這些函數的名稱是avg_over_time、max_over_time、min_over_time和quantile_over_time。要計算過去10分鐘內在host1.domain.com上使用的平均內存,你可以這樣做:
avg_over_time(node_memory_used_bytes{hostname="host1.domain.com"}[10m])
3、直方圖(Histogram)
Histogram指標對于表示測量的分布很有用。它們經常被用來測量請求持續時間或響應大小。直方圖將整個測量范圍劃分為一組區間,稱為桶,并計算每個桶中有多少測量值。一個直方圖指標包括幾個項目:
- 一個包含測量次數的Counter,指標名稱使用_count后綴。
- 一個包含所有測量值之和的Counter,指標名稱使用_sum后綴。
- 直方圖桶被暴露為一系列的Counter,使用指標名稱的后綴_bucket和表示桶的上限的le 標簽。Prometheus中的桶是包含桶的邊界的,即一個上限為N的桶(即le 標簽)包括所有數值小于或等于N的數據點
例如,測量運行在host1.domain.com實例上的add_productAPI端點實例的響應時間的Histogram指標可以表示為:
# HELP http_request_duration_seconds Api requests response time in seconds
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_sum{api="add_product" instance="host1.domain.com"} 8953.332
http_request_duration_seconds_count{api="add_product" instance="host1.domain.com"} 27892
http_request_duration_seconds_bucket{api="add_product" instance="host1.domain.com" le="0"}
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.01"} 0
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.025"} 8
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.05"} 1672
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.1"} 8954
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.25"} 14251
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="0.5"} 24101
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="1"} 26351
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="2.5"} 27534
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="5"} 27814
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="10"} 27881
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="25"} 27890
http_request_duration_seconds_bucket{api="add_product", instance="host1.domain.com", le="+Inf"} 27892
4、匯總(Summary)
像直方圖一樣,Summary指標對于測量請求持續時間和響應體大小很有用,匯總度量對于測量請求持續時間和響應大小很有用。一個Summary指標包括這些內容:
- 一個包含總測量次數的Counter。指標名稱使用_count后綴。
- 一個包含所有測量值之和的Counter,指標名稱使用_sum后綴。
例如,測量在host1.domain.com上運行的add_productAPI端點實例的響應時間的Summary指標可以表示為:
# HELP http_request_duration_seconds Api requests response time in seconds
# TYPE http_request_duration_seconds summary
http_request_duration_seconds_sum{api="add_product" instance="host1.domain.com"} 8953.332
http_request_duration_seconds_count{api="add_product" instance="host1.domain.com"} 27892
http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0"}
http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.5"} 0.232227334
http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.90"} 0.821139321
http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.95"} 1.528948804
http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="0.99"} 2.829188272
http_request_duration_seconds{api="add_product" instance="host1.domain.com" quantile="1"} 34.283829292
上面這個例子包括總和和計數以及五個分位數。分位數0相當于最小值,分位數1相當于最大值。分位數0.5是中位數,分位數0.90、0.95和0.99相當于在host1.domain.com上運行的add_product API端點響應時間的第90、95和99個百分位。
像直方圖一樣,Summary指標包括總和和計數,可用于計算隨時間的平均值以及不同時間序列的平均值。