首页 > 其他分享 >PromQL语法总结

PromQL语法总结

时间:2022-12-08 21:32:46浏览次数:65  
标签:总结 node chunk bytes 语法 PromQL total 数据 tsdb

PromQL语法总结_k8s

PromQL查询数据类型:

Instant Vector

瞬时向量/瞬时数据,是对目标实例查询到的同一个时间戳的一组时间序列数据(按照时间的推移对数据进行存储和展示),每个时间序列包含单个数据样本,比如node_memory_MemFree_bytes查询的是当前剩余内存(可用内存)就是一个瞬时向量,该表达式的返回值中只会包含该时间序列中的最新的一个样本值,而相应的这样的表达式称之为瞬时向量表达式,以下是查询node节点可用内存的瞬时向量表达式:

[root@prome1 apps]# curl '​​http://192.168.1.28:9090/api/v1/query'​​ --data 'query=node_memory_MemFree_bytes' --data time=1669954495

PromQL语法总结_k8s_02


Range Vector

范围向量/范围数据,是指在任何一个时间范围内,抓取的所有度量指标数据.比如最近一天的网卡流量趋势图、或最近5分钟的node节点内容可用字节数等,以下是查询node节点可用内存的范围向量表达式:

curl '​​http://192.168.1.28:9090/api/v1/query'​​ --data 'query=node_memory_MemFree_bytes{instance="192.168.1.28:9100"}[5m]' --data time=1669954493

PromQL语法总结_k8s_03



Instant Vector VS Range Vector:

instant vector :每个指标只含有一个数据

range vector:每个指标含有一组数据(例如指定最近几分钟的数据)

PromQL语法总结_linux_04


scalar

标量/纯量数据,是一个浮点数类型的数据值,使用node_load1获取到时一个瞬时向量后,在使用prometheus的内置函数scalar()将瞬时向量转换为标量,例如:scalar(sum(node_load1))

[root@prome1 apps]# curl '​​http://192.168.1.28:9090/api/v1/query'​​ --data 'query=scalar(sum(node_load1{instance="192.168.1.28:9100"}))' --data time=1669954493


PromQL语法总结_linux_05


string

简单的字符串类型的数据,目前未使用,(a simple string value; currently unused)。

​https://prometheus.io/docs/prometheus/latest/querying/basics/​

PromQL语法总结_prometheus_06





PromQL指标数据类型

counter

计数器,Counter类型代表一个累积的指标数据,在没有被重启的前提下只增不减(生活中的电表、水表),比如磁盘I/O总数、Nginx/API的请求总数、网卡流经的报文总数等。

PromQL语法总结_prometheus_07


Gauge

仪表盘,Gauge类型代表一个可以任意变化的指标数据,值可以随时增高或减少,如带宽速率、CPU负载、内存利用率、nginx 活动连接数等。

PromQL语法总结_linux_08



Histogram

累积直方图,Histogram会在一段时间范围内对数据进行采样(通常是请求持续时间或响应大小等),假如每分钟产生一个当前的活跃连接数,那么一天24小时*60分钟=1440分钟就会产生1440个数据,查看数据的每间隔的绘图跨度为2小时,那么2点的柱状图(bucket)会包含0点到2点即两个小时的数据,而4点的柱状图(bucket)则会包含0点到4点的数据,而6点的柱状图(bucket)则会包含0点到6点的数据,可用于统计从当天零点开始到当前时间的数据统计结果,如http请求成功率、丢包率等,比如ELK的当天访问IP统计。

# TYPE prometheus_tsdb_compaction_chunk_size_bytes histogram
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="32"} 28
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="48"} 76
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="72"} 1115
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="108"} 1263
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="162"} 2171
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="243"} 4085
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="364.5"} 4297
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="546.75"} 4412
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="820.125"} 4468
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="1230.1875"} 4524
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="1845.28125"} 4683
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="2767.921875"} 4684
prometheus_tsdb_compaction_chunk_size_bytes_bucket{le="+Inf"} 4684
prometheus_tsdb_compaction_chunk_size_bytes_sum 1.053252e+06
prometheus_tsdb_compaction_chunk_size_bytes_count 4684



Summary

摘要图,也是一组数据,默认统计选中的指标的最近10分钟内的数据的分位数,可以指定数据统计时间范围,基于分位数(Quantile),亦称分位点,是指用分割点(cut point)将随机数据统计并划分为几个具有相同概率的连续区间,常见的为四分位,四分位数是将数据样本统计后分成四个区间,将范围内的数据进行百分比的占比统计,从0到1,表示是0%~100%,(0%~25%,%25~50%,50%~75%,75%~100%),利用四分位数,可以快速了解数据的大概统计结果。

如下统计的是 0、0.25、0.5、0.75、1的数据量分别是多少。

