PromQL基础语法(下)-聚合运算符、内置函数【prometheus查询语句】

文章目录

  • 4. 聚合运算符
    • - 操作符
    • - 示例(sum)
    • - 示例(min/max)
    • - 示例(count_values)
    • - 示例(bottomk | topk)
  • 5. 内置函数
    • 5.1 取整
      • - ceil() 向上取整
      • - floor() 向下取整
      • - round() 四舍五入
    • 5.2 限定范围
      • - clamp() 限定取值范围
      • - clamp_max() 限定最大值
      • - clamp_min() 限定最小值
    • 5.3 值变化统计
      • - changes() 区间内样本改变次数
      • - resets() 复位统计
      • - delta() 首尾差
      • - idelta() 尾首差
      • - rate() 增长率
      • - increase() 区间增长量
      • - irate() 增长率(最后两值计算)
    • 5.4 日期与时间
      • - year() 返回年
      • - month() 返回月
      • - day_of_month() 返回日
      • - hour() 返回小时
      • - minute() 返回分钟
      • - day_of_week() 返回星期几
      • - day_in_month() 返回该月一共几天
      • - timestamp()
    • 5.6 标签
      • - label_join() 联合标签
      • - label_replace() 正则添加标签
    • 5.7 预测
      • - predict_linear()
    • 5.8 判断
      • - absent() 判断瞬时向量存在
      • - absent_over_time() 判断区间值存在
      • - scalar() 判断是否一个向量
      • - vector(s scalar)
      • - sgn() 判断正负
    • 5.9 排序和最值
      • - sort() 升序排列
      • - sort_desc() 降序排列
      • - avg_over_time() 区间内取平均
      • - min_over_time() 区间内最小值
      • - max_over_time() 区间内最大值
      • - sum_over_time() 区间求和
      • - count_over_time() 区间值统计
      • - quantile_over_time() 区间分位数
      • - stddev_over_time() 区间标准偏差
      • - stdvar_over_time() 区间标准方差
    • 5.10 数学计算
      • - abs() 绝对值
      • - sqrt() 平方根
      • - deriv() 导数
      • - exp() 指数函数
      • - ln()、log2()、log10() 对数
    • 5.11 三角函数、弧度

4. 聚合运算符

- 操作符

操作 说明
sum 求和
min 最小值
max 最大值
avg 平均值
stddev 标准差
stdvar 方差
count 统计元素个数
count_values 等于某值的元素个数
bottomk 最小的 k 个元素
topk 最大的 k 个元素
quantile 分位数

- 示例(sum)

sum(system_disk_bytes_total{ ident="10.10.239.52"})/1024/1024/1024

有图有真相
PromQL基础语法(下)-聚合运算符、内置函数【prometheus查询语句】_第1张图片

- 示例(min/max)

max(system_disk_bytes_total{ ident="10.10.239.52"})

有图有真相

PromQL基础语法(下)-聚合运算符、内置函数【prometheus查询语句】_第2张图片

- 示例(count_values)

count_values("value",system_mem_total)

有图有真相
PromQL基础语法(下)-聚合运算符、内置函数【prometheus查询语句】_第3张图片

- 示例(bottomk | topk)

bottomk(5,system_mem_used)

有图有真相
PromQL基础语法(下)-聚合运算符、内置函数【prometheus查询语句】_第4张图片

5. 内置函数

5.1 取整

- ceil() 向上取整

  • 语法
ceil(v instant-vector)
  • 语法示例
ceil(system_mem_used_percent{ident="10.10.239.31"})

- floor() 向下取整

  • 语法
floor(v instant-vector)
  • 语法示例
floor(system_mem_used_percent{ident="10.10.239.31"})

- round() 四舍五入

  • 语法
round(v instant-vector, to_nearest=1 scalar)
  • 语法示例
round(system_mem_used_percent{ident="10.10.239.31"})

5.2 限定范围

- clamp() 限定取值范围

说明:在范围内的值被取出,在范围外取范围边界值。

  • 语法
clamp(v instant-vector, min scalar, max scalar)
  • 语法示例
clamp(system_mem_used_percent{ident="10.10.239.31"},4,10)

完整示例:

  • 原有值
system_mem_used_percent{ident="10.10.239.31"}

结果输出

