及时向量选择器:返回列表


= :等于

up{job="kafka"}

!= :不等于

up{job!="kafka"}

=~:等于正则表达式,也就是说正则表达式说了算

up{job=~"pod-.*"}

!~ :不等于正则表达式,正则匹配到的都不算

up{job!~"pod-.*"}

同一个字段可以写多个条件:如下 mountpoint 字段

node_filesystem_size_bytes{job="kubernetes-node-exporter",mountpoint=~"/etc/.*",mountpoint!~"/etc/host.*"}

等效的两种查询模式:

{__name__="http_requests_total"}
http_requests_total

查询以某个字符开头的所有指标:如下示例是查询以etcd开头的所有指标。

{__name__=~"etcd.*"}

安标签值查找:如下查找所有code=200记录

{code="200"}



区间向量选择器:返回多个样本


获取一分钟内的样本:后面的m是单位,有s、m、h、d、w、y。是以当前时间为基准的。

process_cpu_seconds_total [1m]

如图一分钟内有4个数据样本,两分钟就会有8个。


时间偏移操作 offset:

查看15分钟之前的数据:

process_resident_memory_bytes{job="pod-jmx"} offset 15m
process_resident_memory_bytes{job="pod-jmx"} [1m]offset 15m

简单求和 sum:

sum(http_requests_total)

按照by后面的字段进行聚合计算:

sum(http_requests_total) by (env, instance)

去除without后面的字段进行聚合计算:

sum(http_requests_total) without (env, instance)

最大值 max:将组内最大值作为返回值

返回每个组中最大的那个值。

max by(instance)(node_filesystem_size_bytes)

如图每一行就是一组聚合。

去除某些值来进行计算:

max without(mountpoint,device)(node_filesystem_size_bytes)

最小值 min:返回组内的最小值

去除某些字段求最小值。

min without(mountpoint,device)(node_filesystem_size_bytes)

对某些字段求最小值:

min by(mountpoint,device)(node_filesystem_size_bytes)

平均值 avg:

计算每个CPU每分钟的空闲时间。

avg without(cpu,mode) (rate(node_cpu_seconds_total{mode="idle"}[1m]))
avg by(cpu,mode) (rate(node_cpu_seconds_total{mode="idle"}[1m]))

标准差 stddev:反应数据波动大小,数据波动越大值越大。

stddev(http_requests_total)

标准差参考:

www.cnblogs.com/chanshuyi/p/04_quick_start_of_promql.html

标准方差stdvar:标准差的平方

stdvar(http_requests_total)

统计 count:

如下示例为统计主机磁盘设备数量。

count without(device)(node_disk_written_bytes_total)

值统计 count_values:

对相同values进行计数,统计每个样本值的出现次数,目前没有示例。

排序:

topk:对请求数前5进行排序。

topk(5, http_requests_total)

buttomk:对请求数倒数前5的进行排序。

bottomk(5, http_requests_total)

计算当前样本数据值的分布情况:当第一个参数的值为0.5时表示取样本数据的中位数。第一个参数值在0到1之间。

quantile(0.5, http_requests_total)

sort_desc 倒序:

sort_desc()

sort_asc 正序:

sort_asc()



运算符


算术运算符:

变量与标量之间运算得到的是一组数据。

如获取内存使用率:

1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)

获取磁盘读写时间总量:将左边的标签和右边的标签完全一致的进行运算,找不到则丢弃。

node_disk_written_bytes_total+node_disk_read_bytes_total

关系运算符:

==、!=、>、<、>=、<=

如下示例:在运算符之后加上bool关键字可以让结果返回0或1。

99 >= bool 88

变量与标量之间的运算:结果为true的保留,为false的丢弃。

如下示例:获取主机状态为ESTABLISHED的大于30的。

node_netstat_Tcp_CurrEstab > 30

即时向量与即时向量的运算:返回一组结果,用于过滤,匹配不到的将被丢弃,表达式不为true将被丢弃,在运算符后加bool返回0或1。

node_disk_written_bytes_total > bool node_disk_read_bytes_total


向量匹配:

一对一匹配:

即两遍拥有的标签完全相同,找到唯一一条条目依次进行匹配。

process_open_fds / process_max_fds

如果两边拥有的标签不一致可以用 on 或 ignoring 关键字修改标签间的匹配行为。

on:指定要匹配的标签,只匹配指定的标签。

