“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我建議閱讀羅曼·哈夫羅年科 (Roman Khavronenko) 的報告“ExtendedPromQL”的文字記錄

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

簡單介紹一下我。 我的名字是羅馬。 我在 CloudFlare 工作,住在倫敦。 但我也是 VictoriaMetrics 的維護者。
而且我是作者 ClickHouse 插件 對於格拉法納和 ClickHouse-代理 是 ClickHouse 的一個小型代理。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我們將從第一部分開始,稱為“翻譯的困難”,在其中我將談論任何語言甚至只是一種交流語言都非常重要的事實。 因為這是您向另一個人或系統傳達想法的方式,也是您提出請求的方式。 互聯網上的人們爭論哪種語言更好——java 還是其他語言。 對於我自己來說,我決定我需要根據任務進行選擇,因為這一切都是具體的。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

讓我們從頭開始吧。 什麼是 PromQL? PromQL 是 Prometheus 查詢語言。 這就是我們在 Prometheus 中形成查詢來獲取時間序列數據的方式。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

什麼是時間序列數據? 從字面上看,這是三個參數。

它們分別是:

  • 我們在看什麼?
  • 當我們看它的時候。
  • 而它又體現出怎樣的價值呢?

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

如果你看一下這個圖表(這個圖表來自我的手機,它顯示了我的步數統計),那麼在這裡你可以快速回答這些問題。

我們看一下步驟。 當我們看到它時,我們就看到了意義,也看到了時間。 也就是說,看這張圖,您可以輕鬆地說,週日我走了大約 15 步。 這是時間序列數據。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

現在讓我們將它們“分解”(轉換)為表形式的另一個數據模型。 在這裡我們也有我們正在看的東西。 這裡我添加了一些額外的數據,我們將其稱為元數據,也就是說,經歷的不是我,而是兩個人,例如Jay和Silent Bob。 這就是我們正在關注的; 它顯示什麼以及何時顯示該值。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄
現在讓我們嘗試將所有這些數據存儲在數據庫中。 例如,我採用了 ClickHouse 語法。 在這裡,我們創建一個名為“步驟”的表,即我們正在查看的內容。 有一段時間,我們會審視它; 它顯示的內容以及我們將存儲其身份的一些元數據:Jay 和 Silent Bob。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

為了嘗試可視化這一切,我們將使用 Grafana,因為首先,它很漂亮。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我們也將使用這個插件。 有兩個原因。 第一個是因為我寫的。 我清楚地知道從 ClickHouse 中提取時間序列數據並在 Grafana 中顯示它是多麼困難。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我們將其顯示在圖形面板中。 這是 Grafana 中最受歡迎的面板,它顯示了值對時間的依賴性,因此我們只需要兩個參數。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄
讓我們編寫最簡單的查詢 - 如何在 Grafana 中顯示步驟統計信息,並將這些數據存儲在 ClickHouse 中我們創建的表中。 我們編寫了這樣一個簡單的查詢。 我們從步驟中進行選擇。 我們選擇一個值並選擇這些值的時間,即我們討論的相同的三個參數。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

結果,我們將得到這樣的圖表。 誰知道他為什麼這麼奇怪?

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

沒錯,你需要按時間排序。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

最終我們得到了一個更好但仍然奇怪的時間表。 誰知道為什麼? 沒錯,有兩個參與者,我們在 Grafana 中給出了兩個時間序列,因為如果我們再次處理數據模型,那麼每個時間序列都是名稱和所有標籤鍵值的唯一組合。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

因此,我們需要選擇一個特定的人。 我們選擇傑伊。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

讓我們再畫一次。 現在圖表看起來就像事實一樣。 現在這是一個正常的時間表,一切都進展順利。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

您可能知道如何做大致相同的事情,但是在 Prometheus 中通過 PromQL。 像這樣的東西。 簡單一點。 讓我們把這一切分解一下。 我們採取了步驟。 並由傑伊過濾。 我們在這裡沒有指定我們需要獲取一個值,也沒有選擇一個時間。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

