Prometheus数据模型

Prometheus采用多维数据模型,底层存储为时间序列(time series)。时间序列由metric名称、一组key/value标签组成,同一组时间序具有相同的metric名称和标签组合。时间序的样本数据包含一个float64的值,以及毫秒级别的unix时间戳。

时间序的格式为:

<metric name>{<label name>=<label value>, …}

例如,metric名称为http_requests_total和标签为method=“POST” 和 handler="/messages" 的时间序可以这样写:

http_requests_total{method=“POST”, handler="/messages"} 100

数据模型

Prometheus的数据类型可分为Counter, Gauge, Histogram, Summary四种类型。

Counter

Counter是一个累积指标,用于表示单调增加的统计数据,其值在重启时被重置为零或只能递增。可以用Counter表示服务的请求数量,完成的任务或错误的数量,不能使用Counter来表示可以减少的值。

# HELP http_requests_total Counter of HTTP requests.
# TYPE http_requests_total counter http_requests_total{code=“200”,handler="/api/v1/query"} 7
http_requests_total{code=“400”,handler="/api/v1/query"} 2
http_requests_total{code=“200”,handler="/metrics"} 32

表示http_requests_total{code=“200”,handler="/api/v1/query"}的请求总数为7,http_requests_total{code=“200”,handler="/metrics"} 的请求总数为32.

  • 统计请求总数

可以对Counter进行聚合,例如统计 http_requests_total{handler="/api/v1/query"} 最近5分钟的请求总数,并且按handler聚合。

sum(increase(http_requests_total{handler="/api/v1/query"}[5m])) by (handler)

[]为范围向量选择器,[5m]表示选择5分钟内的数据,http_requests_total{handler="/api/v1/query"}[5m] 指返回http_requests_total{handler="/api/v1/query"} 5分钟内的数据,

http_requests_total{handler="/api/v1/query"}[5m]:

http_requests_total{code=“200”,handler="/api/v1/query"}
51 @1598945717.441
51 @1598945777.374
51 @1598945837.307
51 @1598945897.239
52 @1598945957.171
http_requests_total{code=“400”,handler="/api/v1/query"}
4 @1598945717.441
4 @1598945777.374
4 @1598945837.307
4 @1598945897.239
4 @1598945957.171

  • increase聚合范围向量

increase() 计算范围向量中时间序列的增加, increase(http_requests_total{ handler="/api/v1/query"}[5m])表示统计5分钟内的请求增量。

increase(http_requests_total{handler="/api/v1/query"}[5m]):

{code=“200”,handler="/api/v1/query"} 6.2570652695335145
{code=“400”,handler="/api/v1/query"} 0

  • sum按维度聚合

sum()聚合函数,sum(…) by (handler)保留hander维度,code维度的数据被聚合成一个值。

sum(increase(http_requests_total{handler="/api/v1/query"}[5m])) by (handler):

{handler="/api/v1/query"} 7.508415682577556

Gauge

Gauge表示可以上下浮动的数据,通常用于测量温度或当前内存使用情况等测量值。

# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 61

表示当前go协程的数量为61.

Histogram

Histogram生成直方图数据,需要预先设定统计桶,通常包含以下几个时间序:

  • 观察桶的累积计数器,<basename>_bucket{le="<upper inclusive bound>"}
  • 所有观察值的总和,<basename>_sum
  • 已观察到的事件数量,<basename>_count

例子:

# HELP prometheus_http_response_size_bytes Histogram of response size for HTTP requests.
# TYPE prometheus_http_response_size_bytes histogram
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“100”} 0
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“1000”} 0
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“10000”} 5
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“100000”} 5
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“1e+06”} 5
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“1e+07”} 5
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“1e+08”} 5
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le=“1e+09”} 5
prometheus_http_response_size_bytes_bucket{handler="/api/v1/label/:name/values",le="+Inf"} 5
prometheus_http_response_size_bytes_sum{handler="/api/v1/label/:name/values"} 8440
prometheus_http_response_size_bytes_count{handler="/api/v1/label/:name/values"} 5

prometheus_http_response_size_bytes 配置了以下几个统计桶:100,1000,10000,100000,1e+06,1e+07,1e+08,1e+09,+Inf,统计总数为5,总和为8440,数据具体分布情况在prometheus_http_response_size_bytes_bucket中。Histogram可以在服务端进行聚合,统计出分布百分位数,如统计出P90,P99等数据,但精度受配置的桶影响。

统计最近一小时内prometheus_http_response_size_bytes的P95:

histogram_quantile(0.95, rate(prometheus_http_response_size_bytes[1h]))

Summary

Summary在客户端统计出精确的百分位数据,Summary需要配置统计的百分位。和Histogram类似,通常包含了多个时间序列:

  • φ-quantiles(0 ≤ φ ≤ 1),<basename>{quantile="<φ>"}
  • 所有观察值的总和,<basename>_sum
  • 已观察到的事件数量,<basename>_count

例子:

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile=“0”} 2.43e-05
go_gc_duration_seconds{quantile=“0.25”} 3.97e-05
go_gc_duration_seconds{quantile=“0.5”} 5.91e-05
go_gc_duration_seconds{quantile=“0.75”} 0.0001494
go_gc_duration_seconds{quantile=“1”} 0.0016843
go_gc_duration_seconds_sum 0.1152793
go_gc_duration_seconds_count 1189

Histogram和Summary的对比

-HistogramSummary
必需的配置挑选适合于预期观察值范围的桶选择期望的φ-quantiles和滑动窗口
客户端性能观察值非常廉价,因为它们只需要增加计数器由于流式分位数计算,观察代价很高
服务端性能服务端必须计算分位数服务端成本低
时间序列数量(包括_sum和 _count序列)每个配置桶一个时间序列每个预配置的分位数一个时间序列
分位数误差桶的宽度影响分位数的误差精确的分位数
φ-quantile规范和滑动时间窗口Prometheus表达式由客户端预配置
聚合和滑动时间窗口Prometheus表达式通常不能聚合。

如果需要值的范围和分布,那么就选择直方图。如果需要精确的分位数,那么选择摘要图。

参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值