PromQL 语句使用 https://prometheus.io/docs/prometheus/latest/querying/basics/
Prometheus 提供一个函数式的表达式语言PromQL (Prometheus Query Language),可以使用户实时地查找和聚合时间序列数据,表达式计算结果可以在图表中展示,也可以在 Prometheus 表达式浏览器中以表格形式展示, 或者作为数据源, 以 HTTP API 的方式提供给外部系统使用。
PromQL 数据基础 数据分类 1 2 3 4 5 6 7 瞬时向量、瞬时数据(instant vector):是一组时间序列,每个时间序列包含单个数据样本,比如node_memory_MemTotal_bytes查询当前剩余内存就是一个瞬时向量,该表达式的返回值中只会包含该时间序列中的最新的一个样本值,而相应的这样的表达式称之为瞬时向量表达式,例如: prometheus_http_requests_tota 范围向量、范围数据(range vector):是指在任何一个时间范围内,抓取的所有度量指标数据.比如最近一天的网卡流量趋势图,例如: prometheus_http_requests_total[5m] 标量、纯量数据(scalar):是一个浮点数类型的数据值,使用 node_load1 获取到时一个瞬时向量, 但是可用使用内置函数scalar()将瞬时向量转换为标量,例如: scalar(sum(node_load1)) 字符串(string):字符串类型的数据,目前使用较少
数据类型
Counter : 计数器, Counter 类型代表一个累积的指标数据, 在没有被重置的前提下只增不减,比如磁盘I/O 总数、nginx的请求总数、网卡流经的报文总数等。
Gauge : 仪表盘, Gauge 类型代表一个可以任意变化的指标数据, 值可以随时增高或减少,如带宽速录、CPU负载、内存利用率、nginx 活动连接数等。
例如在Graph 的 Gauge 查看 node_load1 可以看到相对应图标指标
Histogram:累积直方图 , Histogram 会在一段时间范围内对数据进行采样 (通常是请求持续时间或响应大小等), 假如每分钟产生一个当前的活跃连接数, 那么一天就会产生1440个数据, 查看数据的每间隔的绘图跨度为2小时, 那么2点的柱状图 (bucket) 会包含 0点 到 2点 即两个小时的数据, 而 4点 的柱状图 (bucket) 则会包含0点到 4点 的数据 , 而 6点 的柱状图 (bucket) 则会包含 0点 到 6点 的数据。
1 2 3 4 5 6 7 8 9 10 prometheus_tsdb_compaction_chunk_range_seconds_bucket # TYPE go_gc_heap_frees_by_size_bytes_total histogram go_gc_heap_frees_by_size_bytes_total_bucket[le="8.999999999999998"] 1.489766e+06 go_gc_heap_frees_by_size_bytes_total_bucket[le="24.999999999999996"] 3.1621269e+07 go_gc_heap_frees_by_size_bytes_total_bucket[le=" 64.99999999999999 "] 3.9805887e+07 go_gc_heap_frees_by_size_bytes_total_bucket[le="144.99999999999997"] 4.5192143e+07 go_gc_heap_frees_by_size_bytes_total_bucket [le=" 320.99999999999994"] 4.5981675e+07 go_gc_heap_frees_by_size_bytes_total_bucket[le="704.9999999999999 "] 4.6231281e+07 go_gc_heap_frees_by_size_bytes_total_bucket[le="1536.9999999999998") 4.6293065e+07 go_gc_heap_frees_by_size_bytes_total_bucket[le=" 3200.9999999999995"] 4.6357758e+07
1 2 3 4 5 6 7 8 9 10 11 12 Summary: 摘要,也是一组数据,统计的不是区间的个数而是统计分位数,从0到1,表示是0%~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 go_gc_duration_seconds {quantile="0.5"} 9.3605e-05 go_gc_duration_seconds {quantile="0.75"} 0.000133103 #百分75的go_gc_duration_seconds的持续时间 go_gc_duration_seconds {quantile="1"} 0.004022673 go_gc_duration_seconds_sum 1.446781088 go_gc_duration_seconds_count 7830
PromQL-指标数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 node_memory_MemTotal_bytes #查询node节点总内存大小 node_memory_MemFree_bytes #查询node节点剩余可用内存 node_memory_MemTotal_bytes{instance="192.168.15.100:9100"} #基于标签查询指定节点的总内存 node_memory_MemFree_bytes{instance="192.168.15.100:9100"} #基于标签查询指定节点的可用内存 node_disk_io_time_seconds_total{device="sda"} #查询指定磁盘的每秒磁盘io node_filesystem_free_bytes{device="/dev/sda1",fstype="xfs", mountpoint="/"} #查看指定磁盘的磁盘剩余空间 # 例如查询 node_filesystem_free_bytes{device="/dev/sda1" } 指定查看 # HELP node_loadl 1m load average. # TYPE node_loadl 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
PromeQL-匹配器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 = :选择与提供的字符串完全相同的标签,精确匹配。 != :选择与提供的字符串不相同的标签,去反。 =~ :选择正则表达式与提供的字符串(或子字符串)相匹配的标签。 !~ :选择正则表达式与提供的字符串(或子字符串)不匹配的标签。 # 查询格式 <metric name>{<label name>=<label value>, ...} node_loadl {instance="192.168.15.100:9100"} node_loadl {job="promethues-node"} node_load1{job="promethues-node",instance="192.168.15.100:9100"} #精确匹配 node_load1{job="promethues-node",instance!="192.168.15.100:9100"} #取反 node_loadl{instance=~"192.168.15.100.*:9100$"} #包含正则且匹配 node_loadl{instance!~"192.168.15.100:9100"} #包含正则且取反
PromQL-时间范围 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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="192.168.15.100:9100"}[5m]
PromQL-运算符 1 2 3 4 5 6 7 8 9 10 11 + 加法 - 减法 * 乘法 / 除法 % 模 ^ 幕等 node_memory_MemFree_bytes/1024/1024 #将内存进行单位从字节转行为兆 node_disk_read_bytes_total{device="sda"} + node_disk_written_bytes_total{device="sda"} # 计算磁盘读写数据量
PromQL-聚合运算 max、min、avg 1 2 3 4 5 6 7 8 9 10 max() #最大值 min() #最小值 avg() #平均值 # 计算每个节点的最大的流量值: max(node_network_receive_bytes_total) by (instance) # 计算每个节点最近五分钟每个device的最大流量 max(rate(node_network_receive_bytes_total[5m])) by (device)
sum、sount 1 2 3 4 5 6 7 8 9 10 11 sum() #求数据值相加的和(总数) sum(prometheus_http_requests_total) {} 2495 #最近总共请求数为2495次,用于计算返回值的总数(如http请求次数) count() #统计返回值的条数 count(node_os_version) {} 2 #一共两条返回的数据,可以用于统计节点数、pod数量等 count_values() #对value的个数(行数)进行计数 count_values("node_version",node_os_version) #统计不同的系统版本节点有多少
abs、absent 1 2 3 4 5 6 7 8 9 abs() #返回指标数据的值 abs(sum(prometheus_http_requests_total{handler="/metrics"})) absent() #如果监指标有数据就返回空,如果监控项没有数据就返回1,可用于对监控项设置告警通知 absent(sum(prometheus_http_requests_total{handler="/metrics"})) # 当一个指标没有返回数据,则返回1如 : {} 1 # 比如说查询 absent(sum(prometheus_http_requests_total{handler="/metricsAAA" })) # 则是没有数据,会返回 {} 1
stddev、stdvar 1 2 3 4 5 stddev() #标准差 stddev(prometheus_http_requests_total) #5+5=10,1+9=10,1+9这一组的数据差异就大,在系统是数据波动较大,不稳定 stdvar() #求方差 stdvar(prometheus_http_requests_total)
topk、bottomk 1 2 3 4 5 6 7 topk() #样本值排名最大的N个数据 # 取从大到小的前6个 topk(6, prometheus_http_requests_total) bottomk() #样本值排名最小的N个数据 # 取从小到大的前6个 bottomk(6, prometheus_http_requests_total)
rate、irate 1 2 3 4 5 6 7 rate() #函数是专门搭配counter数据类型使用函数,功能是取counter数据类型在这个时间段中平均每秒的增量平均数 rate(prometheus_http_requests_total[5m]) rate(node_network_receive_bytes_total[5m]) irate() #函数是专门搭配counter数据类型使用函数,功能是取counter数据类型在这个时间段中平均每秒的峰值 irate(prometheus_http_requests_total[5m]) irate(node_network_receive_bytes_total[5m])
by、without 1 2 3 4 5 6 # 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)