分享技術Prometheus監控神器

2021-10-24 10:24:42 字數 4248 閱讀 9538

如上圖所示,對於線上環境我們可能會劃分為:dev, stage, prod不同的集群。每乙個集群執行多個主機節點,每個伺服器節點上執行乙個node exporter例項。node exporter例項會自動註冊到consul中,而prometheus則根據consul返回的node exporter例項資訊動態的維護target列表,從而向這些target輪詢監控資料。

然而,如果我們可能還需要:

按照不同的環境dev, stage, prod聚合監控資料?

對於研發團隊而言,我可能只關心dev環境的監控資料,如何處理?

如果為每乙個團隊單獨搭建乙個prometheus server。那麼如何讓不同團隊的prometheus server採集不同的環境監控資料?

面對以上這些場景下的需求時,我們實際上是希望prometheus server能夠按照某些規則(比如標籤)從服務發現註冊中心返回的target例項中有選擇性的採集某些exporter例項的監控資料。

接下來,我們實驗如何通過prometheus強大的relabel機制來實現以上這些具體的目標。

prometheus的relabeling機制

在prometheus所有的target例項中,都包含一些預設的metadata標籤資訊。可以通過prometheus ui的targets頁面中檢視這些例項的metadata標籤的內容:

image

預設情況下,當prometheus載入target例項完成後,這些target時候都會包含一些預設的標籤:

__param_:採集任務目標服務的中包含的請求引數

上面這些標籤將會告訴prometheus如何從該target例項中獲取監控資料。除了這些預設的標籤以外,我們還可以為target新增自定義的標籤,例如,在「基於檔案的服務發現」小節中的示例中,我們通過json配置檔案,為target例項新增了自定義標籤env,如下所示該標籤最終也會儲存到從該例項採集的樣本資料中:

node_cpu

一般來說,target以__作為前置的標籤是在系統內部使用的,因此這些標籤不會被寫入到樣本資料中。不過這裡有一些例外,例如,我們會發現所有通過prometheus採集的樣本資料中都會包含乙個名為instance的標籤,該標籤的內容對應到target例項的__address__。 這裡實際上是發生了一次標籤的重寫處理。

這種發生在採集樣本資料之前,對target例項的標籤進行重寫的機制在prometheus被稱為relabeling。

image

prometheus允許使用者在採集任務設定中通過relabel_configs來新增自定義的relabeling過程。

使用replace/labelmap重寫標籤

relabeling最基本的應用場景就是基於target例項中包含的metadata標籤,動態的新增或者覆蓋標籤。例如,通過consul動態發現的服務例項還會包含以下metadata標籤資訊:

__meta_consul_dc:consul服務所在的資料中心

__meta_consulmetadata:服務的metadata

__meta_consul_node:consul服務node節點的資訊

__meta_consul_service_id:服務id

__meta_consul_service_port:服務埠

__meta_consul_service:服務名稱

__meta_consul_tags:服務包含的標籤資訊

在預設情況下,從node exporter例項採集上來的樣本資料如下所示:

node_cpu 93970.8203125

我們希望能有乙個額外的標籤dc可以表示該樣本所屬的資料中心:

node_cpu 93970.8203125

在每乙個採集任務的配置中可以新增多個relabel_config配置,乙個最簡單的relabel配置如下:

scrape_configs:

source_labels: ["__meta_consul_dc"]

target_label: 「dc」

該採集任務通過consul動態發現node exporter例項資訊作為監控採集目標。在上一小節中,我們知道通過consul動態發現的監控target都會包含一些額外的metadata標籤,比如標籤__meta_consul_dc表明了當前例項所在的consul資料中心,因此我們希望從這些例項中採集到的監控樣本中也可以包含這樣乙個標籤,例如:

node_cpu

這樣可以方便的根據dc標籤的值,根據不同的資料中心聚合分析各自的資料。

在這個例子中,通過從target例項中獲取__meta_consul_dc的值,並且重寫所有從該例項獲取的樣本中。

完整的relabel_config配置如下所示:

[ source_labels: 『[』 [, …] 『]』 ]

[ separator: | default = ; ]

[ target_label: ]

[ regex: | default = (.*) ]

[ modulus: ]

[ replacement: | default = $1 ]

