国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

容器監(jiān)控實踐—PromQL查詢解析

張憲坤 / 2165人閱讀

摘要:獲取請求數(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 類似,由 {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 的值。
基礎(chǔ)查詢

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ù)運算

二元算術(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)先級

四則運算有優(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

匹配模式(聯(lián)合查詢)

與數(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()

_over_time()

API訪問

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é)果。

瞬時數(shù)據(jù)查詢

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" ]
         }
      ]
   }
}
區(qū)間查詢

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

相關(guān)文章

  • 容器監(jiān)控實踐PromQL查詢解析

    摘要:獲取請求數(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é)果可以在瀏覽器中顯示為圖形,也可以顯示...

    songjz 評論0 收藏0
  • 容器監(jiān)控實踐—Prometheus基本架構(gòu)

    摘要:根據(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...

    gghyoo 評論0 收藏0
  • 容器監(jiān)控實踐—Prometheus基本架構(gòu)

    摘要:根據(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...

    elina 評論0 收藏0
  • Prometheus監(jiān)控的最佳實踐——關(guān)于監(jiān)控的3項關(guān)鍵指標(biāo)

    摘要:本文將分享是為何以及如何開發(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ù)分享。在此次分享中,嘉賓們討論了如何使...

    tuantuan 評論0 收藏0
  • prometheus比zabbix好在哪點?

    摘要:擁有活躍的社區(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)易云堅定不移的選擇,不僅...

    skinner 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<