ignoring:忽略某些标签,就是指定的这些标签不匹配,其他的都匹配。

如下示例中只对 instance 和 job 两个标签进行匹配。

sum by(instance, job) (rate(node_cpu_seconds_total{mode="idle"}[5m])) 
/ on (instance, job) 
sum by(instance, job) (rate(node_cpu_seconds_total [5m] ))

两个即时向量进行比较时都会返回左边的表达式:

如下示例都会返回左边的表达式:可以根据需求来写表达式。

process_open_fds < process_max_fds
process_max_fds >  process_open_fds

一对多或多对一匹配:

group_left:左边有更多的子集

group_right:右边有更多的子集

语法:

如下示例为左边的每组的每一个mode生成一个输出样本。

sum without (cpu)(rate(node_cpu_seconds_total [5m])) 
/ ignoring(mode) group_left 
sum without (mode, cpu)(rate(node_cpu_seconds_total [5m]))


逻辑运算符:

and、or、unless,与或非

用于向量之间,以多对多的方式工作。

vector1 and vector2

规则:vector1瞬时向量中的每个样本数据与vector2向量中的所有样本数据进行标签匹配,不匹配的,全部丢弃。运算结果是保留左边的度量指标名称和值。

employee_age_bucket{le=~"30|40|50"} and employee_age_bucket{le=~"40|50|60"}

vector1 or vector2

规则: 保留vector1向量中的每一个元素,对于vector2向量元素,则不匹配vector1向量的任何元素,则追加到结果元素中。

employee_age_bucket{le=~"30|40|50"} or employee_age_bucket{le=~"40|50|60"}

vector1 unless vector2

规则:包含在vector1中的元素,但是该元素不在vector2向量所有元素列表中,则写入到结果集中。

employee_age_bucket{le=~"30|40|50"} unless employee_age_bucket{le=~"40|50|60"}

运算符优先级:

^





*
/
%



+
-




==
!=
<=
<
>=
>
and
unless




or






函数


数学函数:

绝对值函数:

abs():返回每个值的绝对值

abs(process_open_fds{addr="10.32.121.21:9121",instance="10.32.121.21:9121"})

返回的结果中会去掉指标名称:

{addr="10.32.121.21:9121",instance="10.32.121.21:9121",ip="10.32.121.21",job="redis"}

sqrt():平方根

sqrt(process_open_fds{instance="10.32.121.21:9121"})

round():四舍五入

round(sqrt(process_open_fds{instance="10.32.121.21:9121"}))

保留小数:后面的 0.001 表示保留三位小数

round(sum(irate(nginx_ingress_controller_requests{service="trust"}[2m])) by (ingress), 0.001)

clamp_max:设置上限,输入一个瞬时向量和最大值,样本数据值若大于max,则改为max,否则不变

clamp_max(process_open_fds, 100)

clamp_minx:设置下限,输入一个瞬时向量和最大值,样本数据值小于min,则改为min。否则不变

clamp_min(process_open_fds, 100)


时间函数:

time():返回从1970-01-01到现在的秒数,注意:它不是直接返回当前时间,而是时间戳

查看进程运行了多长时间:

time() - process_start_time_seconds

minute():minute(v=vector(time()) instant-vector)函数返回给定UTC时间当前小时的第多少分钟。结果范围:0~59。

hour():hour(v=vector(time()) instant-vector)函数返回被给定UTC时间的当前第几个小时,时间范围:0~23。

month():month(v=vector(time()) instant-vector)函数返回给定UTC时间当前属于第几个月,结果范围:0~12。

year():year(v=vector(time()) instant-vector) 返回年份

year查看进程是那一年启动的:

year(process_start_time_seconds)

day_of_month():day_of_month(v=vector(time()) instant-vector)函数,返回被给定UTC时间所在月的第几天。返回值范围:1~31。

运行了多少个月了:

day_of_month(process_start_time_seconds)

day_of_week():day_of_week(v=vector(time()) instant-vector)函数,返回被给定UTC时间所在周的第几天。返回值范围:0~6. 0表示星期天。

days_in_month():days_in_month(v=vector(time()) instant-vector)函数,返回当月一共有多少天。返回值范围:28~31.


标签操作函数:

label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)

label_join()


指标增长率:要与计数器一起使用。

increase():获取样本的第一个样本和最后一个样本,并返回其增长量

increase(process_cpu_seconds_total [3m])

