Prometheus 是雲原生監控領域的事實標準,愈來愈多的開源項目開始支持 Prometheus 監控數據格式。從本篇開始,我將和你們一塊兒閱讀分析 Prometheus 源碼。學習 Prometheus 的設計理念,瞭解 Prometheus 的侷限性與不足。本系列分八個板塊逐一拆解 Prometheus 源碼。本文基於 Prometheus v2.13.0。html
Prometheus 是基於時序數據庫(Time Series Database, TSDB)的監控告警系統。Prometheus 在 2016 年加入 CNCF 基金會,成爲繼 Kubernetes 後第二個畢業項目,其火熱程度可見一斑。相比於傳統的監控方案,Prometheus 有如下幾個優點:git
Prometheus 將監控指標以時序數列的格式存儲在時序數據庫 TSDB 中。相比於傳統的關係型數據庫,時序數據庫便於對已有數據進行聚合;在高併發的狀況下,讀寫性能也遠高於關係型數據庫。Prometheus 2.0 版本重構了底層時序存儲引擎。目前,單個 Prometheus 服務器能夠作到每秒存儲百萬條指標數據,同時佔用磁盤空間也很小github
Prometheus 有獨立的 PromQL 查詢語言,另外還提供了不少內置的基於時間的處理函數,下降數據聚合的難度web
Prometheus 採用拉模型收集時序數據,數據拉取行爲是由服務端來決定的。服務端能夠經過某種服務發現機制來自動發現監控對象。而對於推模型的監控系統,客戶端須要負責在服務端上進行註冊及監控數據推送,這在微服務架構裏實現起來比較難的。當大量客戶端向服務的主動推送數據時,服務端的壓力較大正則表達式
Kubernetes 自己的指標也是以 Prometheus 格式暴露出來的sql
OpenMetrics:Prometheus 的數據格式逐漸成爲一種標準。OpenMetrics 正在從 Prometheus 的數據格式中分離出來,逐漸成爲監控數據格式的國際標準數據庫
Thanos:支持數據存儲的可伸縮,彌補 Prometheus 數據持久化方面的不足Prometheus設計模式
Prometheus Operator:簡化 Prometheus 配置管理api
圖的左邊開始是監控數據源。任何應用服務想要接入 Prometheus,都須要提供 HTTP 接口(一般是 x.x.x.x/metrics 地址),並暴露 Prometheus 格式的監控數據。Prometheus Server 經過 HTTP 協議週期性抓取監控目標的監控數據、打時間戳、存儲到本地。Prometheus 提供了 Client 庫幫助開發人員在本身的應用中集成符合 Prometheus 格式標準的監控指標。服務器
而對於不適合直接在代碼中集成 Client 庫的場景,好比應用來自第三方、不是由本身維護,應用不支持 HTTP 協議,那就須要爲這些場景單獨編寫 Exporter 程序。Exporter 做爲代理,把監控數據暴露出來。好比 Mysql Exporter,Node Exporter。
Prometheus 將採集到的數據存儲在本地時序數據庫中,但缺乏數據副本。這也是 Prometheus 自身在數據持久化方面作的不足的地方。但這些存儲問題都有其餘的解決方案,Prometheus 支持 remote write 方式將數據存儲到遠端。
Prometheus 支持經過 Kubernetes、靜態文本、Consul、DNS 等多種服務發現方式來獲取抓取目標(targets)。最後,用戶編寫 PromQL 語句查詢數據並進行可視化。
Prometheus 的功能由多個互相協做的組件共同完成。這些組件也即本文開頭所列出的模塊,好比 Service Discovery Manager。咱們後續會逐一介紹。Prometheus 源碼入口 main() 函數 完成參數初始化工做,並依次啓動各依賴組件。
首先,main 函數解析命令行參數(詳見附錄 A),並讀取配置文件信息(由 --config.file 參數提供)。Prometheus 特別區分了命令行參數配置(flag-based configuration)和文件配置(file-based configuration)。前者用於簡單的設置,而且不支持熱更新,修改須要啓停 Prometheus Server 一次;後者支持熱更新。
main 函數完成初始化、啓動全部的組件。這些組件包括:Termination Handler、Service Discovery Manager、Web Handler 等。各組件是獨立的 Go Routine 在運行,之間又經過各類方式相互協調,包括使用 Synchronization Channel、引用對象 Reference、傳遞 Context(Context 包的使用能夠參考做者的 《Golang Context 包詳解》一文)。
這些 Go Routine 的協做使用了 oklog/run 框架。oklog/run 是一套基於 Actor 設計模式的 Go Routine 編排框架,實現了多個 Go Routine 做爲統一總體運行並有序依次退出。這在不少開源項目中都有使用,進一步瞭解可參考做者的另外一篇文章《Go routine 編排框架:oklog/run 包》
「K8S 技術落地實踐」Prometheus 在 K8S 上的監控實踐 來自本文做者在杭州容器 Meetup 的分享
Prometheus Internal architecture
參數名 | 解釋 |
---|---|
config.file | 配置文件的位置,包含抓取監控對象列表(用於服務發現)和 recording rules 文件位置 |
web.listen-address | Prometheus server 端監聽請求(API 請求、Dashboard 界面)的地址和端口,默認本地端口 9090 |
web.read-timeout | 設置 Prometheus server 讀取客戶端請求的超時時間。以此來避免客戶端因超慢的寫操做,長時間佔用連接資源。ReadTimeout 覆蓋了從鏈接請求被接受到請求報文被徹底讀取的時間。默認 5m |
web.max-connections | 最大鏈接數,默認 512 |
web.external-url | 設置 Prometheus 對外的 URL。須要設置外部訪問的 Prometheus 一般由於啓用了反向代理。若是 external-url 包含路徑,則 Prometheus 全部對外的接口,都會帶上該路徑做爲前綴。eg. http://<host>:<port>/<path>/api/v1/query?query=up |
web.route-prefix | 用於替換 external-url 的路徑前綴,eg. http://<host>:<port>/<route-prefix>/api/v1/query?query=up |
web.user-assets | 網頁靜態 asset 文件夾路徑 |
web.enable-lifecycle | 開啓後,能夠實現經過請求 /-/reload 熱加載更新配置,默認 false |
web.enable-admin-api | 開啓後,容許使用一些管理員級別的 api,包括刪除時間序列等,/api/v1/admin/tsdb/delete_series 。默認 false |
web.console.templates | Prometheus Console 網站模板文件夾路徑 |
web.console.libraries | Prometheus Console 使用的庫路徑 |
web.page-title | Console 頁面標題 |
web.cors.origin | 設置 Prometheus 服務端容許的域,用正則表達式表示。eg. https?://(domain*)\.com |
storage.tsdb.path | 監控數據存儲路徑,默認 data/ |
storage.tsdb.min-block-duration | 設置數據塊最小時間跨度,默認 2h 的數據量。監控數據是按塊(block)存儲,每個塊中包含該時間窗口內的全部樣本數據(data chunks) |
storage.tsdb.max-block-duration | 設置數據塊最大時間跨度,默認爲最大保留時間的 10% |
storage.tsdb.wal-segment-size | 設置 WAL 分段存儲每一個分段的大小。默認 128MB |
storage.tsdb.retention.time | 監控數據最大保留時間,默認 15d |
storage.tsdb.no-lockfile | 不在數據存儲目錄中建立文件鎖 |
storage.tsdb.wal-compression | 開啓後,會對 WAL 文件進行壓縮(成本是帶來 CPU 開銷)。默認 false |
storage.remote.flush-deadline | |
storage.remote.read-sample-limit | 一次最多從遠端存儲中讀取採樣數據量,默認 5e7 條,0 表示無限制 |
storage.remote.read-concurrent-limit | 最大併發讀,默認 10 個請求,0 表示無限制 |
rules.alert.for-outage-tolerance | |
rules.alert.for-grace-period | |
rules.alert.resend-delay | |
alertmanager.notification-queue-capacity | |
alertmanager.timeout | |
query.lookback-delta | 在計算 PromQL 表達式結果時,最大回看時間 |
query.timeout | 查詢超時時間 |
query.max-concurrency | 最大併發處理查詢請求數,默認 20 個請求 |
query.max-samples | 能載入到內存中最大采樣數據量,默認 5e7 條 |
原文出處:https://www.cnblogs.com/huanggze/p/11732472.html