摘要:獲取請求數(shù)前位的時序樣本數(shù)據(jù),可以使用表達式用于計算當前樣本數(shù)據(jù)值的分布情況,其中例如,當為時,即表示找到當前樣本數(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類型關于時間序列存儲,可以參考:https://www.infoq.cn/article/...
Prometheus會將所有采集到的樣本數(shù)據(jù)以時間序列(time-series)的方式保存在內(nèi)存數(shù)據(jù)庫TSDB中,并且定時保存到硬盤上。time-series是按照時間戳和值的序列順序存放的,我們稱之為向量(vector)。每條time-series通過指標名稱(metrics name)和一組標簽集(labelset)命名。
在time-series中的每一個點稱為一個樣本(sample),樣本由以下三部分組成:
指標(metric):metric name和描述當前樣本特征的labelsets;
時間戳(timestamp):一個精確到毫秒的時間戳;
樣本值(value): 一個folat64的浮點型數(shù)據(jù)表示當前樣本的值。
如某一時刻的node_cpu指標為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中不同的指標類型(metric type):
Counter 計數(shù)器
計數(shù)器,只增不減,如http_requests_total請求總數(shù) 例如,通過rate()函數(shù)獲取HTTP請求量的增長率: rate(http_requests_total[5m])
Gauge 儀表盤
當前狀態(tài),可增可減。如kube_pod_status_ready當前pod可用數(shù) 可以獲取樣本在一段時間返回內(nèi)的變化情況,如: delta(kube_pod_status_ready[2h])
Histogram 直方圖
Histogram 由_bucket{le=" "}, _bucket{le="+Inf"}, _sum, _count 組成,主要用于表示一段時間范圍內(nèi)對數(shù)據(jù)進行采樣(通常是請求持續(xù)時間或響應大小),并能夠?qū)ζ渲付▍^(qū)間以及總數(shù)進行統(tǒng)計,通常它采集的數(shù)據(jù)展示為直方圖。 例如 Prometheus server 中 prometheus_local_storage_series_chunks_persisted, 表示 Prometheus 中每個時序需要存儲的 chunks 數(shù)量,我們可以用它計算待持久化的數(shù)據(jù)的分位數(shù)。
Summary 摘要
Summary 和 Histogram 類似,由基礎查詢{quantile="<φ>"}, _sum, _count 組成,主要用于表示一段時間內(nèi)數(shù)據(jù)采樣結(jié)果(通常是請求持續(xù)時間或響應大小),它直接存儲了 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指標
你可以通過附加一組標簽,并用{}括起來,來進一步篩選這些時間序列。下面這個例子只選擇有http_requests_total名稱的、有prometheus工作標簽的、有canary組標簽的時間序列:
http_requests_total{job="prometheus",group="canary"}
如果條件為空,可以寫為:http_requests_total{}
另外,也可以也可以將標簽值反向匹配,或者對正則表達式匹配標簽值。如操作符:
=:選擇正好相等的字符串標簽 !=:選擇不相等的字符串標簽 =~:選擇匹配正則表達式的標簽(或子標簽) !=:選擇不匹配正則表達式的標簽(或子標簽)范圍查詢
類似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在當前時刻的一周的速率:
rate(http_requests_total{} offset 1w)
偏移修飾符允許更改查詢中單個即時向量和范圍向量的時間偏移量,例如,以下表達式返回相對于當前查詢時間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ù)據(jù)類型:
瞬時向量(Instant vector) - 一組時間序列,每個時間序列包含單個樣本,它們共享相同的時間戳。也就是說,表達式的返回值中只會包含該時間序列中的最新的一個樣本值。而相應的這樣的表達式稱之為瞬時向量表達式。
區(qū)間向量(Range vector) - 一組時間序列,每個時間序列包含一段時間范圍內(nèi)的樣本數(shù)據(jù)。
標量(Scalar) - 一個浮點型的數(shù)據(jù)值。
字符串(String) - 一個簡單的字符串值。
二元運算操作符支持 scalar/scalar(標量/標量)、vector/scalar(向量/標量)、和 vector/vector(向量/向量) 之間的操作。
在兩個標量之間進行數(shù)學運算,得到的結(jié)果也是標量。
例如,如果我們想根據(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的復雜運算也有優(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)
例如當存在樣本:
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),操作符兩邊表達式返回的瞬時向量中將找不到任何一個標簽完全相同的匹配項。
因此結(jié)果如下:
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
同時由于 method 為 put 和 del 的樣本找不到匹配項,因此不會出現(xiàn)在結(jié)果當中。
多對一模式
例如,使用表達式:
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
該表達式中,左向量 method_code:http_errors:rate5m 包含兩個標簽 method 和 code。而右向量 method:http_requests:rate5m 中只包含一個標簽 method,因此匹配時需要使用 ignoring 限定匹配的標簽為 code。
在限定匹配標簽后,右向量中的元素可能匹配到多個左向量中的元素 因此該表達式的匹配模式為多對一,需要使用 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ù)學運算符中使用。在邏輯運算 and,unless 和 or 操作中默認與右向量中的所有元素進行匹配。聚合操作
Prometheus 還提供了下列內(nèi)置的聚合操作符,這些操作符作用域瞬時向量。可以將瞬時表達式返回的樣本數(shù)據(jù)進行聚合,形成一個具有較少樣本值的新的時間序列。
sum (求和)
min (最小值)
max (最大值)
avg (平均值)
stddev (標準差)
stdvar (標準差異)
count (計數(shù))
count_values (對 value 進行計數(shù))
bottomk (樣本值最小的 k 個元素)
topk (樣本值最大的k個元素)
quantile (分布統(tǒng)計)
這些操作符被用于聚合所有標簽維度,或者通過 without 或者 by 子語句來保留不同的維度。
without 用于從計算結(jié)果中移除列舉的標簽,而保留其它標簽。
by 則正好相反,結(jié)果向量中只保留列出的標簽,其余標簽則移除。
通過 without 和 by 可以按照樣本的問題對數(shù)據(jù)進行聚合。
例如:
如果指標 http_requests_total 的時間序列的標簽集為 application, instance, 和 group,我們可以通過以下方式計算所有 instance 中每個 application 和 group 的請求總量:
sum(http_requests_total) without (instance)
等價于
`
sum(http_requests_total) by (application, group)
`
如果只需要計算整個應用的 HTTP 請求總量,可以直接使用表達式:
`sum(http_requests_total)
`
count_values 用于時間序列中每一個樣本值出現(xiàn)的次數(shù)。count_values 會為每一個唯一的樣本值輸出一個時間序列,并且每一個時間序列包含一個額外的標簽。
這個標簽的名字由聚合參數(shù)指定,同時這個標簽值是唯一的樣本值。
例如要計算運行每個構建版本的二進制文件的數(shù)量:
count_values("version", build_version) 返回結(jié)果如下: {count="641"} 1 {count="3226"} 2 {count="644"} 4
topk 和 bottomk
則用于對樣本值進行排序,返回當前樣本值前 n 位,或者后 n 位的時間序列。
獲取 HTTP 請求數(shù)前 5 位的時序樣本數(shù)據(jù),可以使用表達式:
topk(5, http_requests_total)
quantile 用于計算當前樣本數(shù)據(jù)值的分布情況 quantile(φ, express) ,其中 0 ≤ φ ≤ 1
例如,當 φ 為 0.5 時,即表示找到當前樣本數(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ù)去計算樣本的平均增長速率,容易陷入“長尾問題”當中, 其無法反應在時間窗口內(nèi)樣本數(shù)據(jù)的突發(fā)變化。 例如,對于主機而言在2分鐘的時間窗口內(nèi),可能在某一個由于訪問量或者其它問題導致CPU占用100%的情況, 但是通過計算在時間窗口內(nèi)的平均增長率卻無法反應出該問題。 為了解決該問題,PromQL提供了另外一個靈敏度更高的函數(shù)irate(v range-vector)。 irate同樣用于計算區(qū)間向量的計算率,但是其反應出的是瞬時增長率。 irate函數(shù)是通過區(qū)間向量中最后兩個兩本數(shù)據(jù)來計算區(qū)間向量的增長速率。 這種方式可以避免在時間窗口范圍內(nèi)的“長尾問題”,并且體現(xiàn)出更好的靈敏度,通過irate函數(shù)繪制的圖標能夠更好的反應樣本數(shù)據(jù)的瞬時變化狀態(tài)。
irate函數(shù)相比于rate函數(shù)提供了更高的靈敏度,不過當需要分析長期趨勢或者在告警規(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當前穩(wěn)定的HTTP API可以通過/api/v1訪問
錯誤狀態(tài)碼:
404 Bad Request:當參數(shù)錯誤或者缺失時。
422 Unprocessable Entity 當表達式無法執(zhí)行時。
503 Service Unavailiable 當請求超時或者被中斷時。
所有的API請求均使用以下的JSON格式:
{ "status": "success" | "error", "data": , // 為error時,有如下報錯信息 "errorType": "", "error": " " }
通過HTTP API我們可以分別通過/api/v1/query和/api/v1/query_range查詢PromQL表達式當前或者一定時間范圍內(nèi)的計算結(jié)果。
URL請求參數(shù):
query=:PromQL表達式。
time=:用于指定用于計算PromQL的時間戳。可選參數(shù),默認情況下使用當前系統(tǒng)時間。
timeout=:超時設置。可選參數(shù),默認情況下使用-query,timeout的全局設置。
$ 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ù),默認情況下使用-query,timeout的全局設置。
$ 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
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/32895.html
摘要:獲取請求數(shù)前位的時序樣本數(shù)據(jù),可以使用表達式用于計算當前樣本數(shù)據(jù)值的分布情況,其中例如,當為時,即表示找到當前樣本數(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)架構圖 1.x版本的Prometheus的架構圖為:showImg(https://segmentfault.com/img/remote/1460000018372350?w=14...
摘要:根據(jù)配置文件,對接收到的警報進行處理,發(fā)出告警。在默認情況下,用戶只需要部署多套,采集相同的即可實現(xiàn)基本的。通過將監(jiān)控與數(shù)據(jù)分離,能夠更好地進行彈性擴展。參考文檔本文為容器監(jiān)控實踐系列文章,完整內(nèi)容見 系統(tǒng)架構圖 1.x版本的Prometheus的架構圖為:showImg(https://segmentfault.com/img/remote/1460000018372350?w=14...
摘要:本文將分享是為何以及如何開發(fā)出最佳實踐方法來使用在中監(jiān)控應用程序的。什么是監(jiān)控最近有很多關于的消息,尤其是在中監(jiān)控應用程序這方面。方法遵循中提及的原則,聚焦于檢測最終用戶在使用服務時關心的東西。 本文來自Weaveworks的工程師Anita Burhrle在Rancher Labs與Weaveworks聯(lián)合舉辦的Online Meetup上的技術分享。在此次分享中,嘉賓們討論了如何使...
摘要:擁有活躍的社區(qū),在上獲得的數(shù)超過了萬,符合網(wǎng)易云的選擇。當然,也有一些不足,比如不能用于日志監(jiān)控分布式追蹤等范圍,所以網(wǎng)易云也做了很多設計和優(yōu)化。 分享網(wǎng)易云輕舟微服務選擇基于 Prometheus 開發(fā)微服務監(jiān)控系統(tǒng)的考量: 開源 云原生 與微服務監(jiān)控需求的匹配度很高 開源 Prometheus是CNCF(云原生計算基金會)旗下成熟的開源項目,而開源技術棧是網(wǎng)易云堅定不移的選擇,不僅...
閱讀 3096·2021-02-22 17:12
閱讀 719·2019-08-30 15:55
閱讀 3079·2019-08-30 15:54
閱讀 1384·2019-08-29 16:56
閱讀 1862·2019-08-29 15:13
閱讀 1716·2019-08-29 13:19
閱讀 601·2019-08-26 13:40
閱讀 2822·2019-08-26 10:26