写点什么

Prometheus 内置函数(四)

用户头像
耳东@Erdong
关注
发布于: 刚刚

minute()

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

month()

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

predict_linear()

predict_linear(v range-vector, t scalar) 函数可以预测时间序列 v 在 t 秒后的值。它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势做出预测。该函数的返回结果不带有度量指标,只有标签列表。


例如,基于 2 小时的样本数据,来预测主机可用磁盘空间的是否在 4 个小时候被占满,可以使用表达式:predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0


通过下面的例子来观察返回值:


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{code="200",handler="prometheus",instance="120.77.65.193:9090",job="prometheus",method="get"} 4283.449995397104{code="200",handler="static",instance="120.77.65.193:9090",job="prometheus",method="get"} 22.99999999999999...
复制代码


例如, 预测四个小时内每个文件系统剩余的可用空间量。


predict_linear(node_filesystem_free_bytes{instance="192.168.1.107:9100"}[1h],4 * 3600)==>  {device="/dev/mapper/ubuntu--vg-lv--0",fstype="ext4", instance="192.168.1.107:9100", job="linux_exporter", mountpoint="/"}    81532763513.3# 等同于deriv(node_filesystem_free_bytes{instance="192.168.1.107:9100"}[1h] * 4 * 3600) + node_filesystem_free_bytes{instance="192.168.1.107:9100"}[1h] 
复制代码


这个函数一般只用在 Gauge 类型的时间序列上。

rate()

rate(v range-vector) 函数可以直接计算区间向量 v 在时间窗口内平均增长速率,它会在单调性发生变化时(如由于采样目标重启引起的计数器复位)自动中断。该函数的返回结果不带有度量指标,只有标签列表。


例如,以下表达式返回区间向量中每个时间序列过去 5 分钟内 HTTP 请求数的每秒增长率:


rate(http_requests_total[5m])结果:{code="200",handler="label_values",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="query_range",instance="120.77.65.193:9090",job="prometheus",method="get"} 0{code="200",handler="prometheus",instance="120.77.65.193:9090",job="prometheus",method="get"} 0.2
复制代码


rate() 函数返回值类型只能用计数器,在长期趋势分析或者告警中推荐使用这个函数。


当将 rate() 函数与聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)一起使用时,必须先执行 rate() 函数,然后再进行聚合操作,否则当采样目标重新启动时 rate() 无法检测到计数器是否被重置。

resets()

resets(v range-vector) 的参数是一个区间向量。对于每个时间序列,它都返回一个计数器重置的次数。两个连续样本之间的值的减少被认为是一次计数器重置。


下面我们看一个例子,显示进程的 CPU 时间在过去一个小时重置的次数。


resets(process_cpu_seconds_total[1h])==> {instance="localhost:9090", job="prom-Server"}  0 
复制代码


这个函数一般只用在计数器类型的时间序列上。

round()

round(v instant-vector, to_nearest=1 scalar) 函数与 ceilfloor 函数类似,返回向量中所有样本值的最接近的整数。to_nearest 参数是可选的,默认为 1,表示样本返回的是最接近 1 的整数倍的值。你也可以将该参数指定为任意值(也可以是小数),表示样本返回的是最接近它的整数倍的值。


round(vector(6.5)) # 7round(vector(6.4)) # 6 
复制代码

scalar()

scalar(v instant-vector) 函数的参数是一个单元素的瞬时向量,它返回其唯一的时间序列的值作为一个标量。如果度量指标的样本数量大于 1 或者等于 0, 则返回 NaN。


# 1.处理标量常量且仅仅适用于瞬时向量的数学函数scalar(sqrt(vector(4)))  # >> scalar  2
# 2.与时间函数连用scalar(year()) # >> scalar 2021
# 3.为你提供计算机CPU非空闲的时间比例(使用scalar会丢失所有的标签)sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) / scalar(count(node_cpu_seconds_total{mode="idle"})) # {} 0.017490234375018142
复制代码

sgn()

sgn(v instant-vector) 返回一个向量,该向量将所有样本值转换为其符号,定义如下:如果 v 是正的,则为 1;如果 v 是负的,则为-1;如果 v 等于 0,则为 0。

sort()

sort(v instant-vector) 函数对向量按元素的值进行升序排序,返回结果:key: value = 度量指标:样本值[升序排列]


正序


sort(node_load5{}) 
复制代码

sort_desc()

sort(v instant-vector) 函数对向量按元素的值进行降序排序,返回结果:key: value = 度量指标:样本值[降序排列]。


反序


sort_desc(node_load5{}) 
复制代码

sqrt()

sqrt(v instant-vector) 函数计算向量 v 中所有元素的平方根。

time()

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

timestamp()

timestamp(v instant-vector) 函数返回向量 v 中的每个样本的时间戳(从 1970-01-01 到现在的秒数)。


该函数从 Prometheus 2.0 版本开始引入, 与其它时间函数不同的是,它查看瞬时向量中的样本的时间戳而不是值。


例子 1


timestamp(vector(time()))  
==> {} 1629783662.714
复制代码


例子 2,可以看到每个目标的最后异常抓取的开始时间。


timestamp(up) ==> {instance="localhost:9090", job="Server"} 1629783745.147
复制代码


例子 3,返回 Prometheus 启动节点导出器抓取时间与节点导出器认为的当前实践的差值。


node_time_seconds - timestamp(node_time_seconds) ==> {instance="192.168.1.107:9100", job="linux_exporter"} 0.0025420188903808594 
复制代码

vector()

vector(s scalar) 函数将标量 s 作为没有标签的向量返回,即返回结果为:key: value= {}, s。例如,vector(1024) 返回 {} 1024例如,sum(node_not_metrics) 或者 vector(1024) 返回 {} 1024,不存在的指标也始终返回一个样本。

year()

year(v=vector(time()) instant-vector) 函数返回被给定 UTC 时间的当前年份。


注意: 即使区间向量内的值分布不均匀,它们在聚合时的权重也是相同的。


实例演示:


1.查看进程是哪一年开始运行


year(process_start_time_seconds) ==>  {instance="localhost:9090", job="Server"} 2021
复制代码


2.计算本月启动的进程的时间序列


year(process_start_time_seconds) == bool scalar(year())  * (month(process_start_time_seconds) == bool scalar(month()))==>  {instance="localhost:9090", job="Server"} 1==>  {instance="192.168.1.225:9100", job="linux_exporter"} 0
复制代码


3.计算本月启动的进程的时间序列个数


sum(year(process_start_time_seconds) == bool scalar(year())  * (month(process_start_time_seconds) == bool scalar(month())))  
==> {} 1
复制代码


Tips : 乘法运算符在布尔值使用时就像和运算符一样值 1 表示真,否则为假。

<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) : 区间向量内每个度量指标的样本数据值分位数,φ-quantile (0 ≤ φ ≤ 1)。

  • stddev_over_time(range-vector) : 区间向量内每个度量指标的总体标准差。

  • stdvar_over_time(range-vector) : 区间向量内每个度量指标的总体标准方差。


这些值指定间隔内的所有值在聚合中具有相同的权重,即使这些值在整个间隔内的间隔不相等。

发布于: 刚刚阅读数: 2
用户头像

耳东@Erdong

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
Prometheus 内置函数(四)