system_mem_used_percent{ident="10.10.239.31"}               5.226927972811279
  • 如果值在给出范围内
clamp(system_mem_used_percent{ident="10.10.239.31"},4,10)

结果输出

{ident="10.10.239.31"}       								5.232399234516268
  • 如果值在给出范围外
clamp(system_mem_used_percent{ident="10.10.239.31"},7,10)

结果输出

{ident="10.10.239.31"}       								7

- clamp_max() 限定最大值

值小于限定值则显示原有值,值大于限定值则显示限定值。

  • 语法
clamp_max(v instant-vector, max scalar) 
  • 语法示例
clamp_max(system_mem_used_percent{ident="10.10.239.31"},7)

- clamp_min() 限定最小值

值大于限定值则显示原有值,值小于限定值则显示限定值。

  • 语法
clamp_min(v instant-vector, max scalar) 
  • 语法示例
clamp_min(system_mem_used_percent{ident="10.10.239.31"},7)

5.3 值变化统计

- changes() 区间内样本改变次数

  • 语法
changes(v range-vector)
  • 语法示例
changes(system_mem_used_percent{ident="10.10.239.31"}[5m])

- resets() 复位统计

连续样本数值减少,视为复位

  • 语法
resets(v range-vector)
  • 语法示例
resets(system_mem_used_percent{ident="10.10.239.31"}[5m])

- delta() 首尾差

计算区间第一个和最后一个值的差

delta(v range-vector)
  • 语法示例
delta(system_mem_used_percent{ident="10.10.239.31"}[10m])

结果显示

{ident="10.10.239.31"}					-0.004406665458601161

- idelta() 尾首差

计算区间第一个和最后一个值的差

idelta(v range-vector)
  • 语法示例
idelta(system_mem_used_percent{ident="10.10.239.31"}[10m])

结果显示

{ident="10.10.239.31"}						-0.0011583301807851498

- rate() 增长率

说明:计算范围向量中时间序列的平均每秒增长率

  • 语法
rate(v range-vector)
  • 语法示例
rate(system_mem_used_percent{ident="10.10.239.31"}[10m])

结果显示

{ident="10.10.239.31"}					0.1416991173036296

- increase() 区间增长量

计算时间范围内的增量 = 时间范围内秒数 * rate()

  • 语法
increase(v range-vector)
  • 语法示例
increase(system_mem_used_percent{ident="10.10.239.31"}[10m])

结果显示

{ident="10.10.239.31"}					80.79502430097307

- irate() 增长率(最后两值计算)

通过时间范围的最后两个点来计算每秒瞬时增长率。

  • 语法
irate(v range-vector) 
  • 语法示例
irate(system_mem_used_percent{ident="10.10.239.31"}[10m])

5.4 日期与时间

- year() 返回年

值如果是时间戳,则返回值是几点

  • 语法
