自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

重塑 Prometheus 核心:揭開 PromQL 的面紗

開發(fā) 前端
如果需要查詢處理大量數(shù)據(jù),頁面繪圖可能會(huì)超時(shí)或使服務(wù)器、瀏覽器過載。因此,在構(gòu)建未知規(guī)模的數(shù)據(jù)查詢時(shí),先從 Prometheus 的表格視圖開始構(gòu)建,直到結(jié)果看起來合理(最多數(shù)百個(gè)時(shí)間序列,而不是數(shù)千個(gè)時(shí)間序列)。只有在充分過濾或聚合后,才能切換到圖形視圖。

引言

在我們重塑 Prometheus 之前,我們還有一個(gè)重要的角色需要熟悉和理解,那就是我們的 PromQL。

提前聲明下,本篇文章的最大敵人就是枯燥,比較無聊。

親愛的朋友,你是否武裝好了呢,反正我是沒有,哈哈,開玩笑。反正我自己看著文章都頭疼,就如同健身中的練腿,特別是深蹲。但是為了不讓你們小看我,我咬咬牙,就過去了,反正學(xué)習(xí)之前,需要準(zhǔn)備一下,不然受不了。

如果你已經(jīng)知道了或者很熟悉了,那這篇文章你可以選擇在學(xué)習(xí)下,那它是什么呢,我們來介紹下。

介紹

PromQL(Prometheus Query Language)是一種功能強(qiáng)大的查詢語言,專為 Prometheus 設(shè)計(jì)。它允許用戶以靈活的方式從時(shí)間序列數(shù)據(jù)庫中選擇、提取、聚合和分析數(shù)據(jù),支持多種聚合和計(jì)算操作。PromQL的設(shè)計(jì)目標(biāo)是提供一種簡(jiǎn)單且靈活的方式來查詢、分析監(jiān)控?cái)?shù)據(jù),使用戶能夠快速獲取所需的信息。Prometheus提供兩種查詢:瞬時(shí)查詢(instant query,查詢某個(gè)時(shí)間點(diǎn)的數(shù)據(jù))、范圍查詢( range query,在開始和結(jié)束時(shí)間之間以均勻間隔進(jìn)行數(shù)據(jù)查詢),可以將范圍查詢看做在不同時(shí)間點(diǎn)上多次進(jìn)行瞬時(shí)查詢。

官方文檔[1]

開始

四種指標(biāo)類型

? Counter(計(jì)數(shù)器)

? Gauge (儀表類型)

? Histogram(直方圖類型)

? Summary (摘要類型)

Counter(計(jì)數(shù)器)

Counter (只增不減的計(jì)數(shù)器) 類型的指標(biāo)其工作方式和計(jì)數(shù)器一樣,只增不減。常見的監(jiān)控指標(biāo),如 http_requests_total、 node_cpu_seconds_total 都是 Counter 類型的監(jiān)控指標(biāo)。

在 node-exporter 返回的樣本數(shù)據(jù)中,其注釋中也包含了該樣本的類型。例如:

HELP node_cpu_seconds_total Seconds the cpus spent in each mode.TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="cpu0",mode="idle"} 362812.7890625

? #HELP: 解釋當(dāng)前指標(biāo)的含義,上面表示在每種模式下 node 節(jié)點(diǎn)的 cpu 花費(fèi)的時(shí)間,以 s 為單位。

? #TYPE: 說明當(dāng)前指標(biāo)的數(shù)據(jù)類型,上面是 counter 類型。

counter 是一個(gè)簡(jiǎn)單但又強(qiáng)大的工具,例如我們可以在應(yīng)用程序中記錄某些事件發(fā)生的次數(shù),通過以時(shí)間序列的形式存儲(chǔ)這些數(shù)據(jù),我們可以輕松的了解該事件產(chǎn)生的速率變化。PromQL 內(nèi)置的聚合操作和函數(shù)可以讓用戶對(duì)這些數(shù)據(jù)進(jìn)行進(jìn)一步的分析,例如,通過 rate() 函數(shù)獲取 HTTP 請(qǐng)求量的增長(zhǎng)率:

rate(http_requests_total[5m])

查詢當(dāng)前系統(tǒng)中,訪問量前 10 的 HTTP 請(qǐng)求:

topk(10, http_requests_total)

Gauge (儀表類型)

