重塑 Prometheus 核心:揭開 PromQL 的面紗
引言
在我們重塑 Prometheus 之前,我們還有一個重要的角色需要熟悉和理解,那就是我們的 PromQL。
提前聲明下,本篇文章的最大敵人就是枯燥,比較無聊。
親愛的朋友,你是否武裝好了呢,反正我是沒有,哈哈,開玩笑。反正我自己看著文章都頭疼,就如同健身中的練腿,特別是深蹲。但是為了不讓你們小看我,我咬咬牙,就過去了,反正學習之前,需要準備一下,不然受不了。
如果你已經知道了或者很熟悉了,那這篇文章你可以選擇在學習下,那它是什么呢,我們來介紹下。
介紹
PromQL(Prometheus Query Language)是一種功能強大的查詢語言,專為 Prometheus 設計。它允許用戶以靈活的方式從時間序列數據庫中選擇、提取、聚合和分析數據,支持多種聚合和計算操作。PromQL的設計目標是提供一種簡單且靈活的方式來查詢、分析監控數據,使用戶能夠快速獲取所需的信息。Prometheus提供兩種查詢:瞬時查詢(instant query,查詢某個時間點的數據)、范圍查詢( range query,在開始和結束時間之間以均勻間隔進行數據查詢),可以將范圍查詢看做在不同時間點上多次進行瞬時查詢。
官方文檔[1]
開始
四種指標類型
? Counter(計數器)
? Gauge (儀表類型)
? Histogram(直方圖類型)
? Summary (摘要類型)
Counter(計數器)
Counter (只增不減的計數器) 類型的指標其工作方式和計數器一樣,只增不減。常見的監控指標,如 http_requests_total、 node_cpu_seconds_total 都是 Counter 類型的監控指標。
在 node-exporter 返回的樣本數據中,其注釋中也包含了該樣本的類型。例如:
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: 解釋當前指標的含義,上面表示在每種模式下 node 節點的 cpu 花費的時間,以 s 為單位。
? #TYPE: 說明當前指標的數據類型,上面是 counter 類型。
counter 是一個簡單但又強大的工具,例如我們可以在應用程序中記錄某些事件發生的次數,通過以時間序列的形式存儲這些數據,我們可以輕松的了解該事件產生的速率變化。PromQL 內置的聚合操作和函數可以讓用戶對這些數據進行進一步的分析,例如,通過 rate() 函數獲取 HTTP 請求量的增長率:
rate(http_requests_total[5m])
查詢當前系統中,訪問量前 10 的 HTTP 請求:
topk(10, http_requests_total)
Gauge (儀表類型)
與 Counter 不同, Gauge (可增可減的儀表盤) 類型的指標側重于反應系統的當前狀態。因此這類指標的樣本數據可增可減。常見指標如:node_memory_MemFree_bytes(主機當前空閑的內存大小)、 node_memory_MemAvailable_bytes(可用內存大小)都是 Gauge 類型的監控指標。通過 Gauge 指標,用戶可以直接查看系統的當前狀態:
node_memory_MemFree_bytes
對于 Gauge 類型的監控指標,通過 PromQL 內置函數 delta() 可以獲取樣本在一段時間范圍內的變化情況。例如,計算 CPU 溫度在兩個小時內的差異:
delta(cpu_temp_celsius{host="zeus"}[2h])
還可以直接使用 predict_linear() 對數據的變化趨勢進行預測。例如,預測系統磁盤空間在4個小時之后的剩余情況:
predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)
Histogram(直方圖類型) 和 Summary(摘要類型)
除了 Counter 和 Gauge 類型的監控指標以外,Prometheus 還定義了 Histogram 和 Summary 的指標類型。Histogram 和 Summary 用于統計和分析樣本的分布情況。
? 在大多數情況下人們都傾向于使用某些量化指標的平均值,例如 CPU 的平均使用率、頁面的平均響應時間,這種方式也有很明顯的問題,以系統 API 調用的平均響應時間為例:如果大多數 API 請求都維持在 100ms 的響應時間范圍內,而個別請求的響應時間需要 5s,那么就會導致某些 WEB 頁面的響應時間落到中位數上,而這種現象被稱為長尾問題。
? 為了區分是平均的慢還是長尾的慢,最簡單的方式就是按照請求延遲的范圍進行分組。例如,統計延遲在 010ms 之間的請求數有多少,而 1020ms 之間的請求數又有多少。通過這種方式可以快速分析系統慢的原因。Histogram 和 Summary 都是為了能夠解決這樣的問題存在的,通過 Histogram 和 Summary 類型的監控指標,我們可以快速了解監控樣本的分布情況。
例如,指標 prometheus_tsdb_wal_fsync_duration_seconds 的指標類型為 Summary。它記錄了 Prometheus Server 中 wal_fsync 的處理時間,通過訪問 Prometheus Server 的 /metrics 地址,可以獲取到以下監控樣本數據:
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
從上面的樣本中可以得知當前 Prometheus Server 進行 wal_fsync 操作的總次數為 216 次,耗時 2.888716127000002s。其中中位數(quantile=0.5) 的耗時為 0.012352463,9 分位數(quantile=0.9)的耗時為 0.014458005s。
在 Prometheus Server 自身返回的樣本數據中,我們還能找到類型為 Histogram 的監控指標 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 類型的指標相似之處在于 Histogram 類型的樣本同樣會反映當前指標的記錄的總數(以 _count 作為后綴)以及其值的總量(以 _sum 作為后綴)。不同在于 Histogram 指標直接反映了在不同區間內樣本的個數,區間通過標簽 le 進行定義。
偏移(offset)修飾符
偏移修飾符用于在查詢中更改瞬時和范圍查詢的時間偏移。
例如,查詢 http_requests_total 在當前時間戳前 5 分鐘的值:
http_requests_total offset 5m
注意,偏移修飾符需要緊跟選擇器之后,下面是正確的格式:
sum(http_requests_total{method="GET"} offset 5m) // 正確
下面這個是錯誤的格式:
sum(http_requests_total{method="GET"}) offset 5m // 無效
offset 同樣適用于范圍查詢。http_requests_total 在一周前的 5 分鐘速率:
rate(http_requests_total[5m] offset 1w)
@ 修飾符
@ 修飾符用于在查詢中更改瞬時和范圍查詢的當前時間戳。提供給 @ 修飾符的時間是一個 Unix 時間戳,并用浮點數值描述。
例如,http_requests_total 在 2021-01-04T07:40:00+00:00 的值:
http_requests_total @ 1609746000
注意,@ 修飾符需要緊跟選擇器之后,下面是正確的格式:
sum(http_requests_total{method="GET"} @ 1609746000) // 正確
下面這個是錯誤的格式:
sum(http_requests_total{method="GET"}) @ 1609746000 // 無效
@ 修飾符同樣適用范圍查詢。http_requests_total 在 2021-01-04T07:40:00+00:00 的 5 分鐘速率:
rate(http_requests_total[5m] @ 1609746000)
@ 修飾符可以與偏移修飾符一起工作,這時偏移就應用于 @ 修飾符指定時間。這兩個修飾符之間的順序不會對結果產生影響。
例如,如下兩個查詢將產生相同的結果:
在 @ 之后偏移
http_requests_total @ 1609746000 offset 5m
在 @ 之前偏移
http_requests_total offset 5m @ 1609746000
此外,start() 和 end() 函數可以作為 @ 修飾符的值來使用。
對于范圍查詢來說,它們分別解析為范圍查詢的開始時間和結束時間。
對于瞬時查詢,start() 和 end() 都解析為當前查詢時間。
http_requests_total @ start()rate(http_requests_total[5m] @ end())
表達式四種數據類型
PromQL 查詢語句即表達式,實現的四種數據類型:
? 瞬時向量(Instant vector):一組時間序列,每個時間序列包含單個樣本,它們共享相同的時間戳。也就是說,表達式的返回值中只會包含該時間序列中最新的一個樣本值。
? 區間向量(Range vector):一組時間序列,每個時間序列包含一段時間范圍內的樣本數據。
? 標量(Scalar):一個浮點型的數據值,沒有時序。可以寫成[-](digits)[.(digits)]的形式。需要注意的是,使用表達式 count(http_requests_total)返回的數據類型依然是瞬時向量,用戶可以通過內置函數 scalar() 將單個瞬時向量轉換為標量。
? 字符串(String):一個簡單的字符串值。字符串可以用單引號('')、雙引號("")或反引號(``)來指定。
瞬時向量(Instant vector)
Instance vector(瞬時向量)表示一個時間序列的集合,但是每個時序只有最近的一個點,而不是線。
圖片
區間向量(Range vector)
Range vector(范圍向量)表示一段時間范圍里的時序,每個時序可包含多個點 。
圖片
標量(Scalar)
Scalar(標量)通常為數值,可以將只有一個時序的 Instance vector 轉換成 Scalar。
字符串(String)
一個簡單的字符串值。字符串可以用單引號('')、雙引號("")或反引號(``)來指定。
時間序列(向量)
按照時間順序記錄系統、設備狀態變化的數據,每個數據成為一個樣本。
? 數據采集以特定的時間周期進行,因而,隨著時間流逝,將這些樣本數據記錄下來,將生成一個離散的樣本數據序列。
? 該序列也稱為向量(Vector), 以時間軸為橫坐標、序列為縱坐標,這些數據點連接起來就會形成一個矩陣。
圖片
時間序列的構成
每條時間序列(Time Series)是通過 指標名稱(Metrics name)和一組標簽集(Label set) 來命名的。
如果 time 相同,但是指標名稱或者標簽集不同,那么時間序列也不同。
樣本構成
矩陣中每一個點都可稱為一個樣本(Sample),樣本主要由 3 構成。
? 指標(Metrics):包括指標名稱(Metrics name)和一組標簽集(Label set)名稱,如 request_total{path="/status",method="GET"} 。
? 時間戳(TimeStamp):這個值默認精確到毫秒。
? 樣本值(Value):這個值默認使用 Float64 浮點類型。
時間序列的指標(Metrics)存儲格式為 key-value。
圖片
http_request_total{status="200",method="GET"}@1434417560938=>94355 為例:
在 Key-Value 關系中,94355 作為 Value(也就是樣本值Sample Value),前面的 http_request_total{status="200",method="GET"} @1434417560938 一律作為 Key。
key 的組成
? Metric Name:指標名(例子中的 http_request_total )
? Label:標簽(例子中的{status="200",method="GET"})
? Timestamp:時間戳(例子中的 @1434417560938)
Prometheus Metrics兩種表現形式:
圖片
標簽過濾器4種運算符
? = 與字符串匹配
? != 與字符串不匹
? =~ 與正則匹配
? !~ 與正則不匹配
匹配器(Matcher)
匹配器是作用于標簽上的,標簽匹配器可以對時間序列進行過濾,Prometheus 支持完全匹配和正則匹配兩種模式:完全匹配和正則表達式匹配。
完全匹配
相等匹配器(=)
相等匹配器(Equality Matcher),用于選擇與提供的字符串完全相同的標簽。下面介紹的例子中就會使用相等匹配器按照條件進行一系列過濾。
node_cpu_seconds_total{instance="xaw"}
不相等匹配器(!=)
不相等匹配器(Negative Equality Matcher),用于選擇與提供的字符串不相同的標簽。它和相等匹配器是完全相反的。舉個例子,如果想要查看job并不是 HelloWorld 的 HTTP 請求總數,可以使用如下不相等匹配器。
正則表達式匹配
正則表達式匹配器(=~)
正則表達式匹配器(Regular Expression Matcher),用于選擇與提供的字符串進行正則運算后所得結果相匹配的標簽。Prometheus 的正則運算是強指定的,比如正則表達式 a 只會匹配到字符串 a ,而并不會匹配到 ab 或者 ba 或者abc。如果你不想使用這樣的強指定功能,可以在正則表達式的前面或者后面加上".*"。比如下面的例子表示 job 是所有以 Hello 開頭的 HTTP 請求總數。
node_cpu_seconds_total{instance=~"xaw-.*", mode="idle"}
node_cpu_seconds_total 直接等效于 {name="node_cpu_seconds_total"} ,后者也可以使用和前者一樣的4種匹配器(=,!=,=,!)。比如下面的案例可以表示所有以 Hello 開頭的指標。
{__name__="node_cpu_seconds_total",instance=~"xaw-.*", mode="idle"}
正則表達式相反匹配器(!~)
正則表達式相反匹配器(Negative Regular Expression Matcher),用于選擇與提供的字符串進行正則運算后所得結果不匹配的標簽。因為 PromQL 的正則表達式基于 RE2 的語法,但是 RE2 不支持向前不匹配表達式,所以 !~ 的出現是作為一種替代方案,以實現基于正則表達式排除指定標簽值的功能。在一個選擇器當中,可以針對同一個標簽來使用多個匹配器。比如下面的例子,可以實現查找 job 名是 node 且安裝在 /prometheus 目錄下,但是并不在 /prometheus/user 目錄下的所有文件系統并確定其大小。
node_filesystem_size_bytes{job="node",mountpoint=~"/prometheus/.*", mountpoint!~ "/prometheus/user/.*"}
范圍選擇器
我們可以通過將 時間范圍選擇器[2] 附加到查詢語句中,指定為每個返回的區間向量樣本值中提取多長的時間范圍。每個時間戳的值都是按時間倒序記錄在時間序列中的,該值是從時間范圍內的時間戳獲取的對應的值。
時間范圍通過數字來表示,單位可以使用以下其中之一的時間單位:
? s - 秒
? m - 分鐘
? h - 小時
? d - 天
? w - 周
? y - 年
因為現在每一個時間序列中都有多個時間戳多個值,所以沒辦法渲染,必須是標量或者瞬時向量才可以繪制圖形。
不過通常區間向量都會應用一個函數后變成可以繪制的瞬時向量,Prometheus 中對瞬時向量和區間向量有很多操作的 函數[3],不過對于區間向量來說最常用的函數并不多,使用最頻繁的有如下幾個函數:
- ? rate() : 計算整個時間范圍內區間向量中時間序列的每秒平均增長率。
- ? irate() : 僅使用時間范圍中的最后兩個數據點來計算區間向量中時間序列的每秒平均增長率, irate 只能用于繪制快速變化的序列,在長期趨勢分析或者告警中更推薦使用 rate 函數。
- ? increase() : 計算所選時間范圍內時間序列的增量,它基本上是速率乘以時間范圍選擇器中的秒數。
PromQL 運算符
數學運算符
數學運算符比較簡單,就是簡單的加減乘除等。
例如:我們通過 prometheus_http_response_size_bytes_sum 可以查詢到 Prometheus 這個應用的 HTTP 響應字節總和。但是這個單位是字節,我們希望用 MB 顯示。那么我們可以這么設置:prometheus_http_response_size_bytes_sum/8/1024。
PromQL支持的所有數學運算符如下所示:
? + (加法)
? - (減法)
? * (乘法)
? / (除法)
? % (求余)
? ^ (冪運算)
布爾運算符
布爾運算符支持用戶根據時間序列中樣本的值,對時間序列進行過濾。
例如:我們可以通過 prometheus_http_requests_total 查詢出每個接口的請求次數,但是如果我們想篩選出請求次數超過 20 次的接口呢?
此時我們可以用下面的 PromQL 表達式:
prometheus_http_requests_total > 20
圖片
從上面的圖中我們可以看到,value 的值還是具體的數值。但如果我們希望對符合條件的數據,value 變為 1。不符合條件的數據,value 變為 0。那么我們可以使用 bool 修飾符。
我們使用下面的 PromQL 表達式:
prometheus_http_requests_total > bool 20
圖片
目前,Prometheus支持以下布爾運算符如下:
? == (相等)
? !=(不相等)
? > (大于)
? < (小于)
? =(大于或等于)
? <=(小于或等于)
集合運算符
通過集合運算,可以在兩個瞬時向量與瞬時向量之間進行相應的集合操作。這個和我們理解的可不一樣,仔細看下面的解釋。目前,Prometheus支持以下集合運算符:
? and 與操作
? or 或操作
? unless 排除操作
and 與操作
結果:返回兩個向量中共有的標簽(匹配的時間序列)。
示例:
vector1 = {A, B, C}
vector2 = {B, C, D}
- 結果:{B, C}
or 或操作
結果:返回兩個向量的聯合,包括所有標簽。
示例:
vector1 = {A, B, C}
vector2 = {B, C, D}
- 結果:{A, B, C, D}
unless 排除操作
結果:從第一個向量中排除與第二個向量中匹配的時間序列。
示例:
vector1 = {A, B, C}
vector2 = {B, C, D}
- 結果:{A}
操作符優先級
在PromQL操作符中優先級由高到低依次為:
? ^
? *, /, %
? +, -
? ==, !=, <=, <, >=, >
? and, unless
? or
內置函數
Prometheus 內置不少函數,通過靈活的應用這些函數,可以更方便的查詢及數據格式化。本文將選取其中較常使用到的幾個函數進行講解。
ceil 函數
ceil 函數會將返回結果的值向上取整數。
ceil(avg(promhttp_metric_handler_requests_total{code="200"}))
floor 函數
floor 函數與 ceil 相反,將會進行向下取整的操作。
rate 函數
rate函數是使用頻率最高,也是最重要的函數之一。rate 用于取某個時間區間內每秒的平均增量數,它會以該時間區間內的所有數據點進行統計。rate 函數通常作用于 Counter 類型的指標,用于了解增量情況。
示例:獲取 http_request_total 在1分鐘內,平均每秒新增的請求數
rate(promhttp_metric_handler_requests_total{handler="/rules"}[1m])
irate函數
相比 rate 函數,irate 提供了更高的靈敏度。irate 函數是通過時間區間中最后兩個樣本數據來計算區間向量的增長速率,從而避免范圍內的平均值拉低峰值的情況 。
示例:該函數用法與rate相同
irate(promhttp_metric_handler_requests_total{handler="/rules"}[1m])
其它內置函數
除了上面提到的這些函數外,PromQL 還提供了大量的其他函數供使用,功能范圍涵蓋了日常所需的功能,如用于標簽替換的 label_replace 函數、統計 Histogram 指標分位數的 histogram_quantile 函數
更多信息可參閱官方文檔[4]
PromQL查詢示例
基本查詢
查詢所有實例的 http_requests_total 指標:
http_requests_total
聚合查詢
計算所有實例的 http_requests_total 總和:
sum(http_requests_total)
時間函數查詢
計算過去10分鐘內每秒的請求速率:
rate(http_requests_total[10m])
復雜查詢
計算每個實例CPU使用率,并按實例(instance)進行分組:
sum(rate(cpu_usage_seconds_total[5m])) by (instance)
常見應用場景
監控CPU、內存使用情況
使用PromQL可以輕松監控CPU、內存的使用情況。例如,查詢每個實例過去5分鐘的CPU使用率:
sum(rate(cpu_usage_seconds_total[5m])) by (instance)
監控網絡流量
PromQL還可以用于監控網絡流量。例如,查詢每個實例過去5分鐘的網絡接收、發送字節數:
sum(rate(network_receive_bytes_total[5m])) by (instance)
sum(rate(network_transmit_bytes_total[5m])) by (instance)
監控應用程序性能
通過PromQL可以監控應用程序的性能指標,如請求延遲、錯誤率等。例如,查詢每個實例過去5分鐘的請求延遲的95分位值:
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (instance))
監控自定義指標
PromQL允許監控自定義指標。例如,監控特定業務邏輯的指標,如過去1小時用戶注冊數增量:
sum(increase(user_registration_total[1h]))
PromQL 聚合操作
Prometheus 還提供了聚合操作符,這些操作符作用于瞬時向量。可以將瞬時表達式返回的樣本數據進行聚合,形成一個新的時間序列。目前支持的聚合函數有:
? sum 求和
? min 最小值
? max 最大值
? avg 平均值
? stddev 標準差
? stdvar 標準方差
? count 計數
? count_values 對value進行計數
? bottomk 后n條時序
? topk 前n條時序
sum 求和
用于對記錄的 value 值進行求和。
例如:sum(prometheus_http_requests_total) 表示統計所有 HTTP 請求的次數。
sum(prometheus_http_requests_total)
min 最小值
返回所有記錄的最小值。
例如:min(prometheus_http_requests_total) 表示獲取數據集合中的最小值。
min(prometheus_http_requests_total)
max 最大值
返回所有記錄的最大值。
例如:maxmetheus_http_requests_total) 表示獲取數據集合中的最大值。
max(prometheus_http_requests_total)
avg 平均值
avg 函數返回所有記錄的平均值。
例如:avg(metheus_http_requests_total) 表示獲取數據集合中的平均值。
avg(prometheus_http_requests_total)
stddev 標準差
標準差(Standard Deviation)常用來描述數據的波動大小。
例如: 統計出不同 HTTP 請求的數量波動情況。
stddev(prometheus_http_requests_total)
count 計數
count 函數返回所有記錄的計數。
例如:count(prometheus_http_requests_total) 表示統計所有 HTTP 請求的次數。
count(prometheus_http_requests_total)
bottomk 后幾條
bottomk 用于對樣本值進行排序,返回當前樣本值后 N 位的時間序列。
例如:獲取 HTTP 請求量后 5 位的請求,可以使用表達式:
bottomk(5, prometheus_http_requests_total)
topk 前幾條
topk 用于對樣本值進行排序,返回當前樣本值前 N 位的時間序列。
例如:獲取 HTTP 請求量前 5 位的請求,可以使用表達式:
topk(5, prometheus_http_requests_total)
PromQL 語法總結
由于所有的 PromQL 表達式必須至少包含一個指標名稱,或者至少有一個不會匹配到空字符串的標簽過濾器,因此結合 Prometheus 官方文檔,可以梳理出如下非法示例。
{job=~".*"} 非法! .*表示任意一個字符,這就包括空字符串,且還沒有指標名稱
{job=""} 非法!
{job!=""} 非法!
相反,如下表達式是合法的。
{job=~".+"} 合法!.+表示至少一個字符
{job=~".*",method="get"} 合法!.*表示任意一個字符
{job="",method="post"} 合法!存在一個非空匹配
{job=~".+",method="post"} 合法!存在一個非空匹配
性能優化
在使用PromQL時,性能是一個重要的考慮因素。下面是一些常用性能優化技巧:
? 合適的時間查詢范圍: 查詢時選擇合適的時間范圍,以避免不必要的數據查詢處理。
? 避免過于復雜的查詢: 盡量簡化查詢,避免使用過多的聚合計算和運算符操作。
? 指標數據緩存: 對于頻繁查詢的指標,可以考慮使用緩存機制。
如果需要查詢處理大量數據,頁面繪圖可能會超時或使服務器、瀏覽器過載。因此,在構建未知規模的數據查詢時,先從 Prometheus 的表格視圖開始構建,直到結果看起來合理(最多數百個時間序列,而不是數千個時間序列)。只有在充分過濾或聚合后,才能切換到圖形視圖。如果仍然需要太長時間才能繪制圖形,建議使用記錄規則進行預先處理。此外,聚合多個時間序列即使輸出只有少量時間序列結果,也會對服務器產生嚴重負載,這類似于在關系數據庫中對一列的所有值求和,即使輸出值只有一個數字,也會很慢。
引用鏈接
[1] 官方文檔: https://prometheus.io/docs/prometheus/latest/querying/basics
[2] 時間范圍選擇器: https://prometheus.io/docs/prometheus/latest/querying/basics/
[3] 函數: https://prometheus.io/docs/prometheus/latest/querying/functions/
[4] 官方文檔: https://prometheus.io/docs/prometheus/latest/querying/functions/