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