iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
DevOps

時間序列資料庫探討 - Prometheus系列 第 19

Prometheus - 各模組的 Goroutine 使用情形

  • 分享至 

  • xImage
  •  

前篇提問

  • config 裡可設定的參數會影響哪些模組?重載 config 時會發生什麼事?
  • Prometheus Server 啟動時,各模組初始化順序是怎樣的?分別有哪些初始化工作?
  • Prometheus Server 的運行過程中,有哪些模組會產生 goroutine?
  • 各模組產生的 goroutine 遇到 timeout 或錯誤時,會如何處理?

本篇來回答各模組使用 goroutine 的情形。

goroutine 說明

Golang 的 goroutine 是一種輕量級的執行緒,由 Golang 的 runtime 管理排程。可以參考教學
這裡主要討論非同步處理時所用到的 goroutine。這些 goroutine 會持續佔有資源(如 stack),等待 Golang 的 channel 傳來事件時,才會被排程執行。

這在事件驅動的系統的實作上非常方便,例如 Prometheus Server 的 Service Discovery Manager 聽取標的的變化,有變化時就可以透過 channel 觸發其他模組更新。另外許多定時觸發的事件也是透過 goroutine 和 channel 實作。

Prometheus Server 的 goroutine

Service Discovery Manager

discover.Manager 運行時,有兩種 goroutine

  • providers(如 kuburnetes, fileSD...)
    • 每個 provider 有獨自的 goroutine,負責聽取對應的標的變化。有變化時觸發 sender。
  • sender
    • 聽取任何 provider 的標的變化,若有變化則重新整理完整標的列表,並發送到 syncCh。供 scrapeManager 使用。

notifier.Manager 的 goroutine

notifier.Manager 運行時,有兩種 goroutine

  • target update
    • 聽取 Alert 發送對象的變化,若有變化則更新 target 列表。
  • sendLoop
    • 聽取 Send(\*Alert)(由 rules.Manager 呼叫)所發送的 Alert。發送時每個對象又會產生一個單獨的 goroutine 負責發送。

rules.Group 和 rules.Manager 的 goroutine

rules.Manager 運行時,沒有持久的 goroutine。但是每個 rules.Group 都佔一個 goroutine 負責

  • 定時觸發 Eval,逐一計算所有規則的結果。
  • 聽取 rules.Group 消滅的訊號。
    rules.Group 的建立和消滅都是由 rules.Manager.Update 導致,只會發生在重載 config 時。

scrape.Manager 的 goroutine

scrape.Manager 運行時,有一 goroutine 負責

  • 聽 Service Discovery Manager 的 syncCh,並更新標的列表。
    而每個標的 Group 都有一 goroutine 負責
  • 定時觸發 scrape,並將結果放入 scrape.Result
  • 聽取標的 Group 消滅的訊號。

remote.Storage 的 goroutine

remote.Storage 運行時,會將 localStorage 的 wal 資料全部傳到設定的 http 位址。然後 wal 的資料增加速度快,為了確保傳的速度能跟上資料增加的速度,Prometheus 會將 wal 資料分包傳送,所以有一 goroutine 負責

  • 計算 shard(分的包數)數量的變化,並更新 shard 列表。
    而每個 shard 都有一 goroutine 負責
  • 定時觸發傳送。
  • 聽取 shard 消滅的訊號。

tsdb (localStorage) 的 goroutine

  • tsdb 運行時,有不同 goroutine 負責
    • 定時觸發 wal 的 checkpoint。
    • 將 chunk 寫入 disk,包括合併的 chunk 和新的 chunk)
    • 將新資料寫入 wal。
    • 更新 wal 的時間戳。

web.Handler 的 goroutine

web.Handler 運行時,並不會產生 goroutine。但是每個 request 會產生一 goroutine 負責處理。


上一篇
Prometheus - 程式初始化和啓動流程
下一篇
Prometheus - 非同步流程的錯誤處理
系列文
時間序列資料庫探討 - Prometheus30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言