與 Counter 不同, Gauge (可增可減的儀表盤) 類型的指標(biāo)側(cè)重于反應(yīng)系統(tǒng)的當(dāng)前狀態(tài)。因此這類指標(biāo)的樣本數(shù)據(jù)可增可減。常見指標(biāo)如:node_memory_MemFree_bytes(主機(jī)當(dāng)前空閑的內(nèi)存大?。?、 node_memory_MemAvailable_bytes(可用內(nèi)存大小)都是 Gauge 類型的監(jiān)控指標(biāo)。通過 Gauge 指標(biāo),用戶可以直接查看系統(tǒng)的當(dāng)前狀態(tài):

node_memory_MemFree_bytes

對(duì)于 Gauge 類型的監(jiān)控指標(biāo),通過 PromQL 內(nèi)置函數(shù) delta() 可以獲取樣本在一段時(shí)間范圍內(nèi)的變化情況。例如,計(jì)算 CPU 溫度在兩個(gè)小時(shí)內(nèi)的差異:

delta(cpu_temp_celsius{host="zeus"}[2h])

還可以直接使用 predict_linear() 對(duì)數(shù)據(jù)的變化趨勢(shì)進(jìn)行預(yù)測(cè)。例如,預(yù)測(cè)系統(tǒng)磁盤空間在4個(gè)小時(shí)之后的剩余情況:

predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)

Histogram(直方圖類型) 和 Summary(摘要類型)

除了 Counter 和 Gauge 類型的監(jiān)控指標(biāo)以外,Prometheus 還定義了 Histogram 和 Summary 的指標(biāo)類型。Histogram 和 Summary 用于統(tǒng)計(jì)和分析樣本的分布情況。

? 在大多數(shù)情況下人們都傾向于使用某些量化指標(biāo)的平均值,例如 CPU 的平均使用率、頁面的平均響應(yīng)時(shí)間,這種方式也有很明顯的問題,以系統(tǒng) API 調(diào)用的平均響應(yīng)時(shí)間為例:如果大多數(shù) API 請(qǐng)求都維持在 100ms 的響應(yīng)時(shí)間范圍內(nèi),而個(gè)別請(qǐng)求的響應(yīng)時(shí)間需要 5s,那么就會(huì)導(dǎo)致某些 WEB 頁面的響應(yīng)時(shí)間落到中位數(shù)上,而這種現(xiàn)象被稱為長(zhǎng)尾問題。

? 為了區(qū)分是平均的慢還是長(zhǎng)尾的慢,最簡(jiǎn)單的方式就是按照請(qǐng)求延遲的范圍進(jìn)行分組。例如,統(tǒng)計(jì)延遲在 010ms 之間的請(qǐng)求數(shù)有多少,而 1020ms 之間的請(qǐng)求數(shù)又有多少。通過這種方式可以快速分析系統(tǒng)慢的原因。Histogram 和 Summary 都是為了能夠解決這樣的問題存在的,通過 Histogram 和 Summary 類型的監(jiān)控指標(biāo),我們可以快速了解監(jiān)控樣本的分布情況。

例如,指標(biāo) prometheus_tsdb_wal_fsync_duration_seconds 的指標(biāo)類型為 Summary。它記錄了 Prometheus Server 中 wal_fsync 的處理時(shí)間,通過訪問 Prometheus Server 的 /metrics 地址,可以獲取到以下監(jiān)控樣本數(shù)據(jù):

HELP prometheus_tsdb_wal_fsync_duration_seconds Duration of WAL fsync.TYPE prometheus_tsdb_wal_fsync_duration_seconds summary
prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} 0.012352463
prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.9"} 0.014458005
prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.99"} 0.017316173
prometheus_tsdb_wal_fsync_duration_seconds_sum 2.888716127000002
prometheus_tsdb_wal_fsync_duration_seconds_count 216

從上面的樣本中可以得知當(dāng)前 Prometheus Server 進(jìn)行 wal_fsync 操作的總次數(shù)為 216 次,耗時(shí) 2.888716127000002s。其中中位數(shù)(quantile=0.5) 的耗時(shí)為 0.012352463,9 分位數(shù)(quantile=0.9)的耗時(shí)為 0.014458005s。

在 Prometheus Server 自身返回的樣本數(shù)據(jù)中,我們還能找到類型為 Histogram 的監(jiān)控指標(biāo) prometheus_tsdb_compaction_chunk_range_seconds_bucket:

HELP prometheus_tsdb_compaction_chunk_range_seconds Final time range of chunks on their first compactionTYPE prometheus_tsdb_compaction_chunk_range_seconds histogram
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="100"} 71
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="400"} 71
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="1600"} 71
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="6400"} 71
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="25600"} 405
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="102400"} 25690
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="409600"} 71863
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="1.6384e+06"} 115928
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="6.5536e+06"} 2.5687892e+07
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="2.62144e+07"} 2.5687896e+07
prometheus_tsdb_compaction_chunk_range_seconds_bucket{le="+Inf"} 2.5687896e+07
prometheus_tsdb_compaction_chunk_range_seconds_sum 4.7728699529576e+13
prometheus_tsdb_compaction_chunk_range_seconds_count 2.5687896e+07

