DevOps工程師或SRE工程師,可能都知道Prometheus普羅米修斯。Prometheus於2012年由SoundCloud創建,目前已經已發展為最熱門的分布式監控系統。Prometheus完全開源的,被很多雲廠商(架構)內置,在這些廠商(架構)中,可以簡單部署Prometheus,用來監控整個雲基礎架構設施。比如DigitalOcean或Docker都是普羅米修斯作為基礎監控。
希臘神話中,普羅米修斯是最具智慧的神明之一,是泰坦巨神后代,其名字意思為"先見之明",那么以該名字命名的監控系統究竟怎么樣呢?今天蟲蟲給大家講講這個以神之名命名的監控系統。

普羅米修斯(Prometheus)介紹
Prometheus是一個時間序列數據庫。但是,它不僅僅是一個時間序列數據庫。
它涵蓋了可以綁定的整個生態系統工具集及其功能。
Prometheus主要用於對基礎設施的監控。包括服務器,數據庫,VPS,幾乎所有東西都可以通過Prometheus進行監控。Prometheus希望通過對Prometheus配置中定義的某些端點執行的HTTP調用來檢索度量標准。

例如,如果我們以localhost:3000的Web應用程序為例,你的應用程序將在特定URL(例如localhost:3000/metrics)中將指標公開為純文本。以該URL為起點,,在給定的有效期間隔期間,Prometheus將從該目標中提取數據。
工作原理?
如前所述,Prometheus由各種不同的組件組成。其監控指標可以從系統中提取到,可以通過不同的方式做到:
通過應用程序給定監控項,對給定的公開URL上Prometheus兼容的指標。Prometheus將其定義為目標並加入監控系統。
通過使用雲廠商內置Prometheus程序,會定義好整個監控項和監控工具集擁。例如,可以 Linux機器監控模版(節點導出器),數據庫的模版(SQL導出器或MongoDB導出器),以及HTTP代理或者負載程序的模版(例如HAProxy導出器)等這些模版直接就可以加入監控並使用。
通過使用Pushgateway:應用程序或作業不會直接公開指標。某些應用程序要么沒有合適的監控模版(例如批處理作業),對他們選擇不能直接通過應用程序公開這些指標。如果我們忽略您可能使用Pushgateway的極少數情況,Prometheus是一個基於主動請求pull的監控系統。

推方式和拉方式
Prometheus與其他時間序列數據庫之間存在明顯差異:Prometheus主動篩選目標,以便從中檢索指標。這與InfluxDB非常不同,InfluxDB是需要直接推送數據給它。

基於推和基於拉方式各有其優劣之處。Prometheus使用主動拉方式主要的基於以下考慮:
實現集中控制:如果Prometheus向其目標發起查詢,則整個配置在Prometheus服務器端完成,而不是在各個目標上完成。Prometheus決定取值,以及取值的的頻率。
使用基於推的系統,可能會導致向服務器發送過多數據的風險,這時會使其服務器崩潰。基於拉的系統能夠實現速率控制,具有多級過期配置的靈活性,因此可以針對不同目標實現多種速率。
存儲匯總的指標
Prometheus不是基於事件的系統,這與其他時間序列數據庫不同。Prometheus並非旨在及時捕獲單個和時間事件(例如服務中斷),但它旨在收集有關的服務的預先匯總的指標。具體而言,它不會從Web服務發送404錯誤消息以及錯誤的消息的具體內容,而是對這些消息做處理、聚合過的指標。這與其他在收集"原始消息"的時間序列數據庫之間的基本差異
生態系統
Prometheus的主要功能仍然是時間序列數據庫。但是,在使用時間序列數據庫時,對它們實現了可視化、數據分析並通過自定義方式進行告警。
Prometheus生態系統有功能豐富工具集:
Alertmanager:Prometheus通過配置文件中定義的自定義規則將告警信息推送到Alertmanager。Alertmanager可以將其導出到多個端點,例如Pagerduty或Slack等。
數據可視化:與Grafana、Kibana等類似,可以直接在Web UI中可視化時間序列數據。輕松過濾查看了不通監控目標的信息。
服務發現:Prometheus可以動態發現監控目標,並根據需要自動廢棄目標。這在雲架構中使用動態變更地址的容器時,尤為方便。

普羅米修斯技術原理和構成
關鍵值數據模型
在開始使用Prometheus工具之前,了解數據模型非常重要。Prometheus使用鍵值對。鍵描述了測量值時將實際測量值存儲為數字的值。