rate():rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果。结果比较平缓。

rate(process_cpu_seconds_total [3m])

irate():在一组数据中取最后两个数据点来计算区间增长速率。结果波动幅度大。通常用于计算每秒请求率。

irate(process_cpu_seconds_total [3m])


指标趋势变化预测:

gauge():

如根据之前1小时的数据来预测磁盘是否在未来4小时占满。

predict_linear(node_filesystem_free_bytes{job="es-dev"} [1h], 4*3600) < 0

参考:

cnblogs.com/wayne-liu/p/9273492.html

更多函数见官方文档:

prometheus.io/docs/prometheus/2.23/querying/functions/


常用示例:


内存使用率:

(1 - (node_memory_MemAvailable_bytes{job="kubernetes-node-exporter"}) / (node_memory_MemTotal_bytes{job="kubernetes-node-exporter"})) * 100

磁盘使用率:

((node_filesystem_size_bytes{mountpoint="/data-disk",device=~"/dev/sda3|/dev/sda4"} - node_filesystem_free_bytes{mountpoint="/data-disk",device=~"/dev/sda3|/dev/sda4"}) / node_filesystem_size_bytes{mountpoint="/data-disk",device=~"/dev/sda3|/dev/sda4"}) * 100

磁盘使用率:

(1 - (node_filesystem_free_bytes{device=~"/dev.*",mountpoint!~"/var/lib/.*|/boot"} / node_filesystem_size_bytes{device=~"/dev.*",mountpoint!~"/var/lib/.*|/boot"})) * 100

CPU使用率:仪表盘

(1-(sum(increase(node_cpu_seconds_total{mode="idle"}[1m]))by(instance))/(sum(increase(node_cpu_seconds_total[1m]))by(instance)))*100

CPU使用率:表格

(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance,kubernetes_node)) * 100

POD 非正常状态:

count(kube_pod_status_phase{phase!="Running",phase!="Succeeded"} > 0) by (pod,phase,namespace)

Pod每分钟重启次数:

sum(irate(kube_pod_container_status_restarts_total [1m])) by (namespace,pod) > 0

Pod入流量:

sum by(pod_name)(irate(container_network_receive_bytes_total[1m]))

每分钟Pod使用cpu:

sum by(pod_name)(irate(container_cpu_usage_seconds_total[1m]))

Pod内存使用:

sum by(pod_name)(irate(container_memory_working_set_bytes[1m]))

节点运行的Pod数量:

sum(kubelet_running_pod_count) by(instance)

节点运行的容器数量:

sum(kubelet_running_container_count) by(instance)


POD资源使用总量三连:

按应用统计POD内存使用总量:

sort_desc(sum(container_memory_usage_bytes{image!=""}) by (container_name, image))

按应用统计POD CPU使用总量:

sum by (container_name)( rate(container_cpu_usage_seconds_total{image!=""}[5m]))

按应用统计POD 流量出入总量:

入流量:

sort_desc(sum by (pod_name) (rate (container_network_receive_bytes_total{name!=""}[5m])))

出流量:

sort_desc(sum by (pod_name) (rate (container_network_transmit_bytes_total{name!=""}[5m])))


POD资源监控三连:

POD 内存使用率:

sum(container_memory_rss{image!=""}) by(pod_name, namespace) / sum(container_spec_memory_limit_bytes{image!=""}) by(pod_name, namespace) * 100 != +inf

POD CPU使用率:

sum(rate(container_cpu_usage_seconds_total{image!=""}[1m])) by (pod_name, namespace) / (sum(container_spec_cpu_quota{image!=""}/100000) by (pod_name, namespace)) * 100

POD 文件系统使用量:

sum(container_fs_usage_bytes{image!=""}) by(pod_name, namespace) / (1024*1024*1024)


资源统计:

内存使用率:多个节点加起来的内存使用率

(1 - sum(node_memory_MemAvailable_bytes) / sum(node_memory_MemTotal_bytes))

CPU使用率:多个节点CPU的使用率

(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[2m])))


节点流量统计:

下载带宽:单位:bits/sec(SI)

max(rate(node_network_receive_bytes_total[2m])*8) by (instance)

上传带宽:单位:bits/sec(SI)

max(rate(node_network_transmit_bytes_total[2m])*8) by (instance)


其他参考:

help.aliyun.com/document_detail/176180.html?utm_content=g_1000230851