與 Summary 類型的指標(biāo)相似之處在于 Histogram 類型的樣本同樣會(huì)反映當(dāng)前指標(biāo)的記錄的總數(shù)(以 _count 作為后綴)以及其值的總量(以 _sum 作為后綴)。不同在于 Histogram 指標(biāo)直接反映了在不同區(qū)間內(nèi)樣本的個(gè)數(shù),區(qū)間通過標(biāo)簽 le 進(jìn)行定義。

偏移(offset)修飾符

偏移修飾符用于在查詢中更改瞬時(shí)和范圍查詢的時(shí)間偏移。

例如,查詢 http_requests_total 在當(dāng)前時(shí)間戳前 5 分鐘的值:

http_requests_total offset 5m

注意,偏移修飾符需要緊跟選擇器之后,下面是正確的格式:

sum(http_requests_total{method="GET"} offset 5m) // 正確

下面這個(gè)是錯(cuò)誤的格式:

sum(http_requests_total{method="GET"}) offset 5m // 無效

offset 同樣適用于范圍查詢。http_requests_total 在一周前的 5 分鐘速率:

rate(http_requests_total[5m] offset 1w)

@ 修飾符

@ 修飾符用于在查詢中更改瞬時(shí)和范圍查詢的當(dāng)前時(shí)間戳。提供給 @ 修飾符的時(shí)間是一個(gè) Unix 時(shí)間戳,并用浮點(diǎn)數(shù)值描述。

例如,http_requests_total 在 2021-01-04T07:40:00+00:00 的值:

http_requests_total @ 1609746000

注意,@ 修飾符需要緊跟選擇器之后,下面是正確的格式:

sum(http_requests_total{method="GET"} @ 1609746000) // 正確

下面這個(gè)是錯(cuò)誤的格式:

sum(http_requests_total{method="GET"}) @ 1609746000 // 無效

@ 修飾符同樣適用范圍查詢。http_requests_total 在 2021-01-04T07:40:00+00:00 的 5 分鐘速率:

rate(http_requests_total[5m] @ 1609746000)

@ 修飾符可以與偏移修飾符一起工作,這時(shí)偏移就應(yīng)用于 @ 修飾符指定時(shí)間。這兩個(gè)修飾符之間的順序不會(huì)對(duì)結(jié)果產(chǎn)生影響。

例如,如下兩個(gè)查詢將產(chǎn)生相同的結(jié)果:

在 @ 之后偏移

http_requests_total @ 1609746000 offset 5m

在 @ 之前偏移

http_requests_total offset 5m @ 1609746000

此外,start() 和 end() 函數(shù)可以作為 @ 修飾符的值來使用。

對(duì)于范圍查詢來說,它們分別解析為范圍查詢的開始時(shí)間和結(jié)束時(shí)間。

對(duì)于瞬時(shí)查詢,start() 和 end() 都解析為當(dāng)前查詢時(shí)間。

http_requests_total @ start()rate(http_requests_total[5m] @ end())

表達(dá)式四種數(shù)據(jù)類型

PromQL 查詢語句即表達(dá)式,實(shí)現(xiàn)的四種數(shù)據(jù)類型:

? 瞬時(shí)向量(Instant vector):一組時(shí)間序列,每個(gè)時(shí)間序列包含單個(gè)樣本,它們共享相同的時(shí)間戳。也就是說,表達(dá)式的返回值中只會(huì)包含該時(shí)間序列中最新的一個(gè)樣本值。

? 區(qū)間向量(Range vector):一組時(shí)間序列,每個(gè)時(shí)間序列包含一段時(shí)間范圍內(nèi)的樣本數(shù)據(jù)。

? 標(biāo)量(Scalar):一個(gè)浮點(diǎn)型的數(shù)據(jù)值,沒有時(shí)序??梢詫懗蒣-](digits)[.(digits)]的形式。需要注意的是,使用表達(dá)式 count(http_requests_total)返回的數(shù)據(jù)類型依然是瞬時(shí)向量,用戶可以通過內(nèi)置函數(shù) scalar() 將單個(gè)瞬時(shí)向量轉(zhuǎn)換為標(biāo)量。