go_gc_duration_seconds
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.8479e-05
go_gc_duration_seconds{quantile="0.25"} 6.5059e-05 #25%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds{quantile="0.5"} 9.3605e-05 #50%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds{quantile="0.75"} 0.000133103 #75%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds{quantile="1"} 0.004022673 #100%以内的go_gc_duration_seconds的持续时间
go_gc_duration_seconds_sum 1.446781088 #数据总和
go_gc_duration_seconds_count 7830 #数据个数



node-exporter指标数据格式

没有标签的

#metric_name metric_value

#TYPE node_load15 gauge

node_load15 0.1


一个标签的

#metric_name{label1_name="label1-value"} metric_value

# TYPE node_network_receive_bytes_total counter

node_network_receive_bytes_total{device="eth0"} 1.44096e+07



多个标签的

#metric_name{label1_name="label1-value","labelN_name="labelN-value} metric_value

# TYPE node_filesystem_files_free gauge

node_filesystem_files_free{device="/dev/sda2",fstype="xfs",mountpoint="/boot"} 523984




PromQL查询指标数据示例

node_memory_MemTotal_bytes #查询node节点总内存大小

node_memory_MemFree_bytes #查询node节点剩余可用内存

node_memory_MemTotal_bytes{instance="172.31.1.181:9100"} #基于标签查询指定节点的总内存

node_memory_MemFree_bytes{instance="172.31.1.181:9100"} #基于标签查询指定节点的可用内存

node_disk_io_time_seconds_total{device="sda"} #查询指定磁盘的每秒磁盘io

node_filesystem_free_bytes{device="/dev/sda1",fstype="xfs",mountpoint="/"} #查看指定磁盘的磁盘剩余空间

# HELP node_load1 1m load average. #CPU负载

# TYPE node_load1 gauge

node_load1 0.1

# HELP node_load15 15m load average. # TYPE node_load15 gauge

node_load15 0.17

# HELP node_load5 5m load average. # TYPE node_load5 gauge

node_load5 0.13



基于标签对指标数据进行匹配

  • = :选择与提供的字符串完全相同的标签,精确匹配。
  • != :选择与提供的字符串不相同的标签,去反。
  • =~ :选择正则表达式与提供的字符串(或子字符串)相匹配的标签。
  • !~ :选择正则表达式与提供的字符串(或子字符串)不匹配的标签。

#查询格式<metric name>{<label name>=<label value>, ...}

node_load1{instance="172.31.7.111:9100"}

node_load1{job="promethues-node"}

node_load1{job="promethues-node",instance="172.31.1.181:9100"} #精确匹配

node_load1{job="promethues-node",instance!="172.31.1.181:9100"} #取反

node_load1{instance=~"172.31.1.18.*:9100$"} #包含正则且匹配

node_load1{instance!~"172.31.1.181:9100"} #包含正则且取反


PromQL语法总结_linux_09




PromQL时间范围示例

对指标数据进行时间范围指定:

  • s - 秒
  • m - 分钟
  • h - 小时
  • d - 天
  • w - 周
  • y - 年


#瞬时向量表达式,选择当前最新的数据

node_memory_MemTotal_bytes{}

#区间向量表达式,选择以当前时间为基准,查询所有节点

node_memory_MemTotal_bytes

查询5分钟内的数据

node_memory_MemTotal_bytes{}[5m]

#区间向量表达式,选择以当前时间为基准,查询指定节点

node_memory_MemTotal_bytes

查询5分钟内的数据

node_memory_MemTotal_bytes{instance="172.31.1.181:9100"}[5m]



PromQL语法总结_prometheus_10




PromQL运算符

对指标数据进行数学运算:

  • + 加法
  • - 减法
  • * 乘法
  • / 除法
  • % 模
  • ^ 幂(N次方)



node_memory_MemFree_bytes/1024/1024 #将内存进行单位从字节转行为兆
node_disk_read_bytes_total{device="sda"} + node_disk_written_bytes_total{device="sda"} #计算磁盘读写数据量
(node_disk_read_bytes_total{device="sda"} + node_disk_written_bytes_total{device="sda"}) / 1024 / 1024 #单位转换

PromQL语法总结_linux_11






PromQL 聚合运算

对指标数据进行进行聚合运算:

  • max() #最大值
  • min() #最小值
  • avg() #平均值


计算每个节点的最大的流量值

max(node_network_receive_bytes_total) by (instance)

计算每个节点最近五分钟每个device的最大流量

max(rate(node_network_receive_bytes_total[5m])) by (device)

PromQL语法总结_prometheus_12



对指标数据进行聚合运算

sum()

#求数据值相加的和(总数)

sum(prometheus_http_requests_total)

{} 2495 #最近总共请求数为2495次,用于计算返回值的总数(如http请求次数)


count()

#统计返回值的条数

count(node_os_version)

{} 2 #一共两条返回的数据,可以用于统计节点数、pod数量等


count_values()

#对value的个数(行数)进行计数,并将value赋值给自定义标签,从而成为新的label

count_values("node_version",node_os_version) #统计不同的系统版本节点有多少

{node_versinotallow="20.04"} 2




abs()

#返回指标数据的值