現在讓我們嘗試計算 Jay 或 Silent Bob 的移動速度。 在 ClickHouse 中,我們需要執行 runningDifference,即計算點對之間的差異並將它們除以時間以獲得準確的速度。 該請求看起來像這樣。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

它將顯示大約這些值,即 Silent Bob 或 Jay 每秒大約走 1,8 步。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

在《普羅米修斯》中你也知道如何做到這一點。 比以前容易多了。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄為了使其在 Grafana 中也能輕鬆完成,我添加了這個包裝器,它看起來與 PromQL 非常相似。 它被稱為“速率宏”,或者任何你想要的名稱。 在 Grafana 中,你只需寫“rate”,但在內心深處,它會轉化為這個大請求。 你甚至不需要看它,它就在那裡,但你可以節省很多時間,因為編寫如此巨大的 SQL 查詢總是很昂貴的。 你很容易犯錯誤,然後很長一段時間都不明白髮生了什麼。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

這個請求甚至無法放入一張幻燈片中,我什至不得不將其分成兩欄。 這也是 ClickHouse 中的一個請求,它具有相同的速率,但對於兩個時間序列:Silent Bob 和 Jay,因此我們在面板上有兩個時間序列。 在我看來,這已經非常困難了。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

根據普羅米修斯的說法,這將是總和(比率)。 對於 ClickHouse,我製作了一個名為 RateColumns 的單獨宏,它看起來像 Prometheus 中的查詢。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我們看了它,看起來 PromQL 很酷,但它當然也有局限性。

它們分別是:

  • 有限選擇。
  • 邊界連接。
  • 沒有支持。

如果你已經使用它很長時間了,那麼你就會知道,有時在PromQL 中做某事是非常困難的,但在SQL 中你幾乎可以做所有事情,因為我們剛才談到的所有這些選項都可以在SQL 中完成。 但使用起來會方便嗎? 這讓我覺得最強大的語言可能並不總是最方便的。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

因此,有時您需要為任務選擇一種語言。 就像蝙蝠俠與超人戰鬥一樣。 很明顯,超人更強,但蝙蝠俠能夠擊敗他,因為他更實際並且清楚地知道自己在做什麼。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

下一部分是擴展 PromQL。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

再次關於VictoriaMetrics。 什麼是維多利亞指標? 這是一個時間序列數據庫,它是開源的,我們分發它的單一版本和集群版本。 根據我們的基準測試,它比現在市場上的任何產品都要快,並且壓縮率相似,即真實的人報告每點壓縮約為 0,4 字節,而 Prometheus 的壓縮率為 1,2-1,4。

我們支持的不僅僅是普羅米修斯。 我們支持 InfluxDB、Graphite、OpenTSDB。

您可以在我們這裡“寫入”,即可以傳輸舊數據。

我們還與 Prometheus 和 Grafana 完美配合,即我們支持 PromQL 引擎。 在 Grafana 中,您只需將 Prometheus 端點更改為 VictoriaMetrics,所有儀表板都會像以前一樣工作。

但您還可以使用 VictoriaMetrics 提供的其他功能。

我們將快速瀏覽我們添加的功能。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

省略間隔參數 – 您可以在 Grafana 中省略間隔參數。 當你不想在面板放大/縮小時得到奇怪的圖形時,建議使用變量 $__interval。 這是 Grafana 的內部更改,它自行選擇數據范圍。 而VictoriaMetrics本身就能理解這個範圍應該是多少。 而且您無需更新所有請求。 這會容易得多。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

第二個功能是區間參考。 您可以在表達式中使用此間隔。 你可以乘法、除法、轉移、引用它。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

接下來是匯總函數族。 Rollup 函數可將任何時間序列轉換為三個獨立的時間序列。 它們是最小值、最大值和平均值。 我發現這非常方便,因為有時它會顯示一些異常值和不准確性。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

如果您只是進行憤怒或評級,那麼您可能會錯過一些時間序列表現不符合您預期的情況。 有了這個函數,就更容易看出,假設 max 與 avg 相差很大。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

