数据模型
Prometheus 的数据模型是围绕时间序列数据构建的,旨在高效存储、查询和分析时序数
Prometheus 的核心数据模型由以下几个主要部分组成
- 时间序列(Time Series)
- 标签(Labels)
- 样本(Sample)
- 指标(Metric)
- Metric 类型(Metric Type)
# 时间序列
在 Prometheus 中,时间序列是一个逻辑上的数据集合,标识了某个具体的指标及其维度组合,由以下两部分组成
指标名称(Metric Name):每个时间序列都有一个对应的名称,通常是描述某个特定监控目标的指标名
标签(Labels):每个时间序列还可以附带一组键值对标签,用于进一步区分时间序列的不同维度
假设你正在监控一个网站的 HTTP 请求
http_requests_total{status="200", method="GET", instance="server1"}
http_requests_total{status="404", method="POST", instance="server2"}
时间序列 1:http_requests_total{status="200", method="GET", instance="server1"} 表示服务器 server1 接收到的 GET 请求,且返回状态码是 200 的 HTTP 请求总数
时间序列 2:http_requests_total{status="404", method="POST", instance="server2"} 表示服务器 server2 接收到的 POST 请求,且返回状态码是 404 的 HTTP 请求总数
时间序列是一个非常抽象的概念,指的是一段随时间变化的概念
在监控系统中,时间序列就是通过时间戳记录某个指标(如请求次数、CPU 使用率等)在不同时间点的值。例如,Prometheus 通过抓取目标系统的状态(如 HTTP 请求数、CPU 使用率等),将它们以时间序列的方式存储,并随着时间推移不断更新
# 标签
标签是键值对形式的元数据,用于标识和区分同一个指标的不同维度
例如,在监控 HTTP 请求时,可以通过标签区分不同的 HTTP 状态码、请求路径 或 请求方法 等
标签是 Prometheus 数据模型的核心,它使得同一个指标能够有多个不同的维度,避免了单一指标带来的混乱
http_requests_total{status="200", method="GET", instance="localhost:8080"}
http_requests_total{status="500", method="POST", instance="localhost:8080"}
在这个例子中,http_requests_total 是指标名称,status、method 和 instance 是标签。每个标签对给定的指标值都能唯一标识一条时间序列
标签的作用是使你能够为同一个指标(例如 HTTP 请求总数)创建不同的时间序列,以便更加细粒度地查询和分析数据
# 样本
一个样本是一个时间点的数据,它由时间戳和值组成。每次数据抓取时,Prometheus 会存储一个样本,这个样本记录了指标在某个特定时间的值
一个时间序列包含一系列的 样本(Sample),每个样本由以下部分组成
时间戳(Timestamp):记录样本值的时间
值(Value):该时间点的指标值
对于 http_requests_total 指标,你可能会在 10:00:00 和 10:01:00 这两个时间点分别得到以下两个样本
http_requests_total{status="200", method="GET", instance="server1"} 1000 1640995200
http_requests_total{status="200", method="GET", instance="server1"} 1025 1640995260
样本 1:在时间戳 1640995200(例如 10:00:00),server1 上的 GET 请求总数是 1000
样本 2:在时间戳 1640995260(例如 10:01:00),server1 上的 GET 请求总数是 1025
Prometheus 会不断地在每个抓取周期内记录这些样本
样本有时也被成为数据点,是在某个时间点处记录的精确数据
# 指标
指标 是用来描述某种度量(如 CPU 使用率、HTTP 请求次数、内存使用量等)的一种数据单位,指标在一段时间维度下,用名称标识了某段时间内的数据,它本身不包含数据,而是一个抽象的度量标准。例如,http_requests_total
可能表示 HTTP 请求的总数
指标是指监控系统中的某个度量,它可以代表应用、系统、服务等的某个特定性能或状态
每个指标都有一个唯一的名称,并且可以包含多个标签来区分不同的时间序列
假设我们要监控网站的请求次数(http_requests_total)和响应时间(http_request_duration_seconds)
http_requests_total{status="200", method="GET", instance="server1"}
http_request_duration_seconds{status="200", method="GET", instance="server1"}
http_requests_total:表示 HTTP 请求的总数,通常是一个 Counter 类型的指标
http_request_duration_seconds:表示请求响应的时间,通常是一个 Gauge 或 Histogram 类型的指标
# Metric 类型(指标的类型)
Prometheus 支持几种不同类型的指标,每种类型适用于不同类型的数据模型和查询需求。主要的指标类型有:
Counter(计数器):计数器是单调递增的指标,只能增加,通常用于统计事件发生的次数(如 HTTP 请求数、错误数等)
这些值是不断累加的,表示服务器接收到的请求总数
例子:http_requests_total{status="200", method="GET"} 5
如果你觉得一直增加的数据没有什么用处,了解服务从开始有多少请求有什么价值么,但是请记住,每个指标都是存储了时间戳的,所以你的HTTP请求可能是10万,但是Prometheus也会记录之前某个点的值,我们可以去查询过去一分钟内的请求数,当然我们最想看到的还是请求数量的增加或者减少的速度有多块,因此,通常对于Counter指标我们都是去查看变化率,而不是查看本身的数字,PromQL内置的聚合操作和函数可以让用户对这些数据进行进一步的分析,例如:通过rate()获取HTTP请求的增长率:rate(http_requsts_total[5m]) # 获取前五分钟内的样本数据
Gauge(仪表):仪表指标可以任意增减,通常用于表示某个度量值的当前状态,如内存使用量、CPU 使用率等
例子:memory_usage{instance="localhost"} 512.3
例子:cpu_usage{instance="server1"} 75.5
这些简单的指标类型都只是为每个样本获取一个数字,但Prometheus的强大这之处在于如何让你跟踪它们,比如说我们绘制了两张图,一个是HTTP请求变化率,另一个是分配Gauge类型的实际内存,直接从图上可以看出这两个之间有一种关联性,当请求出现峰值的时候,内存的使用也会出现峰值,但我们仔细观察也会发现峰值过后,内存的使用量并没有恢复到峰值前的水平,整体它在逐渐增加,这表明程序很有可能存在内存泄漏的问题,通过这些简单的指标可以帮助我们找到这些可能存在的问题
对于Gauge类型的监控指标,通过PromQL内置函数delta()可以获取样本在一段时间范围内的变化情况,例如:计算CPU在两个小时内的差异:delta(cpu_temp_celsius{host="zeus"}[2h])
可以直接使用 predict_linear()对数据的变化趋势进行预测,例如,预测系统磁盘在4小时后剩余情况: predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)
Histogram(历史分布):Histogram 用于记录数据分布情况。它按不同的区间将数据进行统计,例如,HTTP 响应时间分布
例子:http_request_duration_seconds_bucket{le="0.5", method="GET"} 300
例子:http_request_duration_seconds_bucket{le="1.0", method="GET"} 450
例子:http_request_duration_seconds_bucket{le="2.0", method="GET"} 500
这些值表示在不同响应时间区间内,满足条件的请求数量。比如,在 le="0.5" 区间内的请求数为 300,表示响应时间小于 0.5 秒的请求数量
Summary(摘要):Summary 用于记录实时的统计信息,通常用于记录请求的响应时间等,它与 Histogram 类似,但支持动态计算百分位数
例子:http_request_duration_seconds_sum{method="GET"} 1024.3
例子:http_request_duration_seconds_count{method="GET"} 500
http_request_duration_seconds_sum 表示所有请求的总响应时间,http_request_duration_seconds_count 表示请求的总数