PromQL
查询结果主要有3种类型:
- 瞬时数据(Instant vector):包含一组时序,每个时序只有一个点,例如:http_requests_total
#直接使用监控指标名称查询 :返回指标名称为http_requests_total的所有时间序列
http_requests_total 等同于 http_requests_total{}
#支持用户根据时间序列的标签匹配模式来对时间序列进行过滤
#目前主要支持两种匹配模式:
#完全匹配
label=value #选择那些标签满足表达式定义的时间序列;
label!=value #根据标签匹配排除时间序列;
#例1:可查询到image与pod_name均不为空的结果
container_cpu_usage_seconds_total{image!="",pod_name!=""}
#正则匹配
label=~regx#符合正则表达式定义的时间序列;
label!~regx#进行排除;
http_requests_total{environment=~"staging|testing|development",method!="GET"} #多个表达式之间使用|进行分离
#例2:可查询到namespace以“chenjian-”为开头,后续随意的所有字段
container_cpu_usage_seconds_total{namespace=~"^chenjian-.*"}
- 区间数据(Range vector):包含一组时序,每个时序有多个点
#时间范围通过时间范围选择器[]进行定义()
http_requests_total{}[5m] #区间向量表达式,选择以当前时间为基准,5分钟内的数据
#可以使用offset时间位移操作
http_request_total{} offset 5m #5分钟前的瞬时样本数据
- 纯量数据(Scalar):纯量只有一个数字,没有时序
count(http_requests_total)
10
操作符:
#通过指标node_memory_free_bytes_total获取当前主机可用的内存空间大小,其样本单位为Bytes。客户端要求使用MB作为单位响应数据,那只需要将查询到的时间序列的样本值进行单位换算即可
node_memory_free_bytes_total / (1024 * 1024)
布尔运算过滤时间序列
[运算符(==:相等,!=:不相等,>:大于,<:小于,>=大于等于,<=小于等于)]
#内存使用率超过95%的主机
(node_memory_bytes_total - node_memory_free_bytes_total) / node_memory_bytes_total > 0.95
bool修饰改变运算符的行为
#HTTP请求量是否>=1000 大于等于1000则返回1(true)否则返回0(false)
http_requests_total > bool 1000
#如果是在两个标量之间使用布尔运算
2 == bool 2 # 结果为1
集合运算(and,or,unless排除):默认与右向量中的所有元素进行匹配
匹配模式
依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没找到匹配元素,则直接丢弃
操作符两侧表达式返回的向量标签不一致的情况下
#on(label list)用于将匹配行为限定在某些便签之内
#ignoring(label list)可以在匹配时忽略某些便签
一对一: vector1 vector2
#过去5分钟内,HTTP请求状态码为500的在所有请求中的比例
#method_code:http_errors:rate5m{code="500"} 忽略code标签 匹配method:http_requests:rate5m
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
多对一和一对多:指的是“一”侧的每一个向量元素可以与"多"侧的多个元素匹配的情况
#在这种情况下,必须使用group修饰符:group_left或者group_right来确定哪一个向量具有更高的基数(充当“多”的角色)
#使用group修饰符group_left指定左向量具有更好的基数(多对一)
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
聚合操作:
#without用于从计算结果中移除列举的标签,而保留其它标签
avg without(cpu) (rate(node_cpu[2m])) #将cpu去除后聚合
#by则正好相反,结果向量中只保留列出的标签,其余标签则移除
sum(http_requests_total) by (code,handler,job,method)
查询系统所有http请求的总量
sum(http_request_total)
min (最小值)
max (最大值)
avg (平均值)
stddev (标准差)
stdvar (标准差异)
count (计数)
count_values (对value进行计数)
bottomk (后n条时序)
topk (前n条时序)
topk(10, http_requests_total) #查询当前系统中,访问量前10的HTTP地址
quantile (分布统计):用于计算当前样本数据值的分布情况
#quantile(φ, express)其中0 ≤ φ ≤ 1
#当φ为0.5时,即表示找到当前样本数据中的中位数
quantile(0.5, http_requests_total)
常用内置函数和使用
1.计算Counter指标增长率
irate:区间向量中最后两个两本数据来计算区间向量的增长速率,可以避免在时间窗口范围内的“长尾问题”,并且体现出更好的灵敏度,通过irate函数绘制的图标能够更好的反应样本数据的瞬时变化状态(用于计算区间向量中时间序列每秒的即时增长率)
#按照主机查询各个主机的CPU使用率
sum(sum(irate(node_cpu{mode!='idle'}[5m])) / sum(irate(node_cpu[5m]))) by (instance)
increase()/rate():可以计算在单位时间内样本数据的变化情况即增长率
#node_cpu[2m]获取时间序列最近两分钟的所有样本,increase计算出最近两分钟的增长量,最后除以时间120秒得到node_cpu样本在最近两分钟的平均增长率
increase(node_cpu[2m]) / 120
rate(node_cpu[2m])
2.预测Gauge指标变化趋势
#predict_linear()对数据的变化趋势进行预测
#预测系统磁盘空间在4个小时之后的剩余情况
predict_linear(node_filesystem_free{job="node"}[1h], 4 * 3600)
3.统计Histogram指标的分位数
histogram_quantile(φ float, b instant-vector)函数进行计算
φ(0<φ<1)表示需要计算的分位数,如果需要计算中位数φ取值为0.5
histogram_quantile(0.5, http_request_duration_seconds_bucket)
4.动态替换标签
#up指标可以获取到当前所有运行的Exporter实例以及其状态
up{instance="localhost:8080",job="cadvisor"} 1
#label_replace标签为时间序列添加额外的标签(会依次对v中的每一条时间序列进行处理,通过regex匹配src_label的值,并将匹配部分relacement写入到dst_label标签中)
label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
label_replace(目标metric, 添加的label, 匹配内容, 目标label, 正则匹配)
例如:
数据:up{instance="localhost:9100",job="node"} 1
公式:label_replace(up, "host", "$1", "instance", "(.*):.*")
结果:up{host="localhost",instance="localhost:9100",job="node"} 1