摘要:獲取請求數(shù)前位的時序樣本數(shù)據(jù),可以使用表達式用于計算當(dāng)前樣本數(shù)據(jù)值的分布情況,其中例如,當(dāng)為時,即表示找到當(dāng)前樣本數(shù)據(jù)中的中位數(shù)返回結(jié)果如下內(nèi)置函數(shù)提供了其它大量的內(nèi)置函數(shù),可以對時序數(shù)據(jù)進行豐富的處理。
一. 概述
Prometheus除了存儲數(shù)據(jù)外,還提供了一種強大的功能表達式語言 PromQL,允許用戶實時選擇和匯聚時間序列數(shù)據(jù)。
表達式的結(jié)果可以在瀏覽器中顯示為圖形,也可以顯示為表格數(shù)據(jù),或者由外部系統(tǒng)通過 HTTP API 調(diào)用。通過PromQL用戶可以非常方便地查詢監(jiān)控數(shù)據(jù),或者利用表達式進行告警配置
如:k8s中的node在線率:sum(kube_node_status_condition{condition="Ready", status="true"}) / sum(kube_node_info) *100
Metric類型關(guān)于時間序列存儲,可以參考:https://www.infoq.cn/article/...
Prometheus會將所有采集到的樣本數(shù)據(jù)以時間序列(time-series)的方式保存在內(nèi)存數(shù)據(jù)庫TSDB中,并且定時保存到硬盤上。time-series是按照時間戳和值的序列順序存放的,我們稱之為向量(vector)。每條time-series通過指標(biāo)名稱(metrics name)和一組標(biāo)簽集(labelset)命名。
在time-series中的每一個點稱為一個樣本(sample),樣本由以下三部分組成:
指標(biāo)(metric):metric name和描述當(dāng)前樣本特征的labelsets;
時間戳(timestamp):一個精確到毫秒的時間戳;
樣本值(value): 一個folat64的浮點型數(shù)據(jù)表示當(dāng)前樣本的值。
如某一時刻的node_cpu指標(biāo)為459.71
node_cpu{app="node-exporter",cpu="cpu0",instance="192.168.0.4:9100",job="kubernetes-service-endpoints",kubernetes_name="node-exporter",kubernetes_namespace="kube-system",mode="guest"} 459.71
Prometheus定義了4中不同的指標(biāo)類型(metric type):
Counter 計數(shù)器
計數(shù)器,只增不減,如http_requests_total請求總數(shù) 例如,通過rate()函數(shù)獲取HTTP請求量的增長率: rate(http_requests_total[5m])
Gauge 儀表盤
當(dāng)前狀態(tài),可增可減。如kube_pod_status_ready當(dāng)前pod可用數(shù) 可以獲取樣本在一段時間返回內(nèi)的變化情況,如: delta(kube_pod_status_ready[2h])
Histogram 直方圖
Histogram 由_bucket{le=" "}, _bucket{le="+Inf"}, _sum, _count 組成,主要用于表示一段時間范圍內(nèi)對數(shù)據(jù)進行采樣(通常是請求持續(xù)時間或響應(yīng)大小),并能夠?qū)ζ渲付▍^(qū)間以及總數(shù)進行統(tǒng)計,通常它采集的數(shù)據(jù)展示為直方圖。 例如 Prometheus server 中 prometheus_local_storage_series_chunks_persisted, 表示 Prometheus 中每個時序需要存儲的 chunks 數(shù)量,我們可以用它計算待持久化的數(shù)據(jù)的分位數(shù)。
Summary 摘要
Summary 和 Histogram 類似,由基礎(chǔ)查詢{quantile="<φ>"}, _sum, _count 組成,主要用于表示一段時間內(nèi)數(shù)據(jù)采樣結(jié)果(通常是請求持續(xù)時間或響應(yīng)大小),它直接存儲了 quantile 數(shù)據(jù),而不是根據(jù)統(tǒng)計區(qū)間計算出來的。 例如 Prometheus server 中 prometheus_target_interval_length_seconds。 Histogram 需要通過 _bucket 計算 quantile, 而 Summary 直接存儲了 quantile 的值。
PromQL是Prometheus內(nèi)置的數(shù)據(jù)查詢語言,其提供對時間序列數(shù)據(jù)豐富的查詢,聚合以及邏輯運算能力的支持。
如http_requests_total指標(biāo)
你可以通過附加一組標(biāo)簽,并用{}括起來,來進一步篩選這些時間序列。下面這個例子只選擇有http_requests_total名稱的、有prometheus工作標(biāo)簽的、有canary組標(biāo)簽的時間序列:
http_requests_total{job="prometheus",group="canary"}
如果條件為空,可以寫為:http_requests_total{}
另外,也可以也可以將標(biāo)簽值反向匹配,或者對正則表達式匹配標(biāo)簽值。如操作符:
=:選擇正好相等的字符串標(biāo)簽 !=:選擇不相等的字符串標(biāo)簽 =~:選擇匹配正則表達式的標(biāo)簽(或子標(biāo)簽) !=:選擇不匹配正則表達式的標(biāo)簽(或子標(biāo)簽)范圍查詢
類似http_requests_total{job="prometheus",group="canary"}的方式,得到的是瞬時值,如果想得到一定范圍內(nèi)的值,可以使用范圍查詢
時間范圍通過時間范圍選擇器[]進行定義。例如,通過以下表達式可以選擇最近5分鐘內(nèi)的所有樣本數(shù)據(jù),如:http_request_total{}[5m]
除了分鐘,支持的單位有:
s - 秒
m - 分鐘
h - 小時
d - 天
w - 周
y - 年
偏移查詢如:查詢http_requests_total在當(dāng)前時刻的一周的速率:
rate(http_requests_total{} offset 1w)
偏移修飾符允許更改查詢中單個即時向量和范圍向量的時間偏移量,例如,以下表達式返回相對于當(dāng)前查詢時間5分鐘前的http_requests_total值:
http_requests_total offset 5m
等價于
http_requests_total{job="prometheus"}[5m]
請注意,偏移量修飾符始終需要跟隨選擇器,即以下是正確的:
sum(http_requests_total{method="GET"} offset 5m) // GOOD.
下面是錯誤的:
sum(http_requests_total{method="GET"}) offset 5m // INVALID.
操作符Prometheus 的查詢語言支持基本的邏輯運算和算術(shù)運算
加法
減法
乘法
/ 除法
% 模
^ 冪等
運算中用到的基礎(chǔ)數(shù)據(jù)類型:
瞬時向量(Instant vector) - 一組時間序列,每個時間序列包含單個樣本,它們共享相同的時間戳。也就是說,表達式的返回值中只會包含該時間序列中的最新的一個樣本值。而相應(yīng)的這樣的表達式稱之為瞬時向量表達式。
區(qū)間向量(Range vector) - 一組時間序列,每個時間序列包含一段時間范圍內(nèi)的樣本數(shù)據(jù)。
標(biāo)量(Scalar) - 一個浮點型的數(shù)據(jù)值。
字符串(String) - 一個簡單的字符串值。
二元運算操作符支持 scalar/scalar(標(biāo)量/標(biāo)量)、vector/scalar(向量/標(biāo)量)、和 vector/vector(向量/向量) 之間的操作。
在兩個標(biāo)量之間進行數(shù)學(xué)運算,得到的結(jié)果也是標(biāo)量。
例如,如果我們想根據(jù) node_disk_bytes_written 和 node_disk_bytes_read 獲取主機磁盤IO的總量,可以使用如下表達式:
`node_disk_bytes_written + node_disk_bytes_read
`
或者node的內(nèi)存數(shù)GB
node_memory_free_bytes_total / (1024 * 1024)
== (相等)
!= (不相等)
(大于)
< (小于)
= (大于等于)
<= (小于等于)
如:獲取http_requests_total請求總數(shù)是否超過10000,返回0和1,1則報警
http_requests_total > 10000 # 結(jié)果為 true 或 false http_requests_total > bool 10000 # 結(jié)果為 1 或 0
and (并且)
or (或者)
unless (排除)
四則運算有優(yōu)先級,promql的復(fù)雜運算也有優(yōu)先級
例如,查詢主機的CPU使用率,可以使用表達式:
100 * (1 - avg (irate(node_cpu{mode="idle"}[5m])) by(job) )
其中irate是PromQL中的內(nèi)置函數(shù),用于計算區(qū)間向量中時間序列每秒的即時增長率
在PromQL操作符中優(yōu)先級由高到低依次為:
^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or
與數(shù)據(jù)庫中的join類似,promsql有兩種典型的匹配查詢:
一對一(one-to-one)
多對一(many-to-one)或一對多(one-to-many)
例如當(dāng)存在樣本:
method_code:http_errors:rate5m{method="get", code="500"} 24 method_code:http_errors:rate5m{method="get", code="404"} 30 method_code:http_errors:rate5m{method="put", code="501"} 3 method_code:http_errors:rate5m{method="post", code="500"} 6 method_code:http_errors:rate5m{method="post", code="404"} 21 method:http_requests:rate5m{method="get"} 600 method:http_requests:rate5m{method="del"} 34 method:http_requests:rate5m{method="post"} 120
使用 PromQL 表達式:
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
該表達式會返回在過去 5 分鐘內(nèi),HTTP 請求狀態(tài)碼為 500 的在所有請求中的比例。如果沒有使用 ignoring(code),操作符兩邊表達式返回的瞬時向量中將找不到任何一個標(biāo)簽完全相同的匹配項。
因此結(jié)果如下:
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
同時由于 method 為 put 和 del 的樣本找不到匹配項,因此不會出現(xiàn)在結(jié)果當(dāng)中。
多對一模式
例如,使用表達式:
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
該表達式中,左向量 method_code:http_errors:rate5m 包含兩個標(biāo)簽 method 和 code。而右向量 method:http_requests:rate5m 中只包含一個標(biāo)簽 method,因此匹配時需要使用 ignoring 限定匹配的標(biāo)簽為 code。
在限定匹配標(biāo)簽后,右向量中的元素可能匹配到多個左向量中的元素 因此該表達式的匹配模式為多對一,需要使用 group 修飾符 group_left 指定左向量具有更好的基數(shù)。
最終的運算結(jié)果如下:
{method="get", code="500"} 0.04 // 24 / 600
{method="get", code="404"} 0.05 // 30 / 600
{method="post", code="500"} 0.05 // 6 / 120
{method="post", code="404"} 0.175 // 21 / 120
提醒:group 修飾符只能在比較和數(shù)學(xué)運算符中使用。在邏輯運算 and,unless 和 or 操作中默認與右向量中的所有元素進行匹配。聚合操作
Prometheus 還提供了下列內(nèi)置的聚合操作符,這些操作符作用域瞬時向量。可以將瞬時表達式返回的樣本數(shù)據(jù)進行聚合,形成一個具有較少樣本值的新的時間序列。
sum (求和)
min (最小值)
max (最大值)
avg (平均值)
stddev (標(biāo)準(zhǔn)差)
stdvar (標(biāo)準(zhǔn)差異)
count (計數(shù))
count_values (對 value 進行計數(shù))
bottomk (樣本值最小的 k 個元素)
topk (樣本值最大的k個元素)
quantile (分布統(tǒng)計)
這些操作符被用于聚合所有標(biāo)簽維度,或者通過 without 或者 by 子語句來保留不同的維度。
without 用于從計算結(jié)果中移除列舉的標(biāo)簽,而保留其它標(biāo)簽。
by 則正好相反,結(jié)果向量中只保留列出的標(biāo)簽,其余標(biāo)簽則移除。
通過 without 和 by 可以按照樣本的問題對數(shù)據(jù)進行聚合。
例如:
如果指標(biāo) http_requests_total 的時間序列的標(biāo)簽集為 application, instance, 和 group,我們可以通過以下方式計算所有 instance 中每個 application 和 group 的請求總量:
sum(http_requests_total) without (instance)
等價于
`
sum(http_requests_total) by (application, group)
`
如果只需要計算整個應(yīng)用的 HTTP 請求總量,可以直接使用表達式:
`sum(http_requests_total)
`
count_values 用于時間序列中每一個樣本值出現(xiàn)的次數(shù)。count_values 會為每一個唯一的樣本值輸出一個時間序列,并且每一個時間序列包含一個額外的標(biāo)簽。
這個標(biāo)簽的名字由聚合參數(shù)指定,同時這個標(biāo)簽值是唯一的樣本值。
例如要計算運行每個構(gòu)建版本的二進制文件的數(shù)量:
count_values("version", build_version) 返回結(jié)果如下: {count="641"} 1 {count="3226"} 2 {count="644"} 4
topk 和 bottomk
則用于對樣本值進行排序,返回當(dāng)前樣本值前 n 位,或者后 n 位的時間序列。
獲取 HTTP 請求數(shù)前 5 位的時序樣本數(shù)據(jù),可以使用表達式:
topk(5, http_requests_total)
quantile 用于計算當(dāng)前樣本數(shù)據(jù)值的分布情況 quantile(φ, express) ,其中 0 ≤ φ ≤ 1
例如,當(dāng) φ 為 0.5 時,即表示找到當(dāng)前樣本數(shù)據(jù)中的中位數(shù): quantile(0.5, http_requests_total) 返回結(jié)果如下: {} 656內(nèi)置函數(shù)
Prometheus 提供了其它大量的內(nèi)置函數(shù),可以對時序數(shù)據(jù)進行豐富的處理。如上文提到的irate
100 * (1 - avg (irate(node_cpu{mode="idle"}[5m])) by(job) )
常用的有:
兩分鐘內(nèi)的平均CPU使用率:
rate(node_cpu[2m])
和
irate(node_cpu[2m])
需要注意的是使用rate或者increase函數(shù)去計算樣本的平均增長速率,容易陷入“長尾問題”當(dāng)中, 其無法反應(yīng)在時間窗口內(nèi)樣本數(shù)據(jù)的突發(fā)變化。 例如,對于主機而言在2分鐘的時間窗口內(nèi),可能在某一個由于訪問量或者其它問題導(dǎo)致CPU占用100%的情況, 但是通過計算在時間窗口內(nèi)的平均增長率卻無法反應(yīng)出該問題。 為了解決該問題,PromQL提供了另外一個靈敏度更高的函數(shù)irate(v range-vector)。 irate同樣用于計算區(qū)間向量的計算率,但是其反應(yīng)出的是瞬時增長率。 irate函數(shù)是通過區(qū)間向量中最后兩個兩本數(shù)據(jù)來計算區(qū)間向量的增長速率。 這種方式可以避免在時間窗口范圍內(nèi)的“長尾問題”,并且體現(xiàn)出更好的靈敏度,通過irate函數(shù)繪制的圖標(biāo)能夠更好的反應(yīng)樣本數(shù)據(jù)的瞬時變化狀態(tài)。
irate函數(shù)相比于rate函數(shù)提供了更高的靈敏度,不過當(dāng)需要分析長期趨勢或者在告警規(guī)則中,irate的這種靈敏度反而容易造成干擾。
因此在長期趨勢分析或者告警中更推薦使用rate函數(shù)。
完整的函數(shù)列表為:
abs()
absent()
ceil()
changes()
clamp_max()
clamp_min()
day_of_month()
day_of_week()
days_in_month()
delta()
deriv()
exp()
floor()
histogram_quantile()
holt_winters()
hour()
idelta()
increase()
irate()
label_join()
label_replace()
ln()
log2()
log10()
minute()
month()
predict_linear()
rate()
resets()
round()
scalar()
sort()
sort_desc()
sqrt()
time()
timestamp()
vector()
year()
Prometheus當(dāng)前穩(wěn)定的HTTP API可以通過/api/v1訪問
錯誤狀態(tài)碼:
404 Bad Request:當(dāng)參數(shù)錯誤或者缺失時。
422 Unprocessable Entity 當(dāng)表達式無法執(zhí)行時。
503 Service Unavailiable 當(dāng)請求超時或者被中斷時。
所有的API請求均使用以下的JSON格式:
{ "status": "success" | "error", "data": , // 為error時,有如下報錯信息 "errorType": "", "error": " " }
通過HTTP API我們可以分別通過/api/v1/query和/api/v1/query_range查詢PromQL表達式當(dāng)前或者一定時間范圍內(nèi)的計算結(jié)果。
URL請求參數(shù):
query=:PromQL表達式。
time=:用于指定用于計算PromQL的時間戳。可選參數(shù),默認情況下使用當(dāng)前系統(tǒng)時間。
timeout=:超時設(shè)置。可選參數(shù),默認情況下使用-query,timeout的全局設(shè)置。
$ curl "http://localhost:9090/api/v1/query?query=up&time=2015-07-01T20:10:51.781Z"
返回:
{ "status" : "success", "data" : { "resultType" : "vector", "result" : [ { "metric" : { "__name__" : "up", "job" : "prometheus", "instance" : "localhost:9090" }, "value": [ 1435781451.781, "1" ] }, { "metric" : { "__name__" : "up", "job" : "node", "instance" : "localhost:9100" }, "value" : [ 1435781451.781, "0" ] } ] } }
URL請求參數(shù):
query=: PromQL表達式。
start=: 起始時間。
end=: 結(jié)束時間。
step=: 查詢步長。
timeout=: 超時設(shè)置。可選參數(shù),默認情況下使用-query,timeout的全局設(shè)置。
$ curl "http://localhost:9090/api/v1/query_range?query=up&start=2015-07-01T20:10:30.781Z&end=2015-07-01T20:11:00.781Z&step=15s"
返回:
{ "status" : "success", "data" : { "resultType" : "matrix", "result" : [ { "metric" : { "__name__" : "up", "job" : "prometheus", "instance" : "localhost:9090" }, "values" : [ [ 1435781430.781, "1" ], [ 1435781445.781, "1" ], [ 1435781460.781, "1" ] ] }, { "metric" : { "__name__" : "up", "job" : "node", "instance" : "localhost:9091" }, "values" : [ [ 1435781430.781, "0" ], [ 1435781445.781, "0" ], [ 1435781460.781, "1" ] ] } ] } }
本文為容器監(jiān)控實踐系列文章,完整內(nèi)容見:container-monitor-book
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/33132.html
摘要:獲取請求數(shù)前位的時序樣本數(shù)據(jù),可以使用表達式用于計算當(dāng)前樣本數(shù)據(jù)值的分布情況,其中例如,當(dāng)為時,即表示找到當(dāng)前樣本數(shù)據(jù)中的中位數(shù)返回結(jié)果如下內(nèi)置函數(shù)提供了其它大量的內(nèi)置函數(shù),可以對時序數(shù)據(jù)進行豐富的處理。 一. 概述 Prometheus除了存儲數(shù)據(jù)外,還提供了一種強大的功能表達式語言 PromQL,允許用戶實時選擇和匯聚時間序列數(shù)據(jù)。 表達式的結(jié)果可以在瀏覽器中顯示為圖形,也可以顯示...
摘要:根據(jù)配置文件,對接收到的警報進行處理,發(fā)出告警。在默認情況下,用戶只需要部署多套,采集相同的即可實現(xiàn)基本的。通過將監(jiān)控與數(shù)據(jù)分離,能夠更好地進行彈性擴展。參考文檔本文為容器監(jiān)控實踐系列文章,完整內(nèi)容見 系統(tǒng)架構(gòu)圖 1.x版本的Prometheus的架構(gòu)圖為:showImg(https://segmentfault.com/img/remote/1460000018372350?w=14...
摘要:根據(jù)配置文件,對接收到的警報進行處理,發(fā)出告警。在默認情況下,用戶只需要部署多套,采集相同的即可實現(xiàn)基本的。通過將監(jiān)控與數(shù)據(jù)分離,能夠更好地進行彈性擴展。參考文檔本文為容器監(jiān)控實踐系列文章,完整內(nèi)容見 系統(tǒng)架構(gòu)圖 1.x版本的Prometheus的架構(gòu)圖為:showImg(https://segmentfault.com/img/remote/1460000018372350?w=14...
摘要:本文將分享是為何以及如何開發(fā)出最佳實踐方法來使用在中監(jiān)控應(yīng)用程序的。什么是監(jiān)控最近有很多關(guān)于的消息,尤其是在中監(jiān)控應(yīng)用程序這方面。方法遵循中提及的原則,聚焦于檢測最終用戶在使用服務(wù)時關(guān)心的東西。 本文來自Weaveworks的工程師Anita Burhrle在Rancher Labs與Weaveworks聯(lián)合舉辦的Online Meetup上的技術(shù)分享。在此次分享中,嘉賓們討論了如何使...
摘要:擁有活躍的社區(qū),在上獲得的數(shù)超過了萬,符合網(wǎng)易云的選擇。當(dāng)然,也有一些不足,比如不能用于日志監(jiān)控分布式追蹤等范圍,所以網(wǎng)易云也做了很多設(shè)計和優(yōu)化。 分享網(wǎng)易云輕舟微服務(wù)選擇基于 Prometheus 開發(fā)微服務(wù)監(jiān)控系統(tǒng)的考量: 開源 云原生 與微服務(wù)監(jiān)控需求的匹配度很高 開源 Prometheus是CNCF(云原生計算基金會)旗下成熟的開源項目,而開源技術(shù)棧是網(wǎng)易云堅定不移的選擇,不僅...
閱讀 1478·2021-10-14 09:43
閱讀 1442·2021-10-09 09:58
閱讀 1937·2021-09-28 09:42
閱讀 3728·2021-09-26 09:55
閱讀 1752·2021-08-27 16:23
閱讀 2755·2021-08-23 09:46
閱讀 906·2019-08-30 15:55
閱讀 1405·2019-08-30 15:54