注意:Prometheus並不會存儲原始信息,如日志文本,它存儲的是隨時間匯總的指標。
一般來說鍵也就監控度量。比如CPU使用百分比或內存使用量等。但是,如果想要獲得有關指標的更多詳細信息,該怎么辦?比如服務器CPU有四個核心,我們要想給它們分別設置指標怎么做?對此,Prometheus有一個標簽的概念。標簽旨在通過向其添加其他字段來為指標提供更詳細信息。你不需要簡單地描述CPU速率,你可以指定位於某個IP的核心CPU的CPU速率。也能通過標簽過濾指標並准確檢索查找的內容。
度量類型
Prometheus的監控指標有四種基本的類型來描述:
計數器Counter
計數器可能是我們可以使用的最簡單的度量標准形式。就想它字面意思一樣,計數器是隨着時間的增長的計算元素。
比如,要計算服務器上的HTTP錯誤數或網站上的訪問次數,這時候就使用計數器。
計數器的值只能增加或重置為0。計數器特別適合計算某個時段上某個事件的發生次數,即指標隨時間演變的速率。
Gauges
Gauges用於處理可能隨時間減少的值。比如溫度本華,內存變化等。Gauge類型的值可以上升和下降,可以是正值或負值。
如果系統每5秒發送一次指標,Prometheus每15秒抓取一次目標,那么這期間可能會丟失一些指標。如果對這些指分析計算,則結果的准確性會越來越低。
而使用計數器,每個值都會被匯總計算。
直方圖Histogram
直方圖是一種更復雜的度量標准類型。它為我們的指標提供了額外信息,例如觀察值的總和及其數量,常用於跟蹤事件發生的規模。其值在具有可配置上限的存儲對象中聚合。使用直方圖可以用來:
計算平均值:因為它們表示值的總和除以記錄的值的數量。
計算值的小數測量:這是一個非常強大的工具,可以讓我們知道給定的集合中有多少值遵循給定的標准。在用於監控比例或建立質量指標時,這非常有用。
比如,為了監控性能指標,我們希望得到在有20%的服務器請求響應時間超過300毫秒發送警告。對於涉及比例的指標就可以考慮使用直方圖。
摘要Summary
摘要是對直方圖的擴展。除了提供觀察的總和和計數之外,它們還提供滑動窗口上的分位數度量。分位數是將概率密度划分為相等概率范圍的方法。
對比直方圖:
直方圖隨時間匯總值,給出總和和計數函數,使得易於查看給定度量的變化趨勢。
而摘要則給出了滑動窗口上的分位數(即隨時間不斷變化)。
這對於獲得代表隨時間記錄的值的95%的值尤其方便。
實例計算
隨着分布式架構的不會發展完善和雲解決方案的普及,現在的架構不再是孤零零幾台配置很高的IBM小機就可以搞定一起的時代了。
分布式的服務器復制和分發成了日常架構的必備組件。我們舉一個經典的Web架構,該架構由2個HAProxy代理服務器,在3個后端Web服務器。在該實例中,我們要監視Web服務器返回的HTTP錯誤的數量。
使用Prometheus語言,單個Web服務器單元稱為實例。該任務是計算所有實例的HTTP錯誤數量。

PromQL
如果使用過基於InfluxDB的數據庫,你可能會熟悉InfluxQL。或者使用TimescaleDB過的SQL語句。Prometheus也內置了自己的SQL查詢語言,用於便捷和熟悉的方式從Prometheus查詢和檢索數據,這個內置的語言就是PromQL。
我們前面說過,Prometheus數據是用鍵值對表示的。PromQL也用相同的語法查詢和返回結果集。
使用Prometheus和PromQL,會處理兩種向量:
即時向量:表示在最近時間戳中跟蹤的指標。
時間范圍向量:用於查看度量隨時間的演變,可以使用自定義時間范圍查詢Prometheus。結果是一個向量聚合所選期間記錄的值。

PromQL API公開了一組方便查詢數據操作的函數。用它可以實現排序,數學函計算(如導數或指數函數),統計預測計算(如Holt Winters函數)等。
Instrumentation儀表化
儀表化是Prometheus的一個重要組成部分。在從應用程序檢索數據之前,必須要儀表化它們。Prometheus術語中的儀表化表示將客戶端類庫添加到應用程序,以便它們向Prometheus吐出指標。可以對大多數主流的編程語言(比如Python,Java,Ruby,Go甚至Node或C#應用程序)進行儀表化。
在儀表化操作時,需要創建內存對象(如儀表或計數器),可以在運行中增加或減少。然后選擇指標公開的位置。Prometheus將從該位置獲取並存儲到時間序列數據庫。

Exporters模版
對於自定義應用程序,儀表化非常方便,它允許自定義公開的指標以及其隨時間的變化方式。
對於一些廣泛使用的應用程序,服務器或數據庫,Prometheus提供專門的應用模版,可以使用它們來監控目標。
這些模版很多都用Docker鏡像,可以輕松配置以監控目標。他們會預設常用的的指標和面板,可以幾分鍾內就完成監控配置。
常見的Exporters模版有:
數據庫模版:用於MongoDB數據庫,SQL服務器和MySQL服務器的配置。
HTTP模版:用於HAProxy,Apache或NGINX等web服務器和代理的配置。
Unix模版:用來使用構建的節點導出程序監視系統性能,可以實現完整的系統指標的監控。

告警
在處理時間序列數據庫時,我們希望對數據進行處理,並對結果給出反饋,而這部分工作有告警來實現。
告警在Grafana中非常常見,Prometheus也通過Alertmanager實現完成的告警系統。Alertmanager是一個獨立的工具,可以綁定到Prometheus並運行自定義Alertmanager。告警通過配置文件定義,定義有一組指標定義規則組成,如果數據命中這些規則,則會觸發告警並將其發送到預定義的目標。與Grafana類似,Prometheus的告警,可以通過email,Slack webhooks,PagerDuty和自定義HTTP目標等。
原文:https://baijiahao.baidu.com/s?id=1634686679128300208&wfr=spider&for=pc&isFailFlag=1
