書名: 深入淺出Prometheus:原理、應用、源碼與拓展詳解作者名: 陳曉宇 楊川胡 陳嘯編著本章字數: 1646字更新時間: 2019-06-19 15:57:29
第2章 深入Prometheus設計
2.1 指標
每種監控系統都有自己對指標的一套定義和規范,指標的數據格式將直接影響對數據的采集和存儲,所以定義指標時需要充分考慮通用性和擴展性。下面將詳細介紹Prometheus的指標定義、分類和樣本。
2.1.1 Prometheus的指標定義
Prometheus的所有監控指標(Metric)被統一定義為

指標定義涉及指標名稱和標簽這兩部分,下面分別對這兩部分進行講解。
1.指標名稱(metric name)
指標名稱用于說明指標的含義,例如http_request_total代表HTTP的請求總數。
指標名稱必須由字面、數值下畫線或者冒號組成,符合正則表達式[a-zA-Z_:][a-zA-Z0-9_:]*,其中的冒號指標不能用于exporter。
2.標簽(label)
標簽可體現指標的維度特征,用于過濾和聚合。它通過標簽名(label name)和標簽值(label value)這種鍵值對的形式,形成多種維度。
例如,對于指標 http_request_total,可以有{status="200",method="POST"}和{status="200",method="GET"}這兩個標簽。在需要分別獲取GET和POST返回200的請求時,可分別使用上述兩種指標;在需要獲取所有返回200的請求時,可以通過http_request_total{status="200"}完成數據的聚合,非常便捷和通用。
指標的某些標簽是以“__”開頭的,這些標簽是在Prometheus系統內部使用的。在形式上,http_request_total{status="200"} 和 {__name__="http_request_total",status="200"}代表相同的指標。Prometheus 指標采用標簽的方式能夠很好地與容器結合,無論是原生Docker還是Kubernetes,都通過標簽關聯資源。
2.1.2 Prometheus的指標分類
Prometheus指標分為Counter(計數器)、Gauge(儀表盤)、Histogram(直方圖)和Summary(摘要)這4類,下面對這4類進行講解。
1.Counter
Counter是計數器類型,它的特點是只增不減,例如機器啟動時間、HTTP訪問量等。
如圖2-1所示的HTTP請求總量隨著時間的推移只增不減。

圖2-1
Counter 具有很好的不相關性,不會因為機器重啟而置0。我們在使用 Counter指標時,通常會結合 rate()方法獲取該指標在某個時間段的變化率,例如,“HTTP請求總量”指標就屬于典型的Counter指標,通過對它進行rate()操作,可以得出請求的變化率,如圖2-2所示為HTTP的每秒請求數。

圖2-2
2.Gauge
Gauge是儀表盤,表征指標的實時變化情況,可增可減,例如CPU和內存的使用量、網絡 I/O 大小等,大部分監控數據都是 Gauge 類型的。如圖2-3所示是內存使用量監控圖,內存使用量隨著時間的推移不斷變化。

圖2-3
3.Summary
Summary 同 Histogram 一樣,都屬于高級指標,用于凸顯數據的分布狀況。如果需要了解某個時間段內請求的響應時間,則通常使用平均響應時間,但這樣做無法體現數據的長尾效應。例如,一個HTTP服務器的正常響應時間是30ms,但有很少幾次請求耗時3s,通過平均響應時間很難甄別長尾效應,這時可以通過Histogram或者Summary展現。Histogram和Summary這兩種指標類型在本質上是可以相互轉化的。
這里先了解一下數據分位:φ代表分位數,0≤φ≤1,分位數是在N個觀測值中按數量φ·N排序的觀測值。例如,0.9分位數代表第90%位置上的數,如果總數是100個,那么將是第90個數。
Summary是采樣點分位圖統計,用于得到數據的分布情況。例如,如果在要統計的班級中,有90%學生的成績低于93分,有95%學生的成績低于96分,則采用Summary能夠更好地展示數據的分布情況。
在Prometheus內部,Prometheus_tsdb_wal_fsync_duration_seconds指標的類型為Summary,它記錄了Prometheus Server中WAL寫入磁盤的同步時間:

從而得出有50%的同步時間低于0.012 352 463s,有90%的同步時間低于0.014 458 005s。
如圖2-4所示為HTTP請求耗時的分位圖,可以看到有90%的請求低于250ms。

圖2-4
我們可以將Summary看作客戶端分位,它的優勢是無須消耗服務端資源,但缺點也很明顯:首先,與 Histogram 采用 Counter 計數器統計的方式相比,Summary會消耗更多的資源;其次,通過Summary計算的指標不能再獲取平均數或者關聯其他指標等,所以Summary指標一般只適用于獨立的監控指標,例如垃圾回收時間等。
4.Histogram
Histogram反映了某個區間內的樣本個數,通過{le="上邊界"}指定這個范圍內的樣本數。Prometheus中表示每個本地存儲序列保存的chunk數量的指標prometheus_local_storage_series_chunks_persisted就屬于Histogram指標類型,如下所示:

可以看到,小于1.6384e+06個chunk的序列有260個,小于6.5536e+06個chunk的序列有780個。
2.1.3 Prometheus數據樣本
Prometheus采集的數據樣本都是以時間序列保存的,每個樣本都由三部分組成:指標、樣本值、時間戳。2.1.2節已經對指標進行了介紹。樣本值(64位浮點數)和時間戳(精確到 ms)的組合代表在這個時間點采集到的監控數值。可以將一個指標的樣本數據保存到一起,橫軸代表時間,縱軸代表指標序列,如圖2-5所示。

圖2-5
如圖2-5所示的每一行都代表由一個指標組成的時間序列,每個點都代表一個監控數值,這些時序數據首先被保存在內存中,然后被批量刷新到磁盤。在后面的章節中會詳細介紹指標存儲相關的內容。
- ExtGWT Rich Internet Application Cookbook
- Getting started with Google Guava
- Learning RxJava
- Learning Flask Framework
- Learning SQLite for iOS
- Visual Basic學習手冊
- Building Serverless Applications with Python
- 微信小程序入門指南
- Android移動開發案例教程:基于Android Studio開發環境
- OpenMP核心技術指南
- 微課學人工智能Python編程
- Arduino Wearable Projects
- Distributed Computing in Java 9
- UX Design for Mobile
- 大學計算機基礎實訓教程