时间序列
每一个指标包含若干个时间序列。
假设指标包含 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.*"}
偏移
可以通过 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!=""})))