4--PromQL的基本使用

PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很多,在日常数据可视化以及rule 告警中都会使用到它。

在页面 http://localhost:9090/graph 中,输入下面的查询语句,如下

一、查询结果类型

PromQL 查询结果主要有 3 种类型:
    1、瞬时数据(Instant vector): 包含一组时序,每个时序只有一个点
 
    2、区间数据(Range vector): 包含一组时序,每个时序有多个点
 
    3、纯量数据(Scalar): 纯量只有一个数字,没有时序

1.瞬时数据(lnstant vector)

kubelet_http_requests_total

2.区间数据(range vector)

[5m] : 5分钟以内的数据
    s:seconds
    m:minutes
    h:hours
    d:days
    w:weeks
    y:years
Offset :查看多少分钟之前的数据

1).查询五分钟前到目前的数据

kubelet_http_requests_total[5m]

2)查询30分钟之前的数据

kubelet_http_requests_total offset 30m

3)查询30到前25分钟的数据

kubelet_http_requests_total [5m] offset 30m

3.纯量数据(scalar)

count(kubelet_http_requests_total)
 
#count 统计监控项的job

二、数据类型

prometheus的底层数据模型有四种。
 
Counter:---->只增不减的计数器
cpu运行时间
http请求数
 
gauge:  ---->可增可减的
系统负载情况
内存使用情况
 
Histogram & Summary  --->用于统计分析样本的分布情况
http平均响应时间

三、查询条件

Prometheus 存储的是时序数据,而它的时序是由名字和一组标签构成的,其实名字也可

1.标签等值查询

container_spec_cpu_quota{container="config-reloader"}
# 或
container_spec_cpu_quota{container=~"config-reloader"}

2.标签不等值查询

container_spec_cpu_quota{container!="config-reloader"}

3.查询条件支持正则匹配

1)正则匹配

container_spec_cpu_quota{container=~"config.*"}
# 或
container_spec_cpu_quota{container=~".*re.*"}

2)正则剔除

container_spec_cpu_quota{container!~".*re.*"}
# 或
container_spec_cpu_quota{container!~".*config.*"}

3)匹配两个值

container_spec_cpu_quota{container=~"kube-flannel|.*config.*"}

四、操作符

https://prometheus.io/docs/prometheus/latest/querying/operators/

1.算术运算符

+ (添加)
- (减法)
* (乘法)
/ (除法)
% (取模)
^ (幂)

计算内存使用率

node_memory_MemFree_bytes/node_memory_MemTotal_bytes * 100

2.比较运算符

== (等于)
!= (不等于)
> (大于)
< (小于)
>= (大于等于)
<= (小于等于)

计算内存小于1G

node_memory_MemFree_bytes / 1024^2 < 1024

练习

1:计算所有的节点的使用内存
	node_memory_MemTotal_bytes  - node_memory_MemFree_bytes 
	
2:计算计算机内存使用率
	(node_memory_MemTotal_bytes  - node_memory_MemFree_bytes ) / node_memory_MemTotal_bytes * 100

3:计算机内存使用率超过50%有哪些节点
	(node_memory_MemTotal_bytes  - node_memory_MemFree_bytes ) / node_memory_MemTotal_bytes * 100 > 50

4:计算机请求数大于5900并且小于5950
	kubelet_http_requests_total > 5900 and  kubelet_http_requests_total < 5950

3.逻辑运算符

and 且
or  或
unless 非

alertmanager_cluster_messages_sent_total > 440 and alertmanager_cluster_messages_sent_total < 500

alertmanager_cluster_messages_sent_total > 440 or alertmanager_cluster_messages_sent_total < 400

alertmanager_cluster_messages_sent_total > 440 unless alertmanager_cluster_messages_sent_total < 400

4.聚合运算符

sum (求和)
min (求最小值)
max (求最大值)
avg (求平均值)
group (结果向量中的所有值均为1)
stddev (计算标准差)
        方差的算术平方根
stdvar (计算标准方差)
count (统计元素的数量)
    count(alertmanager_cluster_messages_sent_total)
count_values (统计相同值的元素的数量)
 
bottomk (获取元素最小的k个元素)
    bottomk(2,alertmanager_cluster_messages_sent_total)
 
topk (获取元素最大k个元素)
    topk(2,alertmanager_cluster_messages_sent_total)
 
quantile (在整个尺寸上计算φ分位数(0≤φ≤1))
    quantile(0.3,alertmanager_cluster_messages_sent_total)

1)求和

sum(alertmanager_cluster_messages_sent_total)

2)最小值

min(alertmanager_cluster_messages_sent_total)

3)最大值

max(alertmanager_cluster_messages_sent_total)

4)平均值

avg(alertmanager_cluster_messages_sent_total)

5.特殊查询

根据不同的标签查询

sum(alertmanager_cluster_messages_sent_total) by (pod)

6.操作符运算优先级

^
*,/,%
+, -
==,!=,<=,<,>=,>
and, unless
or
 
运算符号与计算对象要以空格分开
和数学中一样,()可以代表一个整体,优先计算

五、内置函数

https://prometheus.io/docs/prometheus/latest/querying/functions/

1.increase(v range-vector)函数获取区间向量中的第一个和最后一个样本并返回其增长量

返回区间向量中每个时间序列过去 5 分钟内 HTTP 请求数的增长数:
increase(http_requests_total{job="apiserver"}[5m])
 
计算磁盘的IO延迟:
increase(node_disk_io_time_ms{host_ip=~".+"}[2m]) / (increase(node_disk_reads_completed[2m]) + increase(node_disk_writes_completed[2m]

2.rate(v range-vector) 函数可以直接计算区间向量 v 在时间窗口内平均每秒增长速率

返回区间向量中每个时间序列过去 5 分钟内 HTTP 请求数的每秒增长率:
rate(http_requests_total[5m])

3.irate(v range-vector) 函数用于计算区间向量的增长率,但是其反应出的是瞬时增长率

irate 函数是通过区间向量中最后两个两本数据来计算区间向量的增长速率,它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。
 
这种方式可以避免在时间窗口范围内的“长尾问题”,并且体现出更好的灵敏度,通过irate函数绘制的图标能够更好的反应样本数据的瞬时变化状态。
 
irate 只能用于绘制快速变化的计数器,在长期趋势分析或者告警中更推荐使用 rate 函数。因为使用 irate 函数时,速率的简短变化会重置 FOR 语句,形成的图形有很多波峰,难以阅读。
返回区间向量中每个时间序列过去 5 分钟内最后两个样本数据的 HTTP 请求数的增长率:
irate(http_requests_total{job="api-server"}[5m])

4.delta(v range-vector) 的参数是一个区间向量,返回一个瞬时向量。 它计算一个区间向量 v 的第一个元素和最后一个元素之间的差值

返回过去两小时的 CPU 温度差:
delta(cpu_temp_celsius{host="zeus"}[2h])

5.sort排序

sort(alertmanager_cluster_messages_sent_total)

6.sort_desc倒叙

sort_desc(alertmanager_cluster_messages_sent_total)

7.ceil向上取整

ceil(node_filesystem_free_bytes/1024^2)

8.floor向下取整

floor(node_filesystem_free_bytes/1024^2)

9.round四舍五入

round(node_filesystem_free_bytes/1024^2)

六、grafana模板导入

1、去官方选择合适的模板

https://grafana.com/grafana/dashboards/

2、复制对应id

3.grafana导入

posted @ 2021-09-04 13:13  小绵  阅读(473)  评论(0编辑  收藏  举报