[ action: | default = replace ]

其中action定義了當前relabel_config對metadata標籤的處理方式,預設的action行為為replace。 replace行為會根據regex的配置匹配source_labels標籤的值(多個source_label的值會按照separator進行拼接),並且將匹配到的值寫入到target_label當中,如果有多個匹配組,則可以使用$, $確定寫入的內容。如果沒匹配到任何內容則不對target_label進行重新。

repalce操作允許使用者根據target的metadata標籤重寫或者寫入新的標籤鍵值對,在多環境的場景下,可以幫助使用者新增與環境相關的特徵維度,從而可以更好的對資料進行聚合。

除了使用replace以外,還可以定義action的配置為labelmap。與replace不同的是,labelmap會根據regex的定義去匹配target例項所有標籤的名稱,並且以匹配到的內容為新的標籤名稱,其值作為新標籤的值。

例如,在監控kubernetes下所有的主機節點時,為將這些節點上定義的標籤寫入到樣本中時,可以使用如下relabel_config配置:

而使用labelkeep或者labeldrop則可以對target標籤進行過濾,僅保留符合過濾條件的標籤,例如:

relabel_configs:

在上一部分中我們介紹了prometheus的relabeling機制,並且使用了replace/labelmap/labelkeep/labeldrop對標籤進行管理。而本節開頭還提到過第二個問題,使用中心化的服務發現註冊中心時,所有環境的exporter例項都會註冊到該服務發現註冊中心中。而不同職能(開發、測試、運維)的人員可能只關心其中一部分的監控資料,他們可能各自部署的自己的prometheus server用於監控自己關心的指標資料,如果讓這些prometheus server採集所有環境中的所有exporter資料顯然會存在大量的資源浪費。如何讓這些不同的prometheus server採集各自關心的內容?答案還是relabeling,relabel_config的action除了預設的replace以外,還支援keep/drop行為。例如,如果我們只希望採集資料中心dc1中的node exporter例項的樣本資料,那麼可以使用如下配置:

scrape_configs:

source_labels: ["__meta_consul_dc"]

regex: 「dc1」

action: keep

當action設定為keep時,prometheus會丟棄source_labels的值中沒有匹配到regex正規表示式內容的target例項,而當action設定為drop時,則會丟棄那些source_labels的值匹配到regex正規表示式內容的target例項。可以簡單理解為keep用於選擇,而drop用於排除。

使用hashmod計算source_labels的hash值

當relabel_config設定為hashmod時,prometheus會根據modulus的值作為係數,計算source_labels值的hash值。例如:

scrape_configs

根據當前target例項__address__的值以4作為係數,這樣每個target例項都會包含乙個新的標籤tmp_hash,並且該值的範圍在1~4之間,檢視target例項的標籤資訊,可以看到如下的結果,每乙個target例項都包含了乙個新的tmp_hash值:

利用hashmod的能力在target例項級別實現對採集任務的功能分割槽的:

scrape_configs:

直播 Prometheus架構與實踐分享

分享時間 9月17日 20 30 分享主題 prometheus架構與實踐分享 分享人介紹 陳曉宇,宜信容器雲架構師,負責宜信paas平台的設計和推廣,推進企業從傳統應用遷移至雲原生。參與多個社群開源專案 openstack kubernetes harbor等 參與編寫 深入淺出prometheu...

mysql可以分享的技術 技術分享 MySQL

1 查詢語句是如何執行的?1 連線 1 建立連線 2 驗證許可權,修改了許可權,建立新的連線才會生效。3 sql執行的臨時記憶體 2 查詢快取 1 先查詢快取,更新操作會導致所有快取失效。2 mysql 8.0功能去掉 3 分析 詞法解析,語法解析 4 優化 1 決定使用哪個索引,比方說根據統計資訊...

Android技術分享

android開發必看知識,不看後悔 打包為大家奉上最實用最給力的資源,不看你絕對後悔。最強大的ui特效 奇藝高畫質ui 介面源 搜尋關鍵字飛入飛出效果 水波紋效果,附工程原始碼 效果很好很逼真 特效!超牛x launcher特效 仿360 一鍵優化動畫效果 功能強大的拼圖人生原始碼 最火爆的精品例...