五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

軟件測(cè)試 | 普羅米修斯-PromQL進(jìn)階

2023-03-08 11:31 作者:愛(ài)測(cè)軟件測(cè)試  | 我要投稿

理解 instant 類型和 range 類型

在 PromQL 中我們可以使用很多的操作符和內(nèi)置函數(shù)來(lái)計(jì)算我們的監(jiān)控?cái)?shù)據(jù), 而這些操作符和內(nèi)置函數(shù)在計(jì)算的 時(shí)候要求輸入的參數(shù)是有類型要求的。 在 PromQL 中計(jì)算的參數(shù)分為標(biāo)量 (scalar) 和向量 (vector), 標(biāo)量就是普通的值, 比如 1,2,3,4 這些值就是標(biāo)量。 很好理解,不好理解的是向量類型的。 什么是向量呢?比如我們隨便找到一個(gè)指標(biāo), 他的數(shù)據(jù)張下面這個(gè)樣子:

{device="sda",instance="localhost:9100",job="node_exporter"}=>1634967552@1518146427.807 + 864551424@1518146427.807 {device="sdb",instance="localhost:9100",job="node_exporter"}=>1634967552@1518146427.807 + 864551424@1518146427.807`

這就是一個(gè)向量類型, 這里補(bǔ)充解釋一下,之所以我們這里返回了兩條數(shù)據(jù), 是因?yàn)橐粋€(gè)監(jiān)控指標(biāo)也就是 metric 是含有 label 的, 我們之前說(shuō)過(guò)監(jiān)控?cái)?shù)據(jù)會(huì)根據(jù) label 進(jìn)行分類, 所以我們這里可以看到有多條數(shù)據(jù)返回, 這也是為什么叫做向量,一個(gè)向量是多個(gè)監(jiān)控?cái)?shù)據(jù)組合而成的。而向量又分為 instant(瞬時(shí)向量)和 range(范圍向量)類型。 他們的含義也就是字面上的意思,瞬時(shí)向量反應(yīng)是某一個(gè)時(shí)刻的監(jiān)控?cái)?shù)據(jù),上面那條數(shù)據(jù)就是一個(gè)即時(shí)向量。 而如果我們使用 [time] 這樣的語(yǔ)法獲取一個(gè)時(shí)間段內(nèi)的監(jiān)控?cái)?shù)據(jù)的話, 就是一個(gè)范圍向量了。 比如我們使用process_cpu_seconds_total[5m]?來(lái)查詢 5 分鐘內(nèi)所有的監(jiān)控?cái)?shù)據(jù)就會(huì)返回如下的數(shù)據(jù)

process_cpu_seconds_total{GPUName="T4", beta_kubernetes_io_arch="amd64"} 457290.56 @1636449224.643?

457292.18 @1636449239.643?

457294.08 @1636449254.643?

457295.48 @1636449269.643?

457297.15 @1636449284.643?

457298.74 @1636449299.643?

457300 @1636449314.643?

457301.55 @1636449329.643?

457302.9 @1636449344.643?

457304.77 @1636449359.643

?457306.26 @1636449374.643

?457307.93 @1636449389.643?

457309.26 @1636449404.643?

?process_cpu_seconds_total{GPUName="T5", beta_kubernetes_io_arch="amd64"} 457290.56 @1636449224.643

?457292.18 @1636449239.643?

457294.08 @1636449254.643

457295.48 @1636449269.643

?457297.15 @1636449284.643

?457298.74 @1636449299.643?

457300 @1636449314.643?

457301.55 @1636449329.643?

457302.9 @1636449344.643?

457304.77 @1636449359.643

?457306.26 @1636449374.643?

457307.93 @1636449389.643?

457309.26 @1636449404.643

上面通過(guò) [time] 的語(yǔ)法就查詢到了過(guò)去 5 分鐘內(nèi)監(jiān)控?cái)?shù)據(jù)了 。 每一條數(shù)據(jù)里都記錄了 5 分鐘內(nèi)所有的數(shù)據(jù)值。

之所以要搞清楚標(biāo)量和向量(瞬時(shí)向量,范圍向量)的定義是因?yàn)?PromQL 中的操作符和內(nèi)置函數(shù)在使用 的時(shí)候?qū)?shù)是有要求的。 有的要求是標(biāo)量, 有的要求是瞬時(shí)向量有的要求是范圍向量。所以我們要搞明白要調(diào)用的函數(shù)和操作符要求的變量是什么類型的, 然后才能去查詢出這個(gè)類型的變量來(lái)。 比如上次寫(xiě)的例子?avg(process_cpu_seconds_total{}) by (kubernetes_io_hostname)?avg 這個(gè)內(nèi)置函數(shù)要求的就是一個(gè)瞬時(shí)向量, 計(jì)算向量中數(shù)據(jù)的平均值。 如果我們用?avg(process_cpu_seconds_total{}[5m]) by (kubernetes_io_hostname)?去把查詢出的 5 分鐘內(nèi)的范圍向量輸入給 avg 函數(shù)的話,就會(huì)拋出異常:

Error executing query: 1:5: parse error: expected type instant vector in aggregation expression, got range vector

異常里說(shuō)了期望的類型是 instant vector 但是傳遞進(jìn)去的是一個(gè) range vector。

理解常用聚合操作符

先列一下常用的聚合操作符。 具體的每個(gè)函數(shù)和其他的操作符的文檔在:Operators | Prometheus

  • sum?(求和)

  • min?(最小值)

  • max?(最大值)

  • avg?(平均值)

  • stddev?(標(biāo)準(zhǔn)差)

  • stdvar?(標(biāo)準(zhǔn)方差)

  • count?(計(jì)數(shù))

  • count_values?(對(duì) value 進(jìn)行計(jì)數(shù))

  • bottomk?(后 n 條時(shí)序)

  • topk?(前 n 條時(shí)序)

  • quantile?(分位數(shù))

使用聚合操作的語(yǔ)法如下:

<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

其中只有?count_values?,?quantile?,?topk?,?bottomk?支持參數(shù) (parameter)。
without 用于從計(jì)算結(jié)果中移除列舉的標(biāo)簽,而保留其它標(biāo)簽。by 則正好相反,結(jié)果向量中只保留列出的標(biāo)簽,其余標(biāo)簽則移除。通過(guò) without 和 by 可以按照樣本的問(wèn)題對(duì)數(shù)據(jù)進(jìn)行聚合。
例如:

sum(http_requests_total) without (instance)

等價(jià)于
sum(http_requests_total) by (code,handler,job,method)

注意這些聚合函數(shù)要求的類型都是瞬時(shí)向量的類型。 可能有些同學(xué)會(huì)覺(jué)得奇怪,我們一般希望得到的數(shù)據(jù)是反應(yīng)當(dāng)前系統(tǒng)現(xiàn)狀的監(jiān)控結(jié)果。 那要這些聚合函數(shù)有什么用, 比如 sum 函數(shù)是用來(lái)計(jì)算瞬時(shí)向量中所有數(shù)據(jù)的累加值的。 這有什么用? 比如還是拿process_cpu_seconds_total?這個(gè)指標(biāo)來(lái)說(shuō), 這個(gè)指標(biāo)是通過(guò) process exporter 監(jiān)控一些進(jìn)程的。 我們這么查詢出來(lái)的結(jié)果是把所有機(jī)器上的監(jiān)控的所有進(jìn)程都查詢出來(lái)了。 那如果我想計(jì)算出每臺(tái)機(jī)器的 CPU 使用總數(shù)呢? 那么就需要 sum 函數(shù) 配合 by 關(guān)鍵字來(lái)解決問(wèn)題了:sum(process_cpu_seconds_total) by (kubernetes_io_hostname)

查詢結(jié)果會(huì)根據(jù) by 關(guān)鍵字針對(duì) hostname 進(jìn)行分組, 然后每組里都使用 sum 函數(shù)進(jìn)行計(jì)算 。 這樣就能分別計(jì)算出每臺(tái)機(jī)器 上進(jìn)程占用 CPU 的總和了。

理解常用內(nèi)置函數(shù)

首先所有內(nèi)置函數(shù)的文檔鏈接:Query functions | Prometheus?函數(shù)比較多, 我這類就介紹最常用的。
計(jì)算 counter 類型數(shù)據(jù)的增長(zhǎng)率的常用函數(shù) –?rate?理論上,rate 用于計(jì)算某個(gè)指標(biāo)每秒的增長(zhǎng)率。 因?yàn)?counter 類型都是只增不減的, 比如統(tǒng)計(jì)某個(gè)進(jìn)程使用的 CPU 數(shù)據(jù),其實(shí)統(tǒng)計(jì)的就是這個(gè)進(jìn)程到目前位置使用 cpu 時(shí)間的總量, 又或者統(tǒng)計(jì)某塊網(wǎng)卡的網(wǎng)絡(luò)包,指標(biāo)返回的是這塊網(wǎng)卡從啟動(dòng)到現(xiàn)在收發(fā)網(wǎng)絡(luò)包 size 的總和, 這些都很難反應(yīng)數(shù)據(jù)當(dāng)前系統(tǒng)的性能情況。 而 rate 的這個(gè)函數(shù)就是用來(lái)在 counter 類型的數(shù)據(jù)中計(jì)算某段時(shí)間內(nèi), 這個(gè)指標(biāo)平均每秒都增長(zhǎng)了多少數(shù)字。 比如我們要統(tǒng)計(jì)某個(gè)節(jié)點(diǎn)的 CPU 使用率的話,PromQL 語(yǔ)句是100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)

這里需要好好解釋一下這個(gè)語(yǔ)句的含義, 首先我們需要先知道。 關(guān)于 CPU 的指標(biāo)統(tǒng)計(jì)是一個(gè)只增不減的 ounter 類型,查詢結(jié)果是每一塊 CPU 自啟動(dòng)以來(lái)一共 運(yùn)行了多少秒。 如下:

|node_cpu_seconds_total{cpu="0", instance="cs1", mode="idle"} |8327793.95|

|node_cpu_seconds_total{cpu="0", instance="cs1", mode="system"} |8327793.95 | |node_cpu_seconds_total{cpu="0", instance="cs1", mode="user"} |8327793.95 | |node_cpu_seconds_total{cpu="1", instance="cs1", mode="idle"} |6327793.95 | |node_cpu_seconds_total{cpu="0", instance="cs2", mode="idle"} |9327793.95 | |node_cpu_seconds_total{cpu="1", instance="cs2", mode="idle"} |4327793.95 |

上面是我 mock 的數(shù)據(jù),我把很多數(shù)據(jù)給刪除了, 免得占用太大的篇幅。 我們可以認(rèn)為當(dāng)我們使用node_cpu_seconds_total?查詢后, 就會(huì)返回上面那樣的數(shù)據(jù)。 上面 分別展示了 2 臺(tái)機(jī)器上的 4 塊卡的性能信息,分別用 3 個(gè) label 進(jìn)行區(qū)分。 cpu 是卡的編號(hào), instance 是機(jī)器名字, model 是這塊 cpu 的模式,idel 代表空閑時(shí)間, user 代表用戶態(tài)時(shí)間,system 代表內(nèi)核態(tài)時(shí)間。 而這個(gè)指標(biāo)的含義就是某臺(tái)機(jī)器上某塊卡在某個(gè)模式下自啟動(dòng)以來(lái)的時(shí)間總和(精確到秒)。 那么這個(gè)時(shí)候要統(tǒng)計(jì)某臺(tái)機(jī)器的 CPU 的使用率我們就需要利用 rate 函數(shù)來(lái)解決了。 rate 函數(shù)能計(jì)算出平均每秒 CPU 使用時(shí)間增長(zhǎng)多少。 比如我們統(tǒng)計(jì)最近 5 分鐘的數(shù)據(jù), 然后用 rate 函數(shù)計(jì)算出 CPU 這段時(shí)間內(nèi)在空閑狀態(tài)下,每秒增長(zhǎng)了 0.9。 也就是說(shuō)過(guò)去 5 分鐘內(nèi),平均每一秒里 CPU 有 0.9 秒都處于空閑狀態(tài)。 那么 CPU 的使用率就是 10% 了。 這樣我們就理解了為什么我們會(huì)使用100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)?來(lái)計(jì)算 CPU 的使用率了吧。 這里再簡(jiǎn)單介紹一下幾個(gè)細(xì)節(jié):

  • avg by (instance)?是因?yàn)槲覀円y(tǒng)計(jì)每臺(tái)機(jī)器的 cpu 使用率。 所以先按機(jī)器分組。 但是每臺(tái)機(jī)器上又有很多塊 cpu 卡, 所以 avg 用來(lái)計(jì)算平均的 cpu 使用率。

  • model="idel"?是要篩選出 cpu 空閑時(shí)間的指標(biāo)。

  • 用 rate 計(jì)算出平均增長(zhǎng)率后乘以 100 再用 100 減去這個(gè)結(jié)果, 是因?yàn)槲覀円?jì)算出一個(gè)百分比。

需要注意的是使用 rate 函數(shù)去計(jì)算樣本的平均增長(zhǎng)速率,容易陷入 “長(zhǎng)尾問(wèn)題” 當(dāng)中,其無(wú)法反應(yīng)在時(shí)間窗口內(nèi)樣本數(shù)據(jù)的突發(fā)變化。 例如,對(duì)于主機(jī)而言在 2 分鐘的時(shí)間窗口內(nèi),可能在某一個(gè)由于訪問(wèn)量或者其它問(wèn)題導(dǎo)致 CPU 占用 100% 的情況,但是通過(guò)計(jì)算在時(shí)間窗口內(nèi)的平均增長(zhǎng)率卻無(wú)法反應(yīng)出該問(wèn)題。
為了解決該問(wèn)題,PromQL 提供了另外一個(gè)靈敏度更高的函數(shù) irate(v range-vector)。irate 同樣用于計(jì)算區(qū)間向量的計(jì)算率,但是其反應(yīng)出的是瞬時(shí)增長(zhǎng)率。irate 函數(shù)是通過(guò)區(qū)間向量中最后兩個(gè)樣本數(shù)據(jù)來(lái)計(jì)算區(qū)間向量的增長(zhǎng)速率。這種方式可以避免在時(shí)間窗口范圍內(nèi)的 “長(zhǎng)尾問(wèn)題”,并且體現(xiàn)出更好的靈敏度,通過(guò) irate 函數(shù)繪制的圖標(biāo)能夠更好的反應(yīng)樣本數(shù)據(jù)的瞬時(shí)變化狀態(tài)。

irate(node_cpu_seconds_total[2m])

irate 函數(shù)相比于 rate 函數(shù)提供了更高的靈敏度,不過(guò)當(dāng)需要分析長(zhǎng)期趨勢(shì)或者在告警規(guī)則中,irate 的這種靈敏度反而容易造成干擾。因此在長(zhǎng)期趨勢(shì)分析或者告警中更推薦使用 rate 函數(shù)。


軟件測(cè)試 | 普羅米修斯-PromQL進(jìn)階的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
金平| 黄梅县| 金秀| 绍兴县| 正镶白旗| 台湾省| 隆德县| 平安县| 红河县| 灵璧县| SHOW| 海城市| 姚安县| 金湖县| 任丘市| 礼泉县| 太湖县| 汕头市| 邹平县| 温泉县| 贵溪市| 武陟县| 沭阳县| 莒南县| 于田县| 光山县| 永德县| 扶风县| 永修县| 南陵县| 景德镇市| 高唐县| 桐柏县| 桐庐县| 云安县| 林西县| 海宁市| 新丰县| 绍兴市| 凤阳县| 沙洋县|