Prometheus 是一個很是優秀的監控工具。準確的說,應該是監控方案。Prometheus 提供了監控數據蒐集、存儲、處理、可視化和告警一套完整的解決方案。ios
Prometheus 架構以下:web
官網上的原始架構圖比上面這張要複雜一些,爲了集中你們的注意力,我只保留了最重要的組件。數據庫
Prometheus Server架構
Prometheus Server 負責從 Exporter 拉取和存儲監控數據,並提供一套靈活的查詢語言(PromQL)供用戶使用。app
Exporterwebapp
Exporter 負責收集目標對象(host, container…)的性能數據,並經過 HTTP 接口供 Prometheus Server 獲取。函數
可視化組件工具
監控數據的可視化展示對於監控方案相當重要。之前 Prometheus 本身開發了一套工具,不事後來廢棄了,由於開源社區出現了更爲優秀的產品 Grafana。Grafana 可以與 Prometheus 無縫集成,提供完美的數據展現能力。性能
Alertmanager測試
用戶能夠定義基於監控數據的告警規則,規則會觸發告警。一旦 Alermanager 收到告警,會經過預約義的方式發出告警通知。支持的方式包括 Email、PagerDuty、Webhook 等。
也許一些熟悉其餘監控方案的同窗看了 Prometheus 的架構會不覺得然,「這些功能 Zabbix、Graphite、Nagios 這類監控系統也都有,沒什麼特別的啊!」。
Prometheus 最大的亮點和先進性是它的多維數據模型,下節咱們重點介紹。
本節討論 Prometheus 的核心,多維數據模型。咱們先來看一個例子。
好比要監控容器 webapp1
的內存使用狀況,最傳統和典型的方法是定義一個指標 container_memory_usage_bytes_webapp1
來記錄 webapp1
的內存使用數據。假如每1分鐘取一次樣,那麼在數據庫裏就會有相似下面的記錄。
time | container_memory_usage_bytes_webapp1 |
---|---|
00:01:00 | 37738736 |
00:02:00 | 37736822 |
00:03:00 | 37723425 |
。。。 | 。。。 |
好,如今需求發生了點變化,咱們須要知道全部 webapp 容器的內存使用狀況。若是仍是採用前面的方法,就不得不增長新的指標 container_memory_usage_bytes_webapp2
、container_memory_usage_bytes_webapp3
…
像 Graphite 這類更高級的監控方案採用了更爲優雅的層次化數據模型。爲了知足上面的需求,Graphite 會定義指標 container.memory_usage_bytes.webapp1
、container.memory_usage_bytes.webapp2
、container.memory_usage_bytes.webapp3
…
而後就能夠用 container.memory_usage_bytes.webapp*
獲取全部的 webapp 的內存使用數據。
此外,Graphite 還支持 sum()
等函數對指標進行計算和處理,好比 sum(container.memory_usage_bytes.webapp*)
能夠獲得全部 webapp 容器佔用的總內存量。
目前爲止問題處理得都很好。但客戶老是會提出更多的需求:如今不只要按容器名字統計內存使用量,還要按鏡像來統計;或者想對比一下某一組容器在生產環境和測試環境中對內存使用的不一樣狀況。
固然你能夠說:只要定義更多的指標就能知足這些需求。好比 container.memory_usage_bytes.image1.webapp1
、container.memory_usage_bytes.webapp1.prod
等。
但問題在於咱們沒辦法提早預知客戶要用這些數據回答怎樣的問題,因此咱們沒辦法提早定義好全部的指標。
下面來看看 Prometheus 的解決方案。Prometheus 只須要定義一個全局的指標 container_memory_usage_bytes
,而後經過添加不一樣的維度數據來知足不一樣的業務需求。
好比對於前面 webapp1 的三條取樣數據,轉換成 Prometheus 多維數據將變成:
time | container_memory_usage_bytes_webapp1 |
container_name | image | env |
---|---|---|---|---|
00:01:00 | 37738736 | webapp1 | mycom/webapp:1.2 | prod |
00:02:00 | 37736822 | webapp1 | mycom/webapp:1.2 | prod |
00:03:00 | 37723425 | webapp1 | mycom/webapp:1.2 | prod |
... | ... |
後面三列 container_name
、image
、env
就是數據的三個維度。想象一下,若是不一樣 env
(prod、test、dev),不一樣 image
(mycom/webapp:1.二、mycom/webapp:1.3)的容器,它們的內存使用數據中標註了這三個維度信息,那麼將能知足不少業務需求,好比:
這裏只列了幾個例子,不過已經可以說明 Prometheus 數據模型的優點了:
user
維度,就能夠按用戶來統計容器內存使用量了。