abs(sum(prometheus_http_requests_total{handler="/metrics"}))


absent()

#如果监指标有数据就返回空,如果监控项没有数据就返回1,可用于对监控项设置告警通知(如果返回值等于1就触发告警通知)

absent(sum(prometheus_http_requests_total{handler="/metrics"}))

PromQL语法总结_linux_13




stddev()

#标准差

stddev(prometheus_http_requests_total) #5+5=10,1+9=10,1+9这一组的数据差异就大,在系统是数据波动较大,不稳定


stdvar()

#求方差

stdvar(prometheus_http_requests_total)

PromQL语法总结_prometheus_14



topk()

#样本值排名最大的N个数据

#取从大到小的前6个

topk(6, prometheus_http_requests_total)


bottomk()

#样本值排名最小的N个数据

#取从小到大的前6个

bottomk(6, prometheus_http_requests_total)

PromQL语法总结_prometheus_15



rate()

#rate函数是专门搭配counter数据类型使用函数,rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果,适合用于计算数据相对平稳的数据。

rate(prometheus_http_requests_total[5m])

rate(apiserver_request_total{code=~"^(?:2..)$"}[5m])

rate(node_network_receive_bytes_total[5m])


irate()

#函数也是专门搭配counter数据类型使用函数,irate取的是在指定时间范围内的最近两个数据点来算速率,适合计算数据变化比较大的数据,显示的数据相对比较准确,所以官网文档说:irate适合快速变化的计数器(counter),而rate适合缓慢变化的计数器(counter)。

irate(prometheus_http_requests_total[5m])

irate(node_network_receive_bytes_total[5m])

irate(apiserver_request_total{code=~"^(?:2..)$"}[5m])

PromQL语法总结_linux_16




rate vs irate

PromQL语法总结_prometheus_17



by

#在计算结果中,只保留by指定的标签的值,并移除其它所有的

sum(rate(node_network_receive_packets_total{instance=~".*"}[10m])) by (instance)

sum(rate(node_memory_MemFree_bytes[5m])) by (increase)


without

#从计算结果中移除列举的instance,job标签,保留其它标签

sum(prometheus_http_requests_total) without (instance,job)

PromQL语法总结_prometheus_18

标签:总结,node,chunk,bytes,语法,PromQL,total,数据,tsdb
From: https://blog.51cto.com/voice/5923490

相关文章

  • nushell脚本总结
    1.["aa\n","bb\n"]输出一个列表,然后每行最后都有换行2.["aa\n","bb\n"]|strcollect其实就是strjoin功能;3.netstat-anp是rawinput类型,可以用netstat-anp|intostring......
  • C编程命名习惯总结
    1、​​匈牙利命名法​​​通过在变量名之前增加小写字母的符号前缀,以标识变量的属性、类型、作用域等参数。简单地说,即“变量名=属性+类型+对象描述”的形式。示例:m_lpszStr......
  • KEIL mdk LIB 使用总结
    1、:打开一个测试通过的工程。(测试没有问题后将不需要的部分删除,包括main.c文件,即你不想生成lib的各类xx.c文件删除。当然你也可以将各类不想编译生成lib的文件Optionsfor......
  • web框架推导 wsgiref模块 jinja2模板语法 django框架简介 django基本操作
    目录纯手撸web框架web框架的本质手写web框架存在的问题基于wsgiref模块基本介绍推导流程代码封装优化总结动静态网页jinja2模块前端、后端、数据库三者联动推导流程总结pyt......
  • Redis项目总结--缓存更新策略
    Redis项目总结--缓存更新策略1.更新策略内存淘汰超时剔除主动更新说明不用自己维护,利用Redis内存淘汰机制,内存不足时自动淘汰部分数据,下次查询时更新缓存给......
  • Markdown 基本语法
    Markdown基本语法标题在单词或短语前添加井号(#)+一个空格,且井号(#)的数量代表标题的级别。一级标题:#我是一级标题二级标题:##我是二级标题可选语法:文本下方添加任......
  • 字符串总结2
    作者:​​xyw_Eliot​​char*和int,float等的格式化转换从字符串中提取指定类型数字或子串,这种情形也是非常的常见。大部分的情形都可以用sscanf()​和 sprintf() 这两......
  • 数列知识总结梳理
    本篇文章重点梳理数列章节相关的知识,以及在求解数列相关问题时比较常用且能较好地简便计算的方法。有关等差数列与等比数列的内容本文主要是以给出性质为主,中点在于后两部......
  • 12月8日内容总结——
    目录今日内容概要今日内容概要一、纯手撸web框架二、基于wsgiref模块三、代码封装优化四、动静态网页五、jinja2模块六、前端、后端、数据库三者联动七、python主流web框架......
  • c++ stl总结
    前言本篇是c++总结系列的stl篇,重点讲解容器,及effectivestl的总结stl原理stl提供六大部件,这六大部件可以彼此搭配工作,这六大部件是:容器。各种数据结构迭代器。扮演容......