Aggregation Operators(聚合运算符)
概述
参考:
Prometheus 还提供了下列内置的聚合运算符,这些运算符仅作用于瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。
- sum (求和)
- min (最小值)
- max (最大值)
- avg (平均值)
- stddev (标准差)
- stdvar (标准差异)
- count (计数)
- count_values (对 value 进行计数)
- bottomk (后 n 条时序)
- topk (前 n 条时序)
- quantile (分布统计)
Syntax(语法)
[AggregationOperators] [without|by (LabelName,….)] ([Parameter,…] VectorExpression)
- Aggregation Operators # 聚合运算符
- without|by (LabelName,…) # 若不指定该选项,则聚合全部数据的值。如果指定了,则按照指定的 LabelName 进行聚合。通过 without 和 by 可以按照样本的问题对数据进行聚合。该用法的示例图详见文末
- by # 聚合 by 后面指定的 LabelName 样本数据,并将聚合以外的标签的移除
- without # 与 by 相反,聚合 without 后面没有指定的 LabelName 样本数据。并将聚合以外的标签的移除
- Parameter # 参数,其中只有 count_values, quantile, topk, bottomk 支持
- VectorExpression # 向量表达式。详见 PromQL 章节
sum 与 min 与 max 与 avg 详解
count 与 count_values 详解
EXAMPLE
- 计算 up 序列 的值为 1 的序列总数
- count by(job, namespace, service) (up == 1)
quantile 详解
参考:
其实,在 Prometheus 中,把 quantile(分位数)改为 percentile(百分位数)更准确
在这么一组数中
18,6,250,4,21,10,1,1,4274,5,102,15,5,3,10,1,5,3,177,5,34,45,1,5,15
quantile(0.5,上述所有数的集合),如果使用该公式计算 0.5 百分位数,则值为 6。也就是说,比 6 大数的有 50%,比 6 小的数有 50%
quantile(0.99,上述所有数的集合),如果使用该公式计算 0.99 百分位数,则值为 3308.239999999992。比 3308 大的数有 1%,比 3308 小的有 99%
如果使用响应时间来举例,那么,0.99 百分位的值为 10,意味着:在此时此刻,所有请求的响应时间中,有 99%都是 10 以上秒,剩下的不到 10 秒
Example
如果 http_requests_total 指标一共有 3 个 label,分别是 application、instance、group。那么下面的两种运算方式得出的结果是一样的
- sum without (instance) (http_requests_total)
- 等价于
- sum by (code,handler,job,method) (http_requests_total)
如果只需要计算整个应用的 HTTP 请求总量,可以直接使用表达式
- sum(http_requests_total)
count_values 用于时间序列中每一个样本值出现的次数。count_values 会为每一个唯一的样本值输出一个时间序列,并且每一个时间序列包含一个额外的标签。
- count_values(“count”, http_requests_total)
topk 和 bottomk 则用于对样本值进行排序,返回当前样本值前 n 位,或者后 n 位的时间序列。获取 HTTP 请求数前 5 位的时序样本数据,可以使用表达式:
- topk(5, http_requests_total)
quantile 用于计算当前样本数据值的分布情况 quantile(φ, express)其中 0 ≤ φ ≤ 1。例如,当 φ 为 0.5 时,即表示找到当前样本数据中的中位数
- quantile(0.5, http_requests_total)
效果示例图
不进行聚合运算的数据
不使用 by 或者 without,聚合运算所有数据,得出唯一一个值
使用 by,聚合具有相同 namespace 的样本值,得出一个或多个值
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.