year(v=vector(v instant-vector)
  • 语法示例
year(mongodb_instance_local_time)

结果显示

今天是2022/10/24 10:24 星期一

{app="mongodb", chart="mongodb-7.8.10", ……}				2022
{app="mongodb", chart="mongodb-7.8.10", ……}			    2022
{app="mongodb", chart="mongodb-7.8.10", ……}				2022

- month() 返回月

值如果是时间戳,则返回值是几点

  • 语法
month(v=vector(v instant-vector)
  • 语法示例
month(mongodb_instance_local_time)

结果显示

今天是2022/10/24 10:24 星期一

{app="mongodb", chart="mongodb-7.8.10", ……}				2
{app="mongodb", chart="mongodb-7.8.10", ……}			    2
{app="mongodb", chart="mongodb-7.8.10", ……}				2

- day_of_month() 返回日

值如果是时间戳,则返回值是这个月的第几天

  • 语法
day_of_month(v instant-vector)
  • 语法示例
day_of_month(mongodb_instance_local_time)

结果显示

今天是2022/10/24 星期一

{app="mongodb", chart="mongodb-7.8.10", ……}				24
{app="mongodb", chart="mongodb-7.8.10", ……}			    24
{app="mongodb", chart="mongodb-7.8.10", ……}				24

- hour() 返回小时

值如果是时间戳,则返回值是几点

  • 语法
hour(v instant-vector)
  • 语法示例
hour(mongodb_instance_local_time)

结果显示

今天是2022/10/24 10:24 星期一

{app="mongodb", chart="mongodb-7.8.10", ……}				10
{app="mongodb", chart="mongodb-7.8.10", ……}			    10
{app="mongodb", chart="mongodb-7.8.10", ……}				10

- minute() 返回分钟

值如果是时间戳,则返回值是几点

  • 语法
minute(v instant-vector)
  • 语法示例
minute(mongodb_instance_local_time)

结果显示

今天是2022/10/24 10:24 星期一

{app="mongodb", chart="mongodb-7.8.10", ……}				24
{app="mongodb", chart="mongodb-7.8.10", ……}			    24
{app="mongodb", chart="mongodb-7.8.10", ……}				24

- day_of_week() 返回星期几

值如果是时间戳,则返回值是星期几

  • 语法
day_of_week(v instant-vector)
  • 语法示例
day_of_week(mongodb_instance_local_time)

结果显示

今天是2022/10/24 星期一

{app="mongodb", chart="mongodb-7.8.10", ……}				1
{app="mongodb", chart="mongodb-7.8.10", ……}			    1
{app="mongodb", chart="mongodb-7.8.10", ……}				1

- day_in_month() 返回该月一共几天

值如果是时间戳,则返回值是这个月一共几天

  • 语法
day_in_month(v=vector(v instant-vector)
  • 语法示例
day_in_month(mongodb_instance_local_time)

结果显示

今天是2022/10/24 星期一

{app="mongodb", chart="mongodb-7.8.10", ……}				31
{app="mongodb", chart="mongodb-7.8.10", ……}			    31
{app="mongodb", chart="mongodb-7.8.10", ……}				31

- timestamp()

返回每个样本的时间戳

  • 语法
timestamp(v instant-vector)
  • 语法示例
timestamp(system_mem_used)

5.6 标签

- label_join() 联合标签

用于建立一个新标签,值链接多个原有标签

  • 语法
label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)
  • 语法示例
label_join(probe_success{group="http", instance="10.1.xxx.68:80", job="http_hq_nginx", project="xxxxx"},"new_label","://","group","instance")

结果显示

probe_success{group="http", instance="10.1.xxx.68:80", job="http_hq_nginx", new_label="http://10.1.xxx.68:80", project="xxxxx"}				1

- label_replace() 正则添加标签

用于建立一个新标签,并付给新值,并支持正则匹配原有值

  • 语法
label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
  • 语法示例
label_replace(probe_success{instance="10.1.30.68:80"},"port","$1","instance",".*:(.*)")

结果显示

可见新增加了port标签,并从instance标签处匹配到了 80端口。

probe_success{group="http", instance="10.1.xxx.68:80", job="http_hq_nginx", port="80", project="HQ-AllInOne-PC"}  1

5.7 预测

- predict_linear()

  • 语法
predict_linear(v range-vector, t scalar)
  • 语法示例
predict_linear(system_mem_used_percent{ident="10.10.xxx.31"}[2h],3600)

通过2小时内的数据,推算3600s后的数据

5.8 判断

- absent() 判断瞬时向量存在

  • 语法
absent(v instant-vector)
  • 语法示例
  • 返回空的情况
    • job 的值没有 http_hq_nginx
    • 搜索到的结果不是2
  • 返回值为1
    • 其它情况
absent(probe_success{job="http_hq_nginx" } == 2 )
  • 完整示例
  • 搜索到的结果:
probe_success{job="http_hq_nginx" }

结果显示

所有端口都是存活的,因此返回值都是1

probe_success{group="http", instance="10.1.xxx.68:80", job="http_hq_nginx", project="HQ-AllInOne-PC"}			1
probe_success{group="http", instance="10.1.xxx.68:8080", job="http_hq_nginx", project="HQ-AllInOne-PC"}			1
probe_success{group="http", instance="10.1.xxx.69:80", job="http_hq_nginx", project="HQ-AllInOne-PC"}			1
probe_success{group="http", instance="10.1.xxx.69:8080", job="http_hq_nginx", project="HQ-AllInOne-PC"}			1
probe_success{group="http", instance="10.1.xxx.73:80", job="http_hq_nginx", project="HQ-AllInOne-PC"}			1
probe_success{group="http", instance="10.1.xxx.73:8080", job="http_hq_nginx", project="HQ-AllInOne-PC"}			1
  • 返回空:标签的值对上了,查询的结果也对
absent(probe_success{job="http_hq_nginx" } == 1 )
  • 返回1:标签值不对
absent(probe_success{job="liubei" } == 1 )

结果

{}			1
  • 返回1:查询结果对不上
absent(probe_success{job="http_hq_nginx" } == 2 )

结果

{}			1

- absent_over_time() 判断区间值存在

  • 语法
absent_over_time(v range-vector)
  • 语法示例
absent_over_time(probe_success{job="hello"}[1m])

结果显示

job标签没有 “hello”这个值,因此返回 1

{job="hello"}			1

- scalar() 判断是否一个向量

  • 语法
scalar(v instant-vector)
  • 语法示例
scalar(system_mem_used_percent{ident="10.10.239.31"})
  • 完整示例
  • 返回不是一条记录,因此会返回NaN
scalar(system_mem_used)

返回结果

scalar				NaN
  • 只搜到了一条数据,返回该值
scalar(system_mem_used_percent{ident="10.10.239.31"})

返回结果

scalar	5.230846579167555

- vector(s scalar)

将标量作为没有标签的向量返回

  • 语法
vector(s scalar)
  • 语法示例
vector(scalar(system_mem_used_percent{ident="10.10.239.31"}))

结果显示

{}       5.231388776273454

可以回翻一下刚才的scalar的结果,是带scalar

- sgn() 判断正负

  • 语法
sgn(v instant-vector)

说明:

  • 如果 v 为正,则为 1
  • 如果 v 为负,则为 -1
  • 如果 v 等于 0,则为 0。
  • 语法示例
sgn(system_mem_used_percent{ident="10.10.239.31"})
  • 结果显示
{ident="10.10.239.31"}				1

5.9 排序和最值

- sort() 升序排列

  • 语法
sort(v instant-vector)
  • 语法示例
sort(system_mem_used_percent)

- sort_desc() 降序排列

  • 语法
sort_desc(v instant-vector)
  • 语法示例
sort_desc(system_mem_used_percent)

- avg_over_time() 区间内取平均

  • 语法
avg_over_time(range-vector)

- min_over_time() 区间内最小值

  • 语法
min_over_time(range-vector)

- max_over_time() 区间内最大值

  • 语法
max_over_time(range-vector)

- sum_over_time() 区间求和

  • 语法
sum_over_time(range-vector)

- count_over_time() 区间值统计

  • 语法

统计单位时间内取到指标个数

count_over_time(range-vector)
  • 语法示例
count_over_time(system_mem_used_percent{ident="10.10.239.31"}[3m])

结果显示

{ident="10.10.239.31"}			9

验证:system_mem_used_percent{ident="10.10.239.31"}[3m]取到的数据确实是 9 条

- quantile_over_time() 区间分位数

说明:区间向量内每个度量指标的样本数据值分位数,φ-quantile (0 ≤ φ ≤ 1)

  • 语法
quantile_over_time(scalar, range-vector) 

- stddev_over_time() 区间标准偏差

说明:区间向量内每个度量指标的总体标准偏差

  • 语法
stddev_over_time(range-vector)

- stdvar_over_time() 区间标准方差

说明:区间向量内每个度量指标的总体标准方差

  • 语法
stdvar_over_time(range-vector)

5.10 数学计算

- abs() 绝对值

  • 语法
abs(v instant-vector)

- sqrt() 平方根

  • 语法
sqrt(v instant-vector)

- deriv() 导数

  • 语法
deriv(v range-vector)

- exp() 指数函数

  • 语法
exp(v instant-vector)

- ln()、log2()、log10() 对数

  • 语法
ln|log2|log10(v instant-vector) 

5.11 三角函数、弧度

  • acos(v instant-vector)
  • acosh(v instant-vector)
  • asin(v instant-vector)
  • asinh(v instant-vector)
  • atan(v instant-vector)
  • atanh(v instant-vector)
  • cos(v instant-vector)
  • cosh(v instant-vector)
  • sin(v instant-vector)
  • sinh(v instant-vector)
  • tan(v instant-vector)
  • tanh(v instant-vector)
  • deg(v instant-vector)
  • pi()
  • rad(v instant-vector)

你可能感兴趣的:(监控,prometheus,PromQL,prometheus查询语法,监控,基础教程)