? 字符串(String):一個(gè)簡(jiǎn)單的字符串值。字符串可以用單引號(hào)('')、雙引號(hào)("")或反引號(hào)(``)來指定。

瞬時(shí)向量(Instant vector)

Instance vector(瞬時(shí)向量)表示一個(gè)時(shí)間序列的集合,但是每個(gè)時(shí)序只有最近的一個(gè)點(diǎn),而不是線。

圖片圖片

區(qū)間向量(Range vector)

Range vector(范圍向量)表示一段時(shí)間范圍里的時(shí)序,每個(gè)時(shí)序可包含多個(gè)點(diǎn) 。

圖片圖片

標(biāo)量(Scalar)

Scalar(標(biāo)量)通常為數(shù)值,可以將只有一個(gè)時(shí)序的 Instance vector 轉(zhuǎn)換成 Scalar。

字符串(String)

一個(gè)簡(jiǎn)單的字符串值。字符串可以用單引號(hào)('')、雙引號(hào)("")或反引號(hào)(``)來指定。

時(shí)間序列(向量)

按照時(shí)間順序記錄系統(tǒng)、設(shè)備狀態(tài)變化的數(shù)據(jù),每個(gè)數(shù)據(jù)成為一個(gè)樣本。

? 數(shù)據(jù)采集以特定的時(shí)間周期進(jìn)行,因而,隨著時(shí)間流逝,將這些樣本數(shù)據(jù)記錄下來,將生成一個(gè)離散的樣本數(shù)據(jù)序列。

? 該序列也稱為向量(Vector), 以時(shí)間軸為橫坐標(biāo)、序列為縱坐標(biāo),這些數(shù)據(jù)點(diǎn)連接起來就會(huì)形成一個(gè)矩陣。

圖片圖片

時(shí)間序列的構(gòu)成

每條時(shí)間序列(Time Series)是通過 指標(biāo)名稱(Metrics name)和一組標(biāo)簽集(Label set) 來命名的。

如果 time 相同,但是指標(biāo)名稱或者標(biāo)簽集不同,那么時(shí)間序列也不同。

樣本構(gòu)成

矩陣中每一個(gè)點(diǎn)都可稱為一個(gè)樣本(Sample),樣本主要由 3 構(gòu)成。

? 指標(biāo)(Metrics):包括指標(biāo)名稱(Metrics name)和一組標(biāo)簽集(Label set)名稱,如 request_total{path="/status",method="GET"} 。

? 時(shí)間戳(TimeStamp):這個(gè)值默認(rèn)精確到毫秒。

? 樣本值(Value):這個(gè)值默認(rèn)使用 Float64 浮點(diǎn)類型。

時(shí)間序列的指標(biāo)(Metrics)存儲(chǔ)格式為 key-value。

圖片圖片

http_request_total{status="200",method="GET"}@1434417560938=>94355 為例:

在 Key-Value 關(guān)系中,94355 作為 Value(也就是樣本值Sample Value),前面的 http_request_total{status="200",method="GET"} @1434417560938 一律作為 Key。

key 的組成

? Metric Name:指標(biāo)名(例子中的 http_request_total )

? Label:標(biāo)簽(例子中的{status="200",method="GET"})

? Timestamp:時(shí)間戳(例子中的 @1434417560938)

Prometheus Metrics兩種表現(xiàn)形式:

圖片圖片

標(biāo)簽過濾器4種運(yùn)算符

? = 與字符串匹配

? != 與字符串不匹

? =~ 與正則匹配

? !~ 與正則不匹配

匹配器(Matcher)

匹配器是作用于標(biāo)簽上的,標(biāo)簽匹配器可以對(duì)時(shí)間序列進(jìn)行過濾,Prometheus 支持完全匹配和正則匹配兩種模式:完全匹配和正則表達(dá)式匹配。

完全匹配

相等匹配器(=)

相等匹配器(Equality Matcher),用于選擇與提供的字符串完全相同的標(biāo)簽。下面介紹的例子中就會(huì)使用相等匹配器按照條件進(jìn)行一系列過濾。

node_cpu_seconds_total{instance="xaw"}

不相等匹配器(!=)

不相等匹配器(Negative Equality Matcher),用于選擇與提供的字符串不相同的標(biāo)簽。它和相等匹配器是完全相反的。舉個(gè)例子,如果想要查看job并不是 HelloWorld 的 HTTP 請(qǐng)求總數(shù),可以使用如下不相等匹配器。

正則表達(dá)式匹配

正則表達(dá)式匹配器(=~)

