关于 Prometheus increase 和 sum 指标使用总结

概述

网上查询关于increase的使用知道大概,但当具体使用时,关于其指标详情理解,仍然云里雾里,本人在使用过程中,关于该指标,有以下总结,在文末部分,sum函数会结合increase一起分析,讲解实际遇到的问题。

increase官网描述

increase(v range-vector) calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.

从官网的描述可以得到如下信息:

  1. 横坐标是时间范围;
  2. 计算的结果可能包含小数,由此可知increase 所得结果并不是简单的减法所得。

increase函数案例分析

以如下案例做进一步讲解,下面这个指标主要用来计算 K8S Pod什么时间发生重启,并重启多少次 :
increase(kube_pod_container_status_restarts_total{k8s_cluster_name=~"$k8s_cluster_name", pod=~".*$container_name.*", pod!~".*istio-proxy.*"}[24h])

Increase 指标
从上图可以可以得出以下结论:

  1. increase 函数本周期的First 的取值源自上个计算周期的Mean 值,如果计算周期是 24h,即改值是上个24小时的Mean 值;
  2. Mean 值是由 Total/Count 得出;
  3. 如果一个 Pod 中的 container 重启了多次,但后续时间段没有再发生重启,则该 Pod 在后续时间范围会是一条非0直线,如上图所示;
  4. 一个 Pod 如果连续多天发生重启失败然后反复重启的情况,则该Pod在非0纵坐标上会有小波浪线组成的直线,如下图所示 hip-fast-design-service-6769b7b6f5-9d2z Pod, 会一直在255,256,255…之间波动,如下所示,Pod 的状态会是Waiting 和 Terminated 之间轮询切换;
    在这里插入图片描述
    在这里插入图片描述
  5. 根据 increase 指标,求 sum,会四舍五入得到整数数值,如下所示:
    在这里插入图片描述

sum 函数结合 increase函数的案例分析

由上面可知,increase 所获得的值可能包含小数点,而 sum 函数在求和后会四舍五入进行取整,这样会导致一些监控指标项所得结果会有偏差,以下面统计 24 小时之内,Pod 和 Service层级(比如一个deployment服务可能包含多个副本,即多个Pod)两个层级重启的次数。
下面的左边服务层级计算所得是178,但右边169+4+4 所得是177,结果不一样。
左边的计算公式是sum(increase(kube_pod_container_status_restarts_total{deployment_environment="prod", container=~"$container_name"}[24h])) by (container) >0 ,右边是sum(increase(kube_pod_container_status_restarts_total{deployment_environment="prod", container=~"$container_name"}[24h])) by (pod) >0,两遍区别是公式最后的by container 和 by pod。
左边的by container 是直接在increase原值169.12+4.28+4.22=177.62相加之后在取整,如下图所示,根据四舍五入所以得到178,右边的by pod 是各自根据pod直接取整,因为三个值,小数部分都小于5,被舍去,所以得到169/4/4。
在这里插入图片描述
通过在Grafana的explorer中进一步分析,可知,
在这里插入图片描述
另外补充,当对sum 函数的值做聚合,比如group by 计算时,需要特别注意,计算的结果在 Panel上面显示是整数,但实际上仍然包含小数部分(如果有),所以在group by 之前,必须取整,可以看下面截图的案例:
在这里插入图片描述这里用到了线性计算Unary operationfloor操作,即去掉小数部分,然后再group by
在这里插入图片描述

Prometheus PromQL(Prometheus Query Language)是用于查询分析 Prometheus 时间序列数据的查询语言。它提供了丰富的功能表达能力,使用户能够根据自己的需求灵活地检索、聚合计算指标数据。 PromQL 支持以下主要操作: 1. 选择时间序列:通过指定指标名称一组标签来选择特定的时间序列。例如,`http_requests_total{job="api-server", status="200"}` 选择 `http_requests_total` 指标的 `job` 标签值为 "api-server" 且 `status` 标签值为 "200" 的时间序列。 2. 聚合操作:可以对选择的时间序列进行各种聚合操作,如求、平均值、最大值、最小值等。例如,`sum(http_requests_total)` 对 `http_requests_total` 指标的所有时间序列进行求。 3. 算术操作:可以对选择的时间序列进行加减乘除等算术运算。例如,`http_requests_total{job="api-server"} - http_errors_total{job="api-server"}` 计算 `http_requests_total` `http_errors_total` 之间的差值。 4. 函数操作:PromQL 提供了许多内置函数,如 `rate()`、`increase()`、`irate()` 等,用于计算速率增长率等指标。例如,`rate(http_requests_total{job="api-server"}[5m])` 计算 `http_requests_total` 指标的 5 分钟速率。 5. 筛选操作:可以使用一些条件操作符对时间序列进行筛选过滤。例如,`http_requests_total > 100` 筛选出 `http_requests_total` 指标值大于 100 的时间序列。 通过组合嵌套这些操作,用户可以编写复杂的查询语句来获取所需的指标数据,并支持可视化告警等应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值