Prometheus 從根本上來講將數據存儲爲時間序列。除了存儲的時間序列外,Prometheus可能會生成臨時派生的時間序列做爲查詢結果。Prometheus可與鍵值對配合使用。鍵以數值形式描述要測量的值,而值將實際測量值存儲爲數字。正則表達式
下面詳細介紹這幾部分:api
每一個時間序列都由其指標名稱和稱爲標籤的可選鍵值對做爲惟一標識。服務器
度量標準名稱指定所測量系統的通常功能(例如,http_requests_total-接收到的HTTP請求總數)。它能夠包含ASCII字母和數字以及下劃線和冒號。它必須匹配正則表達式(a-zA -Z _:] [a-zA-Z0-9 _:] *。函數
標籤啓用Prometheus的維度數據模型:具備相同度量標準名稱的標籤的任何給定組合都會標識該度量標準的特定維度實例(例如:全部使用POST方法到/api/tracks處理程序的HTTP請求)。查詢語言容許根據這些維度進行過濾和彙總。更改任何標籤值(包括添加或刪除標籤)都會建立一個新的時間序列。工具
PS:此處決定了咱們在存儲metrics的時候,應該刪除掉無用labels,以下降存儲壓力。
標籤名稱可能包含ASCII字母,數字和下劃線。網站
標籤值能夠包含任何Unicode字符。spa
Samples構成實際的時間序列數據,每一個樣本包括:code
Prometheus中,有兩種基本數據類型和兩種計算數據類型。blog
基本數據類型包括gauges 和 counters。計算數據類型包括histograms 和 summaries。事件
多是你可使用的最簡單的度量標準形式。計數器,顧名思義,是隨着時間的推移對元素進行計數。
例如,若是您要計算服務器上HTTP錯誤的數量或網站的訪問次數,則可能要使用一個計數器。
就像您在物理上想象的那樣,計數器只會增長或重置。
結果,計數器天然不能適應可能降低或負的值。
計數器特別適合於計算一段時間內某個事件的發生次數,即指標隨時間變化的速率。
Gauges用於處理可能隨時間下降的值。在視覺上,它們就像熱敏電阻:在任何給定的時間,若是您觀察到熱敏電阻,即可以看到當前的溫度值。
若是系統每5秒發送一次指標,而Prometheus每15秒拉取一次目標,則可能會丟失一些指標,若是對這些指標執行其餘計算,結果的準確性就會愈來愈差。
有了計數器,每一個值都會被彙總在其中,當Prometheus對其進行刮取時,將會知道在刮取間隔期間發送了一個值。
直方圖是一種更復雜的指標類型,它爲您的指標提供了更多信息,例如觀測值的總和和計數。
值被彙總到可配置上限的存儲桶中,這意味着使用直方圖,您能夠:
例如envoy關於請求消耗時間的統計:
# TYPE envoy_cluster_upstream_rq_time histogram envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="0.5"} 1 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="1"} 1 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="5"} 3 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="10"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="25"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="50"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="100"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="250"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="500"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="1000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="2500"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="5000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="10000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="30000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="60000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="300000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="600000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="1800000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="3600000"} 5 envoy_cluster_upstream_rq_time_bucket{envoy_cluster_name="http_service",le="+Inf"} 5
實際上,直方圖常常使用的場景也是:
匯老是直方圖的擴展,除了提供觀測值的總和和計數外,還提供滑動窗口上的分位數度量。
提醒一下,分位數是將機率密度劃分爲相等機率範圍的方法。
直方圖和彙總本質上是不一樣的。
直方圖聚合的值會隨時間變化,從而提供求和和計數功能,使您能夠輕鬆查看給定指標的演變。
另外一方面,彙總會在滑動窗口上顯示分位數(即隨着時間不斷髮展)。
Counter | Gauge | Histogram | Summary | |
---|---|---|---|---|
General | ||||
值是否能夠上下變化 | ✗ | ✓ | ✓ | ✓ |
是不是複雜數據類型(一個metric多個值) | ✗ | ✗ | ✓ | ✓ |
是一個近似值 | ✗ | ✗ | ✓ | ✓ |
Querying | ||||
可使用rate函數 | ✓ | ✗ | ✗ | ✗ |
能夠計算百分位數 | ✗ | ✗ | ✓ | ✓ |
可使用histogram_quantile函數查詢 | ✗ | ✗ | ✓ | ✗ |