正則表達(dá)式匹配器(Regular Expression Matcher),用于選擇與提供的字符串進(jìn)行正則運(yùn)算后所得結(jié)果相匹配的標(biāo)簽。Prometheus 的正則運(yùn)算是強(qiáng)指定的,比如正則表達(dá)式 a 只會(huì)匹配到字符串 a ,而并不會(huì)匹配到 ab 或者 ba 或者abc。如果你不想使用這樣的強(qiáng)指定功能,可以在正則表達(dá)式的前面或者后面加上".*"。比如下面的例子表示 job 是所有以 Hello 開頭的 HTTP 請(qǐng)求總數(shù)。

node_cpu_seconds_total{instance=~"xaw-.*", mode="idle"}

node_cpu_seconds_total 直接等效于 {name="node_cpu_seconds_total"} ,后者也可以使用和前者一樣的4種匹配器(=,!=,=,!)。比如下面的案例可以表示所有以 Hello 開頭的指標(biāo)。

{__name__="node_cpu_seconds_total",instance=~"xaw-.*", mode="idle"}

正則表達(dá)式相反匹配器(!~)

正則表達(dá)式相反匹配器(Negative Regular Expression Matcher),用于選擇與提供的字符串進(jìn)行正則運(yùn)算后所得結(jié)果不匹配的標(biāo)簽。因?yàn)?PromQL 的正則表達(dá)式基于 RE2 的語法,但是 RE2 不支持向前不匹配表達(dá)式,所以 !~ 的出現(xiàn)是作為一種替代方案,以實(shí)現(xiàn)基于正則表達(dá)式排除指定標(biāo)簽值的功能。在一個(gè)選擇器當(dāng)中,可以針對(duì)同一個(gè)標(biāo)簽來使用多個(gè)匹配器。比如下面的例子,可以實(shí)現(xiàn)查找 job 名是 node 且安裝在 /prometheus 目錄下,但是并不在 /prometheus/user 目錄下的所有文件系統(tǒng)并確定其大小。

node_filesystem_size_bytes{job="node",mountpoint=~"/prometheus/.*", mountpoint!~ "/prometheus/user/.*"}

范圍選擇器

我們可以通過將 時(shí)間范圍選擇器[2] 附加到查詢語句中,指定為每個(gè)返回的區(qū)間向量樣本值中提取多長(zhǎng)的時(shí)間范圍。每個(gè)時(shí)間戳的值都是按時(shí)間倒序記錄在時(shí)間序列中的,該值是從時(shí)間范圍內(nèi)的時(shí)間戳獲取的對(duì)應(yīng)的值。

時(shí)間范圍通過數(shù)字來表示,單位可以使用以下其中之一的時(shí)間單位:

? s - 秒

? m - 分鐘

? h - 小時(shí)

? d - 天

? w - 周

? y - 年

因?yàn)楝F(xiàn)在每一個(gè)時(shí)間序列中都有多個(gè)時(shí)間戳多個(gè)值,所以沒辦法渲染,必須是標(biāo)量或者瞬時(shí)向量才可以繪制圖形。

不過通常區(qū)間向量都會(huì)應(yīng)用一個(gè)函數(shù)后變成可以繪制的瞬時(shí)向量,Prometheus 中對(duì)瞬時(shí)向量和區(qū)間向量有很多操作的 函數(shù)[3],不過對(duì)于區(qū)間向量來說最常用的函數(shù)并不多,使用最頻繁的有如下幾個(gè)函數(shù):

  • ? rate() : 計(jì)算整個(gè)時(shí)間范圍內(nèi)區(qū)間向量中時(shí)間序列的每秒平均增長(zhǎng)率。
  • ? irate() : 僅使用時(shí)間范圍中的最后兩個(gè)數(shù)據(jù)點(diǎn)來計(jì)算區(qū)間向量中時(shí)間序列的每秒平均增長(zhǎng)率, irate 只能用于繪制快速變化的序列,在長(zhǎng)期趨勢(shì)分析或者告警中更推薦使用 rate 函數(shù)。
  • ? increase() : 計(jì)算所選時(shí)間范圍內(nèi)時(shí)間序列的增量,它基本上是速率乘以時(shí)間范圍選擇器中的秒數(shù)。

PromQL 運(yùn)算符

數(shù)學(xué)運(yùn)算符

數(shù)學(xué)運(yùn)算符比較簡(jiǎn)單,就是簡(jiǎn)單的加減乘除等。

例如:我們通過 prometheus_http_response_size_bytes_sum 可以查詢到 Prometheus 這個(gè)應(yīng)用的 HTTP 響應(yīng)字節(jié)總和。但是這個(gè)單位是字節(jié),我們希望用 MB 顯示。那么我們可以這么設(shè)置:prometheus_http_response_size_bytes_sum/8/1024。

