前言:
在了解Prometheus数据类型前,我们先了解下面几个统计学名词概念:
平均数(Mean):
平均数是所有数据加起来除以数据个数得到的结果。它表示数据的中心趋势。
最大值(Maximum):
最大值是数据集中最大的数值。它表示数据的上限。
最小值(Minimum):
最小值是数据集中最小的数值。它表示数据的最小极限。
中位数(Median):
中位数是将数据从小到大排序后,位于中间位置的数值。如果数据个数是奇数,则中位数是中间的数值;如果数据个数是偶数,则中位数是中间两个数值的平均值。
百分位数(Quantile)
概念
百分位数(Percentile)是一种统计学上的概念,用来描述一组数据中某个数值相对于整个数据集的位置。具体来说,一个百分位数表示的是有百分之几的数据值小于或等于这个数值,
计算方法:
- 排序:将数据集从小到大排序
- 定位:计算百分位数的位置,通常使用以下公式:
- 插值:如果计算的位置是整数,则直接取该位置的数据值;如果位置是小数,则进行线性插值。
- 示例:
Prometheus数据类型:
Prometheus 是一个强大的开源监控和警报工具,其核心是时间序列数据模型。在 Prometheus 中,数据类型主要分为以下四种基本类型,每种类型都适用于不同的监控场景:
Counter(计数器)
定义:
Counter 是一个单调递增的指标,通常用于追踪某个事件的总数,如请求次数、任务完成次数等。
特点:
Counter 的值只能增加或者重置为0,不能减少。当监控重启或者重置时,Counter 可以被重置。
使用场景:
适用于统计总量,如HTTP请求的总次数、数据库查询的总次数等。
Gauge(仪表盘)
定义:
Gauge 是一个可以任意变化的指标,它反映了某个时刻的实时值,如系统的负载、内存使用率、当前活跃用户数等。
特点:
Gauge 的值可以增加、减少或者重置,能够反映资源的实时状态。
使用场景:
适用于表示资源的实时状态或者变化,如CPU使用率、磁盘空间占用、队列长度等。
Histogram(直方图)
定义:
Histogram 用于追踪一段时间内的数据分布情况,它将数据分桶(bucket)存储,每个桶记录了特定范围内数据的数量。
特点:
Histogram 可以提供数据的分布情况,包括最小值、最大值、平均值、中位数等统计信息。
使用场景:
适用于分析数据的分布,如请求的响应时间、数据库查询延迟等。
Summary(摘要)
定义:
Summary 类似于 Histogram,但它提供了一个滑动时间窗口内的数据摘要,包括总数和样本的定量统计信息。
特点:
Summary 提供了样本的总数和分位数统计,如平均数、中位数、90百分位数等。
使用场景:
适用于需要实时计算分位数和统计信息的场景,如HTTP请求的响应时间分布。
Prometheus 函数
Prometheus 提供了丰富的函数库,可以用于对时间序列数据进行各种操作和计算。以下是一些常用的 Prometheus 函数和它们的简要说明:
聚合操作
- sum()
- 作用:
计算一组时间序列的和。 - 示例:
sum(rate(http_requests_total[5m]))
计算过去5分钟内 HTTP 请求数量的总和。
- avg()
- 作用:
计算一组时间序列的平均值。 - 示例:
avg(cpu_usage{job="app"})
计算所有名为 “app” 的作业的 CPU 使用率的平均值。
- min()
- 作用:
计算一组时间序列的最小值。 - 示例:
min(memory_usage)
获取内存使用率的最小值。
- max()
- 作用:
计算一组时间序列的最大值。 - 示例:
max(disk_io)
获取磁盘 I/O 的最大值。
- count()
- 作用:
计算一组时间序列的数量。 - 示例:
count(up)
计算当前处于 “up” 状态的实例数量。
数学运算
- rate()
- 作用:
计算 Counter 类型指标在指定时间范围内的增长率。 - 示例:
rate(http_requests_total[5m])
计算过去5分钟内 HTTP 请求的增长率。
- increase()
- 作用:
计算 Counter 类型指标在指定时间范围内的增加量。 - 示例:
increase(http_requests_total[5m])
计算过去5分钟内 HTTP 请求的增加量。
- irate()
- 作用:
计算 Counter 类型指标在指定时间范围内的瞬时增长率。 - 示例:
irate(http_requests_total[5m])
计算过去5分钟内 HTTP 请求的瞬时增长率。
时间序列操作
- delta()
- 作用:
计算时间序列在指定时间范围内的变化量。 - 示例:
delta(cpu_usage[1h])
计算过去1小时内 CPU 使用率的变化量。
- deriv()
- 作用:
计算时间序列的导数。 - 示例:
deriv(memory_usage[1h])
计算过去1小时内内存使用率的导数。
- reset()
- 作用:
将 Counter 类型的时间序列重置为 0。 - 示例:
reset(http_requests_total)
将 HTTP 请求计数器重置为 0。
时间相关函数
- time()
- 作用:
返回当前 UNIX 时间。 - 示例:
time()
获取当前 UNIX 时间。
- day_of_week()
- 作用:
返回特定时间点的星期几。 - 示例:
day_of_week(time())
获取当前时间的星期几。
- days_in_month()
- 作用:
返回特定时间点所在月份的天数。 - 示例:
days_in_month(time())
获取当前月份的天数。
预测和回归
- holt_winters()
- 作用:
使用 Holt-Winters 方法进行时间序列预测。 - 示例:
holt_winters(cpu_usage[1h], 0.3, 0.3)
对过去1小时的 CPU 使用率进行预测。
- predict_linear()
- 作用:
使用线性回归进行时间序列预测。 - 示例:
predict_linear(memory_usage[1h], 3600)
预测未来1小时的内存使用率。
实用函数
- label_replace()
- 作用:
替换或添加标签。 - 示例:
label_replace(up, "new_label", "\$1", "instance", "(.*)")
为 up 指标添加或替换 new_label 标签。
- vector()
- 作用:
将标量转换为向量。 - 示例:
vector(1)
创建一个值为1的向量。
- scalar()
- 作用:
将向量转换为标量。 - 示例:
scalar(sum(cpu_usage))
将 CPU 使用率的总和转换为标量值。