1.表达式语言数据类型 instant vector 瞬时向量 - 它是指在同一时刻,抓取的所有度量指标数据。这些度量指标数据的key都是相同的,也即相同的时间戳。 range vector 范围向量 - 它是指在任何一个时间范围内,抓取的所有度量指标数据。 scalar 标量 - 一个简单的浮点值 string 字符串 - 一个当前没有被使用的简单字符串 1.1 字符串 PromQL遵循与Go相同的转义规则。在单引号,双引号中,反斜杠成为了转义字符,后面可以跟着a, b, f, n, r, t, v 或者\。 可以使用八进制(\nnn)或者十六进制(\xnn, \unnnn和\Unnnnnnnn)提供特定字符。 ( ps :在反引号内不处理转义字符) 1.2 浮点数 标量浮点值可以直接写成形式-[.(digits)]。 1.3 即时向量 瞬时向量选择器可以对一组时间序列数据进行筛选,并给出结果中的每个结果键值对(时间戳-样本值): 最简单的形式是,只有一个度量名称被指定。在一个瞬时向量中这个结果包含有这个度量指标名称的所有样本数据键值对。 可以采用不匹配的标签值也是可以的,或者用正则表达式不匹配标签。标签匹配操作如下所示: = 精确地匹配标签给定的值 != 不等于给定的标签值 =~ 正则表达匹配给定的标签值 != 给定的标签值不符合正则表达式 1.4 范围向量 范围向量类似瞬时向量, 不同在于,它们从当前实例选择样本范围区间。在语法上,时间长度被追加在向量选择器尾部的方括号[]中,用以指定对于每个样本范围区间中的每个元素应该抓取的时间范围样本区间。 时间长度有一个数值决定,后面可以跟下面的单位: s - seconds m - minutes h - hours d - days w - weeks y - years 在下面这个例子中, 选择过去5分钟内,度量指标名称为http_requests_total, 标签为job= "prometheus" 的时间序列数据: http_requests_total{job=”prometheus”}[5m] 偏移修饰符 这个offset偏移修饰符允许在查询中改变单个瞬时向量和范围向量中的时间偏移 例如,下面的表达式返回相对于当前时间的前5分钟时的时刻, 度量指标名称为http_requests_total的时间序列数据: http_requests_total offset 5m 注意:offset偏移修饰符必须直接跟在选择器后面,例如: sum (http_requests_total{method=”GET”} offset 5m} // GOOD. 2.操作符 2.1 二元操作符 2.1.1 算术二元运算符 + 加法 - 减法 * 乘法 / 除法 % 模 ^ 幂等 2.1.2 比较二元操作符 == 等于 != 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于 2.1.3 逻辑/集合二元操作符 and 交集 or 并集 unless 补集 2.2 向量匹配 向量之间的匹配是指右边向量中的每一个元素,在左边向量中也存在。这里有两种基本匹配行为特征: 一对一,找到这个操作符的两边向量元素的相同元素。默认情况下,操作符的格式是vector1 [operate] vector2。如果它们有相同的标签和值,则表示相匹配。ingoring关键字是指,向量匹配时,可以忽略指定标签。on关键字是指,在指定标签上进行匹配。 多对一和一对多的匹配,是指向量元素中的一个样本数据匹配标签到了多个样本数据标签。这里必须直接指定两个修饰符group_left或者group_right, 左或者右决定了哪边的向量具有较高的子集。 2.3 聚合操作符 sum (在维度上求和) max (在维度上求最大值) min (在维度上求最小值) avg (在维度上求平均值) stddev (求标准差) stdvar (求方差) count (统计向量元素的个数) count_values (统计相同数据值的元素数量) bottomk (样本值第k个最小值) topk (样本值第k个最大值) quantile (统计分位数) 2.4 二元运算符优先级 a ^ b *, /, % c +, - d ==, !=, <=, <, >=, > e and, unless f or 3.函数 abs() abs( v instant-vector)返回输入向量的所有样本的绝对值。 举例: abs(search_associational_word_optimizing) >10 absent() absent( v instant-vector),如果赋值给它的向量具有样本数据,则返回空向量;如果传递的瞬时向量参数没有样本数据,则返回不带度量指标名称且带有标签的样本值为1的结果 当监控度量指标时,如果获取到的样本数据是空的, 使用absent方法对告警是非常有用的 absent(nonexistent{job=”myjob”}) # => key: value = {job=”myjob”}: 1 absent(nonexistent{job=”myjob”, instance=~”.*”}) # => {job=”myjob”} 1 so smart ! absent( sum (nonexistent{job=”myjob”})) # => key:value {}: 0 ceil() ceil( v instant-vector) 是一个向上舍入为最接近的整数。 changes() changes( v range-vector) 输入一个范围向量, 返回这个范围向量内每个样本数据值变化的次数。 clamp_max() clamp_max( v instant-vector, max scalar)函数,输入一个瞬时向量和最大值,样本数据值若大于max,则改为max,否则不变 clamp_min() clamp_min( v instant-vector)函数,输入一个瞬时向量和最大值,样本数据值小于min,则改为min。否则不变 count_saclar() count_scalar( v instant-vector) 函数, 输入一个瞬时向量,返回key:value=”scalar”: 样本个数。而count()函数,输入一个瞬时向量,返回key:value=向量:样本个数,其中结果中的向量允许通过by条件分组。 delta() delta( v range-vector)函数,计算一个范围向量 v 的第一个元素和最后一个元素之间的差值。返回值:key:value=度量指标:差值 下面这个表达式例子,返回过去两小时的CPU温度差: delta(cpu_temp_celsius{host=”zeus”}[2h]) delta函数返回值类型只能是gauges。 deriv() deriv( v range-vector)函数,计算一个范围向量 v 中各个时间序列二阶导数,使用简单线性回归 deriv二阶导数返回值类型只能是gauges。 drop_common_labels() drop_common_labels(instant-vector)函数,输入一个瞬时向量,返回值是key:value=度量指标:样本值,其中度量指标是去掉了具有相同标签。 例如:http_requests_total{code=”200”, host=”127.0.0.1:9090”, method=”get”} : 4, http_requests_total{code=”200”, host=”127.0.0.1:9090”, method=”post”} : 5, 返回值: http_requests_total{method=”get”} : 4, http_requests_total{code=”200”, method=”post”} : 5 histogram_quantile() histogram_quatile(φ float, b instant-vector) 函数计算b向量的φ-直方图 (0 ≤ φ ≤ 1) 。 例子; histogram_quantile(0.99, sum (rate(grpc_server_handling_seconds_bucket{job= "etcd" ,grpc_type= "unary" }[5m])) by (grpc_service, grpc_method, le )) > 0.15 holt_winters() holt_winters( v range-vector, sf scalar, tf scalar)函数基于范围向量 v ,生成事件序列数据平滑值。平滑因子sf越低, 对老数据越重要。趋势因子tf越高,越多的数据趋势应该被重视。0< sf, tf <=1。 holt_winters仅用于gauges idelta() idelta( v range-vector)函数,输入一个范围向量,返回key: value = 度量指标: 每最后两个样本值差值。 例子: idelta(elasticsearch_cluster_health_number_of_nodes[2m]) < 0 increase() increase( v range-vector)函数, 输入一个范围向量,返回:key:value = 度量指标:last值-first值,自动调整单调性,如:服务实例重启,则计数器重置。与delta()不同之处在于delta是求差值,而increase返回最后一个减第一个值,可为正为负。 下面的表达式例子,返回过去5分钟,连续两个时间序列数据样本值的http请求增加值。 increase(http_requests_total{job=”api-server”}[5m]) increase(airflow_dag_run_state{dag= "realtime-log-10min_job" ,state= "success" }[20m]) < 1 increase的返回值类型只能是counters,主要作用是增加图表和数据的可读性,使用rate记录规则的使用率,以便持续跟踪数据样本值的变化。 irate() irate( v range-vector)函数, 输入:范围向量,输出:key: value = 度量指标: (last值-last前一个值)/时间戳差值。它是基于最后两个数据点,自动调整单调性, 如:服务实例重启,则计数器重置。 下面表达式针对范围向量中的每个时间序列数据,返回两个最新数据点过去5分钟的HTTP请求速率。 irate(http_requests_total{job=”api-server”}[5m]) irate只能用于绘制快速移动的计数器。因为速率的简单更改可以重置FOR子句,利用警报和缓慢移动的计数器,完全由罕见的尖峰组成的图形很难阅读。 例子: sum (irate(rt:client:requests{client= "srch-search-master-s2" }[3m])) < 0.01 label_replace() 对于 v 中的每个时间序列,label_replace( v instant-vector, dst_label string, replacement string, src_label string, regex string) 将正则表达式与标签值src_label匹配。如果匹配,则返回时间序列,标签值dst_label被替换的扩展替换。$1替换为第一个匹配子组,$2替换为第二个等。如果正则表达式不匹配,则时间序列不会更改。 另一种更容易的理解是:label_replace函数,输入:瞬时向量,输出:key: value = 度量指标: 值(要替换的内容:首先,针对src_label标签,对该标签值进行regex正则表达式匹配。如果不能匹配的度量指标,则不发生任何改变;否则,如果匹配,则把dst_label标签的标签纸替换为replacement 下面这个例子返回一个向量值a带有foo标签: label_replace(up{job= "api-server" , serice= "a:c" }, "foo" , "$1" , "service" , "(.*):.*" ) predict_linear() predict_linear( v range-vector, t scalar)预测函数,输入:范围向量和从现在起t秒后,输出:不带有度量指标,只有标签列表的结果值。 例如:predict_linear(http_requests_total{code= "200" ,instance= "120.77.65.193:9090" ,job= "prometheus" ,method= "get" }[5m], 5) 结果: {code= "200" ,handler= "query_range" ,instance= "120.77.65.193:9090" ,job= "prometheus" ,method= "get" } 1 rate() rate( v range-vector)函数, 输入:范围向量,输出:key: value = 不带有度量指标,且只有标签列表:(last值-first值)/时间差s rate(http_requests_total[5m]) 结果: {code= "200" ,handler= "label_values" ,instance= "120.77.65.193:9090" ,job= "prometheus" ,method= "get" } 0 rate()函数返回值类型只能用counters, 当用图表显示增长缓慢的样本数据时,这个函数是非常合适的。 注意:当rate函数和聚合方式联合使用时,一般先使用rate函数,再使用聚合操作, 否则,当服务实例重启后,rate无法检测到counter重置。 例子:rate(kafka_MessagesInPerSec{rate= "OneMinuteRate" }[30s]) > 500 resets() resets()函数, 输入:一个范围向量,输出:key-value=没有度量指标,且有标签列表[在这个范围向量中每个度量指标被重置的次数]。在两个连续样本数据值下降,也可以理解为counter被重置。 示例: resets(http_requests_total[5m]) 结果: {code= "200" ,handler= "label_values" ,instance= "120.77.65.193:9090" ,job= "prometheus" ,method= "get" } 0 resets只能和counters一起使用。 round() round( v instant-vector, to_nearest 1= scalar)函数,与ceil和floor函数类似,输入:瞬时向量,输出:指定整数级的四舍五入值, 如果不指定,则是1以内的四舍五入。 scalar() scalar( v instant-vector)函数, 输入:瞬时向量,输出:key: value = “scalar”, 样本值[如果度量指标样本数量大于1或者等于0, 则样本值为NaN, 否则,样本值本身] sort () sort ( v instant-vector)函数,输入:瞬时向量,输出:key: value = 度量指标:样本值[升序排列] sort_desc() sort ( v instant-vector函数,输入:瞬时向量,输出:key: value = 度量指标:样本值[降序排列] 例子: sort_desc(avg by(name)(irate(container_memory_usage_bytes{name!= "" }[5m]))*100) > 1024*10^3*2 |