PromQL支持的所有數(shù)學(xué)運(yùn)算符如下所示:

? + (加法)

? - (減法)

? * (乘法)

? / (除法)

? % (求余)

? ^ (冪運(yùn)算)

布爾運(yùn)算符

布爾運(yùn)算符支持用戶根據(jù)時(shí)間序列中樣本的值,對(duì)時(shí)間序列進(jìn)行過濾。

例如:我們可以通過 prometheus_http_requests_total 查詢出每個(gè)接口的請(qǐng)求次數(shù),但是如果我們想篩選出請(qǐng)求次數(shù)超過 20 次的接口呢?

此時(shí)我們可以用下面的 PromQL 表達(dá)式:

prometheus_http_requests_total > 20

圖片圖片

從上面的圖中我們可以看到,value 的值還是具體的數(shù)值。但如果我們希望對(duì)符合條件的數(shù)據(jù),value 變?yōu)?1。不符合條件的數(shù)據(jù),value 變?yōu)?0。那么我們可以使用 bool 修飾符。

我們使用下面的 PromQL 表達(dá)式:

prometheus_http_requests_total > bool 20

圖片圖片

目前,Prometheus支持以下布爾運(yùn)算符如下:

? == (相等)

? !=(不相等)

? > (大于)

? < (小于)

? =(大于或等于)

? <=(小于或等于)

集合運(yùn)算符

通過集合運(yùn)算,可以在兩個(gè)瞬時(shí)向量與瞬時(shí)向量之間進(jìn)行相應(yīng)的集合操作。這個(gè)和我們理解的可不一樣,仔細(xì)看下面的解釋。目前,Prometheus支持以下集合運(yùn)算符:

? and 與操作

? or 或操作

? unless 排除操作

and 與操作

結(jié)果:返回兩個(gè)向量中共有的標(biāo)簽(匹配的時(shí)間序列)。

示例:

vector1 = {A, B, C}
vector2 = {B, C, D}
   - 結(jié)果:{B, C}

or 或操作

結(jié)果:返回兩個(gè)向量的聯(lián)合,包括所有標(biāo)簽。

示例:

vector1 = {A, B, C}
vector2 = {B, C, D}
   - 結(jié)果:{A, B, C, D}

unless 排除操作

結(jié)果:從第一個(gè)向量中排除與第二個(gè)向量中匹配的時(shí)間序列。

示例:

vector1 = {A, B, C}
vector2 = {B, C, D}
   - 結(jié)果:{A}

操作符優(yōu)先級(jí)

在PromQL操作符中優(yōu)先級(jí)由高到低依次為:

? ^

? *, /, %

? +, -

? ==, !=, <=, <, >=, >

? and, unless

? or

內(nèi)置函數(shù)

Prometheus 內(nèi)置不少函數(shù),通過靈活的應(yīng)用這些函數(shù),可以更方便的查詢及數(shù)據(jù)格式化。本文將選取其中較常使用到的幾個(gè)函數(shù)進(jìn)行講解。

ceil 函數(shù)

ceil 函數(shù)會(huì)將返回結(jié)果的值向上取整數(shù)。

ceil(avg(promhttp_metric_handler_requests_total{code="200"}))

floor 函數(shù)

floor 函數(shù)與 ceil 相反,將會(huì)進(jìn)行向下取整的操作。

rate 函數(shù)

rate函數(shù)是使用頻率最高,也是最重要的函數(shù)之一。rate 用于取某個(gè)時(shí)間區(qū)間內(nèi)每秒的平均增量數(shù),它會(huì)以該時(shí)間區(qū)間內(nèi)的所有數(shù)據(jù)點(diǎn)進(jìn)行統(tǒng)計(jì)。rate 函數(shù)通常作用于 Counter 類型的指標(biāo),用于了解增量情況。

示例:獲取 http_request_total 在1分鐘內(nèi),平均每秒新增的請(qǐng)求數(shù)

rate(promhttp_metric_handler_requests_total{handler="/rules"}[1m])

irate函數(shù)

相比 rate 函數(shù),irate 提供了更高的靈敏度。irate 函數(shù)是通過時(shí)間區(qū)間中最后兩個(gè)樣本數(shù)據(jù)來計(jì)算區(qū)間向量的增長(zhǎng)速率,從而避免范圍內(nèi)的平均值拉低峰值的情況 。

示例:該函數(shù)用法與rate相同

irate(promhttp_metric_handler_requests_total{handler="/rules"}[1m])

其它內(nèi)置函數(shù)

