Instant vector - 一组时间序列,其中包含每个时间序列的一个样本,它们共享相同的时间戳
Range vector - 一组时间序列,其中包含每个时间序列随时间变化的一系列数据点
Scalar - 一个简单的数值浮点值
String - 一个简单的字符串值;
例如:
http_requests_total
{}表示过滤 http_requests_total{job="prometheus",group="canary"}
支持以下操作
=: 完全相等
!=: 不相等
=~:正则匹配字符串或子串
!~: 正则不匹配字符串或子串
vector selectors必须指定一个名称或至少一个与空字符串不匹配的标签匹配器。下面的表达式是非法的。 {job=~".*"} # Bad! 应该改为 {job=~".+"} # Good! {job=~".*",method="get"} # Good! __name__ 标签 http_requests_total 等价于 {__name__="http_requests_total"} 以下可以查找job开头的所有指标 {__name__=~"job:.*"}
时间单位
s - seconds m - minutes h - hours
d - days w - weeks y - years
以下表示最后5分钟内匹配标签的指标 http_requests_total{job="prometheus"}[5m] offset modifier 偏移修改器允许更改查询中的单个瞬间和范围向量的时间偏移量 以下表示与当前时间相隔5分钟的指标 http_requests_total offset 5m
+ - * / 除 % 取模 ^ 幂
== != > < >= <=
and 交集 or 并集 unless 补集
常见1对1,和多对一/一对多 一对一匹配 method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m 一对多和多对一 method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
sum min max avg stddev 计算总体标准差除以维数 stdvar 计算总体标准方差除以维度 count count_values 计算具有相同值的元素的数量 bottomk 最小k个元素的样本值 topk 最大k个元素的样本值 quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) 分位数(分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等)
^ *, /, % +, - ==, !=, <=, <, >=, > and, unless or 然而 ^ 从右开始, 所以 2 ^ 3 ^ 2 = 2 ^ (3 ^ 2)
abs(v instant-vector) 绝对值 absent(v instant-vector) 判断指标数据是否存在,在预警时非常有用 absent(nonexistent{job="myjob"}) # => {job="myjob"} absent(nonexistent{job="myjob",instance=~".*"}) # => {job="myjob"} absent(sum(nonexistent{job="myjob"})) # => {} ceil(v instant-vector) 大于等于当前的最小整数 changes(v range-vector) 返回给定时间范围内改变值的数量 clamp_max(v instant-vector, max scalar) max的上限 clamp_min(v instant-vector, min scalar) min的下限 day_of_month(v=vector(time()) instant-vector) 一个月中的日,返回值1-31 day_of_week(v=vector(time()) instant-vector) 一礼拜的星期几,0-6,0是礼拜天 days_in_month(v=vector(time()) instant-vector) 一月的天数,28-31 delta(v range-vector) 以下返回现在和2个小时之前cpu的温度差 delta(cpu_temp_celsius{host="zeus"}[2h]) deriv(v range-vector) 计算距离向量中时间序列的二阶导数 使用线性表达式 具体查看 https://en.wikipedia.org/wiki/Simple_linear_regression exp(v instant-vector) 指数 Exp(+Inf) = +Inf Exp(NaN) = NaN floor(v instant-vector) 小于当前的最近整数 histogram_quantile() 直方图(P-浮点,B瞬时矢量)从柱状图B的直方图中计算出(0到1之间)的π-分位数。(参阅直方图和摘要,详细解释了PH-分位数和直方图度量类型的用法。)B中的样本是每个桶中的观测值。每个样本必须有标签LE,其中标签值表示桶的包含上限。(没有这种标签的样本被忽略)。直方图度量类型自动提供与桶桶后缀和适当标签的时间序列。 holt_winters(v range-vector, sf scalar, tf scalar) 根据V的范围产生时间序列的平滑值,平滑因子SF越低,对旧数据的重要性就越大。趋势因 子TF越高,数据的趋势越大。SF和TF必须在0和1之间 hour(v=vector(time()) instant-vector) 小时,0-23 idelta(v range-vector) 计算最后两个之间的区别 increase(v range-vector) 计算向量范围内,时间序列的增长值。increase只能用计数器 irate(v range-vector) 计算每秒的速率。基于最后两个数据点。irate和聚合操作一起时, irate优先,然后聚合 label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...) 标签加入 label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string) 标签替换 ln(v instant-vector) 自然对数 ln(+Inf) = +Inf ln(0) = -Inf ln(x < 0) = NaN ln(NaN) = NaN log2(v instant-vector) 二进制对数计算的所有元素 log10(v instant-vector) 十进制对数计算的所有元素 minute(v=vector(time()) instant-vector) 分钟,0-59 month(v=vector(time()) instant-vector) 月,1-12 predict_linear(v range-vector, t scalar) 预测线性(V范围向量,T标量)基于距离向量V,利用简单线性回归预测从现在开始的时间序列T秒的值。 rate(v range-vector) 计算每秒的增加的平均速率。用于计数器 resets(v range-vector) 返回计数器reset的数量,两个样本之间值变小,作为一个计数器reset round(v instant-vector, to_nearest=1 scalar)在所有的样本值在元素v到最近的整数。to_nearest参数允许指定的最近倍数 ,对采样值进行舍入 scalar(v instant-vector) 返回样本单个元素值,没有返回NaN sort(v instant-vector) 根据值升序排列 sort_desc() 降序排列 sqrt(v instant-vector) 开方 time() 返回从1970 1月1号到现在的秒数 timestamp(v instant-vector) 返回样本的时间戳 vector(s scalar) 返回标量s作为载体的标签 year(v=vector(time()) instant-vector) 返回年 <aggregation>_over_time() avg_over_time(range-vector)平均值 : 所有的点在该指定间隔。 min_over_time(range-vector): 在所有点的最小值在指定的间隔。 max_over_time(range-vector)将最大的值 : 在所有点的指定区间。 sum_over_time(range-vector)所有值的总和 : 在指定的间隔。 count_over_time(range-vector)计数 : 将所有的值在指定的间隔。 quantile_over_time(scalar, range-vector) 分位数φ (0 ≤ φ ≤ 1) 的值在指定的间隔。 stddev_over_time(range-vector) : 标准偏差值在指定的间隔。 stdvar_over_time(range-vector): 标准方差的值在指定的间隔。 注意,即使在整个区间内的值不是相等的间隔,在指定的间隔中的所有值在聚合中都具有相同的权重
收集到 node_exporter 的数据后,我们可以使用 PromQL 进行一些业务查询和监控,下面是一些比较常见的查询。
注意:以下查询均以单个节点作为例子,如果大家想查看所有节点,将 instance=“xxx” 去掉即可。
100 - (avg by (instance) (irate(node_cpu{instance="xxx", mode="idle"}[5m])) * 100)
avg by (instance, mode) (irate(node_cpu{instance="xxx"}[5m])) * 100
node_load1{instance="xxx"} // 1分钟负载 node_load5{instance="xxx"} // 5分钟负载 node_load15{instance="xxx"} // 15分钟负载
100-(node_memory_MemFree_bytes{instance="192.168.119.69:9796"}+node_memory_Cached_bytes{instance="192.168.119.69:9796"}+node_memory_Buffers_bytes{instance="192.168.119.69:9796"})/node_memory_MemTotal_bytes{instance="192.168.119.69:9796"}*100
100 - node_filesystem_free_bytes{mountpoint = "/",instance="xxx",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} / node_filesystem_size_bytes{mountpoint = "/",instance="xxx",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} * 100 或者你也可以直接使用 {fstype="xxx"} 来指定想查看的磁盘信息
// 上行带宽 sum by (instance) (irate(node_network_receive_bytes_total{instance="xxx",device!~"bond.*?|lo"}[5m])/128) // 下行带宽 sum by (instance) (irate(node_network_transmit_bytes_total{instance="xxx",device!~"bond.*?|lo"}[5m])/128)
// 入包量 sum by (instance) (rate(node_network_receive_bytes_total{instance="xxx",device!="lo"}[5m])) // 出包量 sum by (instance) (rate(node_network_transmit_bytes_total{instance="xxx",device!="lo"}[5m]))
写 irate(node_disk_writes_completed_total{instance=~"^192.168.119.68:9796",device=~"[a-z]*[a-z]"}[5m]) //IOPS读 查询条件 String IOPSRead = "sum without(device) (node_disk_reads_completed_total{instance=~\"^" + instance + "\"})"; node_disk_reads_completed_total/node_disk_read_time_seconds_total 读 irate(node_disk_reads_completed_total{instance=~"^192.168.119.68:9796",device=~"[a-z]*[a-z]"}[5m])
sum by(component) (irate(apiserver_request_total[5m]))
avg by(component)((sum by(component)(apiserver_request_duration_seconds_sum))/(sum by(component)(apiserver_request_duration_seconds_count)))
sum (scheduler_schedule_attempts_total)
sum (scheduler_schedule_attempts_total{result!="scheduled"})
1- (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])))
100 * (1 - sum(node_memory_MemAvailable_bytes) / sum(node_memory_MemTotal_bytes))
(sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"}) - sum(node_filesystem_free_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"}) ) / sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"}) * 100
sum (machine_cpu_cores{node=~"^.*$"})
(1 - (avg(irate(node_cpu_seconds_total{mode="idle",node=~"^.*$"}[5m])))) * sum(machine_cpu_cores{node=~"^.*$"})
sum (machine_memory_bytes{node=~"^.*$"})
sum(node_memory_MemTotal_bytes{device!~"rootfs|HarddiskVolume.+",node =~"^.*$"}) - sum(node_memory_MemAvailable_bytes{device!~"rootfs|HarddiskVolume.+",node =~"^.*$"})
sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"})
sum(node_filesystem_size_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"}) - sum(node_filesystem_free_bytes{device!~"rootfs|HarddiskVolume.+",node=~"^.*$"})
sum (kube_node_status_capacity_pods) 不用---> sum(kube_pod_status_phase{namespace=~".*", phase=~".*"})
sum(kubelet_running_pod_count) sum(kube_pod_status_phase{namespace=~".*", phase="Running"})