数据格式
Prometheus 从根本上来说将数据存储为时间序列。除了存储的时间序列外,Prometheus可能会生成临时派生的时间序列作为查询结果。Prometheus可与键值对配合使用。键以数值形式描述要测量的值,而值将实际测量值存储为数字。
下面详细介绍这几部分:
Metric names 和 labels
每个时间序列都由其指标名称和称为标签的可选键值对作为唯一标识。
度量标准名称指定所测量系统的一般功能(例如,http_requests_total-接收到的HTTP请求总数)。它可以包含ASCII字母和数字以及下划线和冒号。它必须匹配正则表达式(a-zA -Z _:] [a-zA-Z0-9 _:] *。
标签启用Prometheus的维度数据模型:具有相同度量标准名称的标签的任何给定组合都会标识该度量标准的特定维度实例(例如:所有使用POST方法到/api/tracks处理程序的HTTP请求)。查询语言允许根据这些维度进行过滤和汇总。更改任何标签值(包括添加或删除标签)都会创建一个新的时间序列。
PS:此处决定了我们在存储metrics的时候,应该删除掉无用labels,以降低存储压力。
标签名称可能包含ASCII字母,数字和下划线。
标签值可以包含任何Unicode字符。
Samples
Samples构成实际的时间序列数据,每个样本包括:
- 一个float64值
- 毫秒精度的时间戳
数据类型
Prometheus中,有两种基本数据类型和两种计算数据类型。
基本数据类型包括gauges 和 counters。计算数据类型包括histograms 和 summaries。
Counter
可能是你可以使用的最简单的度量标准形式。计数器,顾名思义,是随着时间的推移对元素进行计数。
例如,如果您要计算服务器上HTTP错误的数量或网站的访问次数,则可能要使用一个计数器。
就像您在物理上想象的那样,计数器只会增加或重置。
结果,计数器自然不能适应可能下降或负的值。
计数器特别适合于计算一段时间内某个事件的发生次数,即指标随时间变化的速率。
Gauges
Gauges用于处理可能随时间降低的值。在视觉上,它们就像热敏电阻:在任何给定的时间,如果您观察到热敏电阻,便可以看到当前的温度值。
如果系统每5秒发送一次指标,而Prometheus每15秒拉取一次目标,则可能会丢失一些指标,如果对这些指标执行其他计算,结果的准确性就会越来越差。
有了计数器,每个值都会被汇总在其中,当Prometheus对其进行刮取时,将会知道在刮取间隔期间发送了一个值。
Histogram
直方图是一种更复杂的指标类型,它为您的指标提供了更多信息,例如观测值的总和和计数。
值被汇总到可配置上限的存储桶中,这意味着使用直方图,您可以:
- 计算平均值:因为它们代表您的值总和除以记录的值数的分数。
- 根据您的值计算分数测量:这是一个非常强大的工具,因为它可以让您了解给定存储桶中有多少值遵循给定标准。当您要监视比例或建立质量指标时,这非常有用。
例如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
实际上,直方图经常使用的场景也是:
- http 请求耗时
- http 响应大小
Summaries
汇总是直方图的扩展,除了提供观测值的总和和计数外,还提供滑动窗口上的分位数度量。
提醒一下,分位数是将概率密度划分为相等概率范围的方法。
直方图和汇总本质上是不同的。
直方图聚合的值会随时间变化,从而提供求和和计数功能,使您可以轻松查看给定指标的演变。
另一方面,汇总会在滑动窗口上显示分位数(即随着时间不断发展)。
总结
Counter | Gauge | Histogram | Summary | |
---|---|---|---|---|
General | ||||
值是否可以上下变化 | ✗ | ✓ | ✓ | ✓ |
是否是复杂数据类型(一个metric多个值) | ✗ | ✗ | ✓ | ✓ |
是一个近似值 | ✗ | ✗ | ✓ | ✓ |
Querying | ||||
可以使用rate函数 | ✓ | ✗ | ✗ | ✗ |
可以计算百分位数 | ✗ | ✗ | ✓ | ✓ |
可以使用histogram_quantile函数查询 | ✗ | ✗ | ✓ | ✗ |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。