除了上面提到的這些函數(shù)外,PromQL 還提供了大量的其他函數(shù)供使用,功能范圍涵蓋了日常所需的功能,如用于標(biāo)簽替換的 label_replace 函數(shù)、統(tǒng)計(jì) Histogram 指標(biāo)分位數(shù)的 histogram_quantile 函數(shù)

更多信息可參閱官方文檔[4]

PromQL查詢示例

基本查詢

查詢所有實(shí)例的 http_requests_total 指標(biāo):

http_requests_total

聚合查詢

計(jì)算所有實(shí)例的 http_requests_total 總和:

sum(http_requests_total)

時(shí)間函數(shù)查詢

計(jì)算過去10分鐘內(nèi)每秒的請(qǐng)求速率:

rate(http_requests_total[10m])

復(fù)雜查詢

計(jì)算每個(gè)實(shí)例CPU使用率,并按實(shí)例(instance)進(jìn)行分組:

sum(rate(cpu_usage_seconds_total[5m])) by (instance)

常見應(yīng)用場(chǎng)景

監(jiān)控CPU、內(nèi)存使用情況

使用PromQL可以輕松監(jiān)控CPU、內(nèi)存的使用情況。例如,查詢每個(gè)實(shí)例過去5分鐘的CPU使用率:

sum(rate(cpu_usage_seconds_total[5m])) by (instance)

監(jiān)控網(wǎng)絡(luò)流量

PromQL還可以用于監(jiān)控網(wǎng)絡(luò)流量。例如,查詢每個(gè)實(shí)例過去5分鐘的網(wǎng)絡(luò)接收、發(fā)送字節(jié)數(shù):

sum(rate(network_receive_bytes_total[5m])) by (instance)
sum(rate(network_transmit_bytes_total[5m])) by (instance)

監(jiān)控應(yīng)用程序性能

通過PromQL可以監(jiān)控應(yīng)用程序的性能指標(biāo),如請(qǐng)求延遲、錯(cuò)誤率等。例如,查詢每個(gè)實(shí)例過去5分鐘的請(qǐng)求延遲的95分位值:

histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (instance))

監(jiān)控自定義指標(biāo)

PromQL允許監(jiān)控自定義指標(biāo)。例如,監(jiān)控特定業(yè)務(wù)邏輯的指標(biāo),如過去1小時(shí)用戶注冊(cè)數(shù)增量:

sum(increase(user_registration_total[1h]))

PromQL 聚合操作

Prometheus 還提供了聚合操作符,這些操作符作用于瞬時(shí)向量。可以將瞬時(shí)表達(dá)式返回的樣本數(shù)據(jù)進(jìn)行聚合,形成一個(gè)新的時(shí)間序列。目前支持的聚合函數(shù)有:

? 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í)序

sum 求和

用于對(duì)記錄的 value 值進(jìn)行求和。

例如:sum(prometheus_http_requests_total) 表示統(tǒng)計(jì)所有 HTTP 請(qǐng)求的次數(shù)。

sum(prometheus_http_requests_total)

min 最小值

返回所有記錄的最小值。

例如:min(prometheus_http_requests_total) 表示獲取數(shù)據(jù)集合中的最小值。

min(prometheus_http_requests_total)

max 最大值

返回所有記錄的最大值。

例如:maxmetheus_http_requests_total) 表示獲取數(shù)據(jù)集合中的最大值。

max(prometheus_http_requests_total)

avg 平均值

avg 函數(shù)返回所有記錄的平均值。

例如:avg(metheus_http_requests_total) 表示獲取數(shù)據(jù)集合中的平均值。

avg(prometheus_http_requests_total)

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

標(biāo)準(zhǔn)差(Standard Deviation)常用來描述數(shù)據(jù)的波動(dòng)大小。

例如: 統(tǒng)計(jì)出不同 HTTP 請(qǐng)求的數(shù)量波動(dòng)情況。

stddev(prometheus_http_requests_total)

count 計(jì)數(shù)

count 函數(shù)返回所有記錄的計(jì)數(shù)。

例如:count(prometheus_http_requests_total) 表示統(tǒng)計(jì)所有 HTTP 請(qǐng)求的次數(shù)。

count(prometheus_http_requests_total)

bottomk 后幾條

bottomk 用于對(duì)樣本值進(jìn)行排序,返回當(dāng)前樣本值后 N 位的時(shí)間序列。

例如:獲取 HTTP 請(qǐng)求量后 5 位的請(qǐng)求,可以使用表達(dá)式:

bottomk(5, prometheus_http_requests_total)

topk 前幾條

