圖解 | 監控系統 Prometheus 的原理
本篇將會以圖解的方式剖析 Prometheus 的原理。本文主要內容如下:
一、Prometheus 是什么?
ELK Stack 日志收集和檢索平臺想必大家應該比較熟悉,Elasticsearch + Filebeat + Logstash + Kibana。
ELK 架構
而 Prometheus 就相當于一整個 ELK,但是它其實并不是適合存儲大量日志,也不適合長期存儲(默認存儲 15 天)。它的優勢是查看最近的趨勢數據,以及告警機制。下圖是 Prometheus 架構圖:
Prometheus architecture,來自官網
Prometheus 它是從應用程序中實時獲取時間序列數據,然后通過功能強大的規則引擎,幫助你識別監控環境所需的信息。
Prometheus作為一個基于度量的系統,不適合存儲事件或者日志等,它更多地展示的是趨勢性的監控。如果用戶需要數據的精準性,可以考慮ELK或其他日志架構。
Prometheus 特點
- 一款開源監控工具。
- 基于時間序列數據庫TSDB存儲,golang 實現
- Soundcloud 公司研發,源于谷歌borgmon
- 多維度(標簽)
- 使用拉模式(Pull-based) 獲取數據
- 白盒&黑盒的監控都支持,DevOps友好
- Metrics & Alert模式,不是 loggging/tracing
- 社區生態豐富(多語言,各種exporters)
- 單機性能
消費百萬級時間序列
支持上千個 targets
Prometheus 的不足
Prometheus 主要針對性能和可用性監控,不適用于針對日志(Log)、事件(Event)、調用鏈(Tracing)等的監控。
關注的是近期的數據,默認存儲 15 天的監控數據。
二、Prometheus 指標收集
下圖是 Prometheus WebUI 界面,里面展示了 Targets 和 Endpoint,說明了當前哪些目標服務是可以被 Prometheus 抓取的。
- Endpoint:端點,可以抓取的指標來源。
- Target:目標,包含了端點地址,端口的狀態等信息。
下面是 Prometheus 抓取目標的配置:
Job:代表了一組相同角色或功能的目標。
Instance:在當前主機上運行的 exporter 監控程序被稱為一個實例。
抓取到目標的指標數據后,會生成時間序列數據,然后存儲在 Prometheus 服務器本地,也可以設置從服務器發送數據到外部存儲器或其他時間序列數據庫。
三、Prometheus 采集方式
Prometheus 抓取數據可以通過直接采集和間接采集兩種。
直接采集和簡介采集
直接采集就是埋點式的,比如你自己的應用程序用 Prometheus 客戶端的代碼自己去埋點。比如 etcd、kubenetes、docker 這種就是直接采集,它已經將埋點埋好了,把 metrics 斷點暴露出來了。這些就是對 Prometheus 友好的,已經埋好點了,直接用 Prometheus 抓取就好了。
但是對于一些黑盒系統,比如操作系統、Redis、MySQL 這種,它們是成熟的產品,我們一般不會拿過來改,這種時候我們一般采用間接采集的方式。
四、Exporter 監控程序
當 Prometheus 使用間接采集的方式時,需要用到 Exporter,中文翻譯過來就是出口商,我們可以理解為將數據從內部導出來。
Exporter 是 Prometheus 中的一個概念,類似一個邊車或者 Agent,如下圖所示。
間接采集方式中的 exporter
Exporter 它用來對黑盒系統進行采集,它會從黑盒中抓取數據,然后將 metrics 端點暴露出來供 Prometheus 抓取。Prometheus 就可以間接的通過 Exporter 抓取這些 target 上的數據。
Exporter本質上是將收集的數據轉化為對應的文本格式,并提供 HTTP 接口,供 Prometheus 定期采集數據。
Exporter 有很多,比如針對操作系統的 Node-Exporter,對于 MySQL 的 mysql-exporter 等等
Linux 服務器內部部署了一個 node-exporter 服務,來收集 Linux 服務器上的磁盤、內存等數據。然后暴露了一個端口,Prometheus 通過這個端口來抓取數據。
而 MySQL 服務器上的 mysql-exporter 也是類似,mysql-exporter 其實不必部署到要監控的 MySQL 服務器上,可以獨立部署到不同機器上。
從 Prometheus 的客戶端界面上也可以看到正在抓取哪些 Targets,而這些 targets 都是通過 exporter 暴露端口的。
從這個官網鏈接中看到很多 Exporter
五、PromQL
PromQL 看名字很 SQL 很像,它其實是另外一種查詢語言。
Prometheus提供了一種功能強大的表達式語言 PromQL(Prometheus Query Language)。PromQL允許用戶實時選擇和匯聚時間序列數據,是 Prometheus 自己開發的數據查詢 DSL(領域特定語言),使用這個查詢語言能夠進行各種聚合、分析和計算,使管理員能夠根據指標更好地了解系統性能。
如下圖所示,PromQL 內置在 Prometheus 中。通過 Prometheus WebUI、Grafana 和 API Clients 來進行查詢。
下面是 Prometheus WebUI 界面:
下面是 Grafana 的界面,通常我們會配合 Grafana 一起來監控。
六、監控告警
發送告警
Prometheus 告警規則觸發后,告警規則被觸發后,才會將信息發送給獨立組件 Alertmanager 上,經過對告警的處理后,最終通過接收器(如Email)通知用戶。(告警規則是在 Prometheus server 端定義的)
告警的原理圖
在 Prometheus 監控體系中,指標的采集存儲與告警是分開的。
我們使用 Prometheus server 采集各類監控指標,然后基于PromQL對這些指標定義閾值告警規則(Rules)。
Prometheus server對告警規則周期性地進行計算,如果滿足告警觸發條件,便生成一條告警信息,并將其推送到Alertmanager組件。
收到告警信息后,Alertmanager會處理告警,進行分組(grouping)并將它們路由(routing)到正確的接收器(receiver),如Email、釘釘等,最終把異常事件的通知發送給接收者。
七、總結
通過圖解的方式,分別介紹了 Prometheus 的優勢和劣勢、指標收集、采集方式、Exporter、PromQL、監控告警,希望能給大家云原生的監控之路上帶來一些啟發~