Prometheus 精要(二)
时间序列
每一个指标包含若干个时间序列。
假设指标包含 N 个label,第 i 个 label 的值个数(种)为 C(i),那么这个指标最多包含 C(1) * C(2) * C(3) * ... * C(N) 个时间序列
可以直接通过 count(metric_name) 得到该指标实际包含的时间序列数
纵向选择
可以通过选择符筛选指标的某些时间序列。
筛选 label1 等于 value1 并且 label2 不等于 value2:
metric_name{label1 = "value1", label2 != "value2"}
正则匹配
metric_name{label1 =~ ".*value1.*", label2 !~ ".*value2.*"}
横向选择
比较符
可以通过比较符 筛选指标的各个时间序列 在时间轴上满足某些条件的 指标值。
# 支持 > >= <= < == !=
metric_name > 100
or
LHS or RHS
如果 LHS (时间序列)的指标值在 RHS 能找到匹配(时间序列)的指标值,使用这个指标值(LHS)
如果 RHS (时间序列)的指标值在 LHS 找不到匹配(时间序列)的指标值,使用这个指标值(RHS)
and
LHS and RHS
如果 LHS (时间序列)的指标值在 RHS 能找到匹配(时间序列)的指标值,才使用这个指标值(LHS)(类似 if exists)
unless
LHS unless RHS
如果 LHS (时间序列)的指标值在 RHS 找不到匹配(时间序列)的指标值,才使用这个指标值(LHS)(类似 if not exists)
偏移
可以通过 offset 让时间序列在时间轴上发生偏移。返回和输入同等数量的时间序列。
metric_name offset 1d
结果产生的每一个时间序列上的每一个时间点,对应其一天前的指标值
纵向聚合操作符
group
聚合指标包含的所有时间序列,返回常量1的时间序列(1个),看起来没什么实际用处,但在分组可以发挥作用
count
聚合指标包含的所有时间序列,返回新时间序列(1个):指标所有时间序列的(在每个时间点上)个数
sum
聚合指标包含的所有时间序列,返回新时间序列(1个):指标所有时间序列的指标值(在每个时间点上)的累加和
avg
聚合指标包含的所有时间序列,返回新时间序列(1个):指标所有时间序列的指标值(在每个时间点上)的平均值
avg(metric_name) 等价于 sum(metric_name)/count(metric_name)
max/min
聚合指标包含的所有时间序列,返回新时间序列(1个):指标所有时间序列的指标值(在每个时间点上)中最大/最小的那个值
quantile (P%)
聚合指标包含的所有时间序列,返回新时间序列(1个):指标P%的时间序列的指标值(在每个时间点上)都小于的那个值(百分位值)
topk/bottomk (K)
聚合指标包含的所有时间序列,返回新时间序列(K个):指标所有时间序列的指标值(在每个时间点上)中最大/最小的那K个值
分组
by 子句
OP = group/count/sum/avg/max/min...
OP by(label1, label2)(metric_name)
对于指标包含的每一个时间序列,以其 label1的值 + label2的值组合为 group key,根据 group key 将这些时间序列分为若干组,基于组进行组内聚合操作,产生N个新的时间序列(N=组数量)
without 子句
OP = group/count/sum/avg/max/min...
OP without(label1, label2)(metric_name)
对于指标包含的每一个时间序列,以除去 label1、label2 以外的 label 的值组合为 group key,根据 group key 将这些时间序列分为若干组,基于组进行组内聚合操作,产生N个新的时间序列(N=组数量)
__name__ 标签
可以理解为 prometheus 只包含一个"全局指标",普通指标只是这个"全局指标"的特殊标签 __name__ 的一个特殊值
up 等价于 {__name__="up"}
up{node="node-1"} 等价于 {__name__="up", node="node-1"}
可以很方便地用正则查询名字为某个前缀的所有指标
group by (__name__)({__name__=~"go_.*"})
横向聚合操作符
rate
对指标包含各个的时间序列,在各自的时间轴(在每个时间点上)向后看一个时间窗口,求单位时间(每秒)的增量。返回和输入同等数量的时间序列。
rate(metric_name[60s])
等价于
increase(metric_name[60s]) / 60
avg_over_time,min_over_time, max_over_time, sum_over_time, count_over_time, quantile_over_time ...
对指标包含各个的时间序列,在各自的时间轴(在每个时间点上)向后看一个时间窗口,求平均、最小值、最大值、和、值数量等。返回和输入同等数量的时间序列。
cheatsheet
查询当前系统时间序列的数量:
prometheus_tsdb_head_series
或
count({__name__!=""})
查询各个指标包含的时间序列数量,倒序排序:
sort_desc(count by(__name__)({__name__!=""}))
查询各个instance包含的时间序列数量,倒序排序:
sort_desc(count by(instance)({__name__!="", instance!=""}))
查询各个指标,平均在每个instance上,包含的时间序列数量,倒序排序:
sort_desc(avg by(__name__)(count by(__name__, instance)({__name__!="", instance!=""})))