topk 用于對(duì)樣本值進(jìn)行排序,返回當(dāng)前樣本值前 N 位的時(shí)間序列。

例如:獲取 HTTP 請(qǐng)求量前 5 位的請(qǐng)求,可以使用表達(dá)式:

topk(5, prometheus_http_requests_total)

PromQL 語法總結(jié)

由于所有的 PromQL 表達(dá)式必須至少包含一個(gè)指標(biāo)名稱,或者至少有一個(gè)不會(huì)匹配到空字符串的標(biāo)簽過濾器,因此結(jié)合 Prometheus 官方文檔,可以梳理出如下非法示例。

{job=~".*"} 非法! .*表示任意一個(gè)字符,這就包括空字符串,且還沒有指標(biāo)名稱
{job=""}    非法!
{job!=""}   非法!

相反,如下表達(dá)式是合法的。
{job=~".+"}               合法!.+表示至少一個(gè)字符
{job=~".*",method="get"}  合法!.*表示任意一個(gè)字符
{job="",method="post"}    合法!存在一個(gè)非空匹配
{job=~".+",method="post"} 合法!存在一個(gè)非空匹配

性能優(yōu)化

在使用PromQL時(shí),性能是一個(gè)重要的考慮因素。下面是一些常用性能優(yōu)化技巧:

? 合適的時(shí)間查詢范圍: 查詢時(shí)選擇合適的時(shí)間范圍,以避免不必要的數(shù)據(jù)查詢處理。

? 避免過于復(fù)雜的查詢: 盡量簡(jiǎn)化查詢,避免使用過多的聚合計(jì)算和運(yùn)算符操作。

? 指標(biāo)數(shù)據(jù)緩存: 對(duì)于頻繁查詢的指標(biāo),可以考慮使用緩存機(jī)制。

如果需要查詢處理大量數(shù)據(jù),頁面繪圖可能會(huì)超時(shí)或使服務(wù)器、瀏覽器過載。因此,在構(gòu)建未知規(guī)模的數(shù)據(jù)查詢時(shí),先從 Prometheus 的表格視圖開始構(gòu)建,直到結(jié)果看起來合理(最多數(shù)百個(gè)時(shí)間序列,而不是數(shù)千個(gè)時(shí)間序列)。只有在充分過濾或聚合后,才能切換到圖形視圖。如果仍然需要太長(zhǎng)時(shí)間才能繪制圖形,建議使用記錄規(guī)則進(jìn)行預(yù)先處理。此外,聚合多個(gè)時(shí)間序列即使輸出只有少量時(shí)間序列結(jié)果,也會(huì)對(duì)服務(wù)器產(chǎn)生嚴(yán)重負(fù)載,這類似于在關(guān)系數(shù)據(jù)庫中對(duì)一列的所有值求和,即使輸出值只有一個(gè)數(shù)字,也會(huì)很慢。

引用鏈接

[1] 官方文檔: https://prometheus.io/docs/prometheus/latest/querying/basics

[2] 時(shí)間范圍選擇器: https://prometheus.io/docs/prometheus/latest/querying/basics/

[3] 函數(shù): https://prometheus.io/docs/prometheus/latest/querying/functions/

[4] 官方文檔: https://prometheus.io/docs/prometheus/latest/querying/functions/

責(zé)任編輯:武曉燕 來源: 云原生運(yùn)維圈
相關(guān)推薦

2022-01-16 18:51:57

.NET 6Configurati配置

2013-09-22 11:03:20

SocketSocket編程

2019-10-12 10:50:00

JavaScript編程語言代碼

2015-08-20 13:43:17

NFV網(wǎng)絡(luò)功能虛擬化

2023-11-26 23:59:16

PromQL算術(shù)運(yùn)算符

2009-09-08 16:30:18

網(wǎng)銀木馬

2010-05-17 09:13:35

2014-03-12 11:11:39

Storage vMo虛擬機(jī)

2021-06-07 08:18:12

云計(jì)算云端阿里云

2023-06-07 13:43:49

云計(jì)算

2010-05-26 19:12:41

SVN沖突

2009-12-03 09:19:41

Linux系統(tǒng)奧秘

2009-06-01 09:04:44

Google WaveWeb

2018-03-01 09:33:05

軟件定義存儲(chǔ)

2016-04-06 09:27:10

runtime解密學(xué)習(xí)

2009-09-15 15:34:33

Google Fast

2023-11-02 09:55:40

2016-11-10 12:49:00

2016-11-16 09:06:59

2024-02-14 09:00:00

機(jī)器學(xué)習(xí)索引ChatGPT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)