接下來是默認變量。 默認值 - 這意味著如果我們目前沒有時間序列,我們需要在 Grafana 中繪製什麼值。 什麼時候會發生這種情況? 假設您正在導出一些錯誤指標。 而且您擁有一個非常酷的應用程序,當您啟動時,您沒有任何錯誤,甚至在接下來的三個小時甚至一天內都沒有錯誤。 您還擁有顯示從成功到錯誤之間關係的儀表板。 他們不會向您顯示任何內容,因為您沒有錯誤指標。 默認情況下,您可以指定任何內容。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

Keep_last_Value – 保存指標的最後一個值(如果缺失)。 如果 Prometheus 在下一次抓取後 5 分鐘內沒有找到它,那麼我們將在這裡記住它的最後一個值,並且您的圖表將不會再次損壞。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

Scrape_interval – 顯示 Prometheus 收集有關您的指標的數據的頻率以及頻率。 例如,您可以在這裡看到通行證。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄
標籤替換是一個流行的功能。 但我們認為這有點複雜,因為它需要完整的論證。 而且你不僅需要記住 5 個參數,還需要記住它們的順序。
“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄
因此,為什麼不讓它們變得更簡單呢? 也就是說,將其分解為具有可理解語法的小函數。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

現在是有趣的部分。 為什麼我們認為這是擴展的 PromQL? 因為我們支持通用表表達式。 您可以關註二維碼(https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/ExtendedPromQL),請參閱遊樂場中的示例鏈接,您可以直接在 VictoriaMetrics 中運行查詢,而無需簡單地將其安裝在瀏覽器中。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

這是什麼? 上面這個請求是一個相當受歡迎的請求。 我認為在許多公司的任何儀表板中,您對所有內容都使用相同的過濾器。 通常是這樣。 但是當你需要添加一些新的過濾器時,你必須更新每個面板,或者下載儀表板,以 JSON 格式打開它,然後查找替換,這也需要時間。 為什麼不將該值存儲在變量中並重用它? 在我看來,這看起來更簡單、更清晰。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

例如,當我需要在所有請求中更新 Grafana 中的過濾器時,儀表板可能很大,甚至可能有多個。 我想如何在 Grafana 中解決這個問題?

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我這樣解決這個問題:我創建一個 commonFilter 並在其中定義此過濾器,然後在查詢中重用它。 但如果您現在執行相同的操作,它將不起作用,因為 Grafana 不允許您在查詢變量中使用變量。 這有點奇怪。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

所以我做了一個選項,允許你這樣做。 如果您感興趣或想要這樣的功能,請支持它,如果您不喜歡這個想法,則不喜歡它。 https://github.com/grafana/grafana/pull/16694

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

有關 PromQL 擴展的更多信息。 這裡我們不僅定義了一個變量,而且定義了整個函數。 我們稱之為 ru(資源使用)。 並且該功能接受免費資源、資源限制和過濾。 語法看起來很簡單。 使用這個函數併計算我們擁有的可用內存的百分比非常容易。 也就是我們有多少內存,有什麼限制以及如何過濾。 如果您全部編寫並重複使用相同的過濾器,看起來會方便得多,因為它會變成一個非常非常大的查詢。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

這是一個如此巨大的請求的例子。 它來自 Grafana 的官方 NodeExporter 儀表板。 但我幾乎不明白這裡發生了什麼。 當然,如果你仔細觀察的話我明白,但是括號的數量會立即降低理解這裡發生的事情的動機。 為什麼不讓它變得更簡單、更清晰呢?

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

例如,像這樣,將重要的事物或部分分成變量。 然後做你的基礎數學。 這已經更像是編程了,這也是我希望將來在 Grafana 中看到的。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

這是第二個例子,說明如果我們已經有了這個 ru 函數,並且它已經直接存在於 VictoriaMetrics 中,那麼我們如何使這一切變得更加容易。 然後,您只需傳遞在 CTE 中聲明的緩存值即可。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我已經談到使用正確的編程語言是多麼重要。 而且,Grafana 的每家公司可能都有不同的事情發生。 而且您可能還向開發人員授予 Grafana 訪問權限,然後開發人員做自己的事情。 他們的做法都以不同的方式進行。 但我希望它在某種程度上是相同的,也就是說,將其降低到一個共同的標準。

假設您甚至不僅有系統工程師,甚至可能還有專家、devops 或 SRE。 也許你有知道什麼是監控、什麼是 Grafana 的專家,也就是說,他們已經使用它多年,並且他們確切地知道如何正確地做到這一點。 他們已經寫了100遍並向大家解釋了這一點,但由於某種原因沒有人聽。

如果他們可以將這些知識直接放入 Grafana 中,以便其他用戶可以重用這些功能會怎麼樣? 如果他們需要計算可用內存的百分比,他們只需應用該函數即可。 如果導出器的創建者及其產品還提供了一組有關如何使用其指標的函數,因為他們確切地知道這些指標是什麼以及如何正確計算它們,該怎麼辦?

這實際上並不存在。 這是我自己做的。 這是 Grafana 中的庫支持。 假設製作 NodeExporter 的人做了我所說的事情。 他們還提供了一組功能。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

也就是說,它看起來像這樣。 您將此庫連接到 Grafana,然後進行編輯,它以 JSON 形式非常簡單地編寫瞭如何使用此指標。 也就是說,一些函數集、它們的描述以及它們會變成什麼。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

我認為這可能很有用,因為在 Grafana 中你會像那樣寫。 Grafana“告訴”你,某個庫中有某個函數——讓我們使用它。 我認為那會非常酷。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

關於 VictoriaMetrics 的一些信息。 我們做了很多有趣的事情。 閱讀我們關於壓縮的文章,關於我們與其他時間序列數據應用程序的競爭,關於如何使用 PromQL 的解釋,因為這方面仍然有很多初學者,以及關於垂直可擴展性和關於與 Thanos 的對抗。

“ExtendedPromQL”——羅曼·哈夫羅年科 (Roman Khavronenko) 的報告文字記錄

問題:

我將從一個簡單的生活故事開始我的問題。 當我第一次開始使用 Grafana 時,我編寫了一個非常引人注目的 5 行查詢。 最終結果是一個非常有說服力的圖表。 該計劃已基本投入生產。 但經過仔細檢查,結果發現這張圖表完全是無稽之談,與現實無關,儘管數字落在我們預期的範圍內。 還有我的問題。 我們有庫,我們有函數,但是我們如何為 Grafana 編寫測試呢? 您編寫了一個複雜的請求,業務決策取決於該請求 - 訂購真實的服務器容器或不訂購。 而且我們知道,這個繪製圖形的函數與事實類似。 謝謝。

謝謝你的提問。 有兩個部分。 首先,根據我的經驗,我的印像是,大多數用戶在查看圖表時並不理解他們所顯示的內容。 出於某種原因,人們非常善於為圖表中發生的任何異常找到藉口,即使它是函數內的錯誤。 第二部分 - 在我看來,使用此類函數將是解決問題的更好方法,而不是每個開發人員都進行自己的容量規劃並有一定概率犯錯誤。

如何檢查?

如何檢查? 可能不會。

作為 Grafana 中的測試。

Grafana 與它有什麼關係? Grafana 將此請求直接轉換為數據源。

添加一點參數。

不,Grafana 中沒有添加任何內容。 可能有 GET 參數,例如步驟。 它沒有顯式指定,但您可以覆蓋它,也可以不覆蓋它,但它會自動添加。 您不會在這裡編寫測試。 我認為我們不應該依賴 Grafana 作為這裡的事實來源。

感謝您的報告! 感謝您的壓縮! 您提到在圖表中映射變量,在 Grafana 中您不能在變量中使用變量。 你懂我的意思嗎?

是。

當我想在 Grafana 中創建警報時,這最初是一個令人頭痛的問題。 您需要分別為每個主機發出警報。 你做的這個東西,它對 Grafana 中的警報有用嗎?

如果 Grafana 沒有以不同的方式訪問變量,那麼是的,它會起作用。 但我的建議是根本不要在 Grafana 中使用警報,最好使用 Alertmanager。

是的,我使用它,但在 Grafana 中設置似乎更容易,但感謝您的建議!

來源: www.habr.com

添加評論