当前位置: 首页 > news >正文

prometheus increase函数统计得到小数

今天发现prometheus的increase函数得到了小数,研究一下源码,以下是rate/increase/delta 对应的计算函数

https://github.com/prometheus/prometheus/blob/d77b56e88e3d554a499e22d2073812b59191256c/promql/functions.go#L55

// extrapolatedRate is a utility function for rate/increase/delta.
// It calculates the rate (allowing for counter resets if isCounter is true),
// extrapolates if the first/last sample is close to the boundary, and returns
// the result as either per-second (if isRate is true) or overall.
func extrapolatedRate(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper, isCounter bool, isRate bool) Vector {ms := args[0].(*parser.MatrixSelector)vs := ms.VectorSelector.(*parser.VectorSelector)var (//取样点对应的structsamples    = vals[0].(Matrix)[0]//取样的开始和结束时间rangeStart = enh.ts - durationMilliseconds(ms.Range+vs.Offset)rangeEnd   = enh.ts - durationMilliseconds(vs.Offset))// No sense in trying to compute a rate without at least two points. Drop// this Vector element.//如果只有1或0个取样点,则没法计算增量if len(samples.Points) < 2 {return enh.out}var (counterCorrection float64lastValue         float64)for _, sample := range samples.Points {if isCounter && sample.V < lastValue {//没看懂counterCorrection在干什么,但是不影响后面的理解,因为这里应该是要处理特殊情况,一般来说 sample.V < lastValue不应该成立,因为后一个点的值应该大于等于前一个点counterCorrection += lastValue}lastValue = sample.V}//最后一个计数点和第一个计数点之间的差值(粗略的结果)resultValue := lastValue - samples.Points[0].V + counterCorrection// Duration between first/last samples and boundary of range.//取样开始时间与第一个计数点时间之间的差值durationToStart := float64(samples.Points[0].T-rangeStart) / 1000//取样结束时间与最后一个计数点之间的差值durationToEnd := float64(rangeEnd-samples.Points[len(samples.Points)-1].T) / 1000//最后一个计数点与第一个计数点之间的差值sampledInterval := float64(samples.Points[len(samples.Points)-1].T-samples.Points[0].T) / 1000//计数点之间的时间间隔averageDurationBetweenSamples := sampledInterval / float64(len(samples.Points)-1)if isCounter && resultValue > 0 && samples.Points[0].V >= 0 {// Counters cannot be negative. If we have any slope at// all (i.e. resultValue went up), we can extrapolate// the zero point of the counter. If the duration to the// zero point is shorter than the durationToStart, we// take the zero point as the start of the series,// thereby avoiding extrapolation to negative counter// values.//这里的durationToZero是第一个计数点到零点(原始零点,就是整个表格的零点)之间的差值,如果durationToZero < durationToStart 就说明不正常,需要把durationToStart更新为durationToZero//至于为什么这么更新,可以看上面原文注释durationToZero := sampledInterval * (samples.Points[0].V / resultValue)if durationToZero < durationToStart {durationToStart = durationToZero}}// If the first/last samples are close to the boundaries of the range,// extrapolate the result. This is as we expect that another sample// will exist given the spacing between samples we've seen thus far,// with an allowance for noise.extrapolationThreshold := averageDurationBetweenSamples * 1.1extrapolateToInterval := sampledInterval//这个if一般来说会为true,因为extrapolationThreshold > averageDurationBetweenSamples,而正常情况下 durationToStart <= averageDurationBetweenSamples 会成立if durationToStart < extrapolationThreshold {extrapolateToInterval += durationToStart} else {extrapolateToInterval += averageDurationBetweenSamples / 2}//这里与durationToStart的情况一致if durationToEnd < extrapolationThreshold {extrapolateToInterval += durationToEnd} else {extrapolateToInterval += averageDurationBetweenSamples / 2}//这里根据之前的计算,会采取数学上的外推法来减少预测的误差//这里就是小数出现原因,resultValue原本是一个整数,但是经过外推法的调整,就有了小数部分resultValue = resultValue * (extrapolateToInterval / sampledInterval)if isRate {resultValue = resultValue / ms.Range.Seconds()}return append(enh.out, Sample{Point: Point{V: resultValue},})
}

从源码中可以看出,第一个和最后一个计数点之间的差值需要经过外推法计算才能得到最后的结果。一般来说,如果计数点之间的间隔为15s,每60s统计一次,每次统计则会收入4个计数点(而不是5个),也就只有三个时间间隔,因为计数点不会精确地卡在统计的开始和结束,所以会出现durationToBegin和durationToEnd,而durationToBegin + durationToEnd = 15s, 如图

回到我的问题上,在某个时间段内,我的table只增加了一个数据,计数间隔为15s时:

1.如果将统计间隔设为30s,则每次统计只会涵盖两个计数点(一个时间段),而这个增加的数据刚好就在两个计数点之间,所以最初resultValue=1,extrapolateToInterval=30s,sampledInterval=15s resultValue = resultValue * (extrapolateToInterval / sampledInterval) 后 resultValue=2

2.如果将统计间隔设为1min,则会涵盖四个计数点(三个时间段),所以最初resultValue=1,extrapolateToInterval=60s,sampledInterval=45s resultValue = resultValue * (extrapolateToInterval / sampledInterval) 后 resultValue=1.33 也就是4/3

3.如果将统计间隔设为2min,则会涵盖8个计数点(7个时间段),所以最初resultValue=1,extrapolateToInterval=120s,sampledInterval=105s resultValue = resultValue * (extrapolateToInterval / sampledInterval) 后 resultValue=1.143 也就是8/7

相关文章:

prometheus increase函数统计得到小数

今天发现prometheus的increase函数得到了小数&#xff0c;研究一下源码&#xff0c;以下是rate/increase/delta 对应的计算函数https://github.com/prometheus/prometheus/blob/d77b56e88e3d554a499e22d2073812b59191256c/promql/functions.go#L55// extrapolatedRate is a uti…...

C++学习记录——유 类和对象(3)

文章目录1、赋值运算符重载1、运算符重载1、理解2、运算符重载实例2、赋值运算符重载2、日期类的实现1、加减函数1、加函数2、减函数2、前/后置--重载3.两个日期相减其他1、流插入2、流提取日期类的整体实现代码: https://gitee.com/kongqizyd/start-some-c-codes-for-learning…...

基于Hi3861平台的OpenHarmony程序是如何启动运行的

一、前言 在继续后面课程的内容讲解前&#xff0c;我们要知道在H3861平台上编写的代码到底是如何启动的&#xff0c;这一点很重要。 先分析HelloWorld程序的启动运行流程&#xff0c;并顺便讲解OpenHarmony在H3861平台的&#xff0c;系统是从哪里启动的。 反着推导函数之间具体…...

2023彻底解决Typora使用iPic微博图床失效问题

一、问题描述用Typora搭配iPic图床使用&#xff0c;最近csdn图片显示不出来用浏览器打开图片显示403&#xff0c;这里原因是微博图床出问题了导致的而使用iPic其他图床则需要一直付费&#xff0c;那有没有一劳永逸的解决所有问题呢&#xff1f;二、旧图恢复首先怎么找回旧图&am…...

Revit中添加水平仰视平面图及水平剖面

一、 Revit中如何添加水平仰视平面图 在Revit平面视图中视角是俯视视角&#xff0c;但是在一些特殊的情况下&#xff0c;我们可能需要创建仰视视角的平面视图&#xff0c;例如我们需要向上看天花板的灯具布置的时候。 1.下面讲一下如何在添加仰视平面视图的方法。如图1在模型中…...

Python 循环语句

Python的循环语句&#xff0c;程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构&#xff0c;允许更复杂的执行路径。循环语句允许我们执行一个语句或语句组多次&#xff0c;下面是在大多数编程语言中的循环语句的一般形式&#xff1a;Python 提供了 for 循环和 whi…...

使用 ThreeJS 实现第一个三维场景(详)

文章目录参考描述index.html三维场景的基本实现导入 ThreeJS准备工作场景摄像机视锥体正交摄像机透视摄像机渲染器后续处理将摄像机添加至场景中移动摄像机设置画布尺寸将渲染器创建的画布添加到 HTML 元素中渲染物体结构材质合成将物体添加至场景中代码总汇执行效果动画reques…...

《小猫猫大课堂》三轮5——动态内存管理(通讯录动态内存化)

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重…...

【Selenium学习】Selenium 八大定位法

1.1 ID定位HTML Tag 的 id 属性值是唯一的&#xff0c;故不存在根据 id 定位多个元素的情况。下面以在百度首页搜索框输入文本“python”为例。搜索框的 id 属性值为“kw”&#xff0c;如图1.1所示&#xff1a;代码如下&#xff0c;“find_element_by_id”方法已废弃&#xff0…...

算法训练营 day41 贪心算法 单调递增的数字 买卖股票的最佳时机含手续费

算法训练营 day41 单调递增的数字 买卖股票的最佳时机含手续费 单调递增的数字 738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c…...

【数据结构-JAVA】排序

排序在现实生活中的应用可谓相当广泛&#xff0c;比如电商平台中&#xff0c;选购商品时&#xff0c;使用价格排序或是综合排序、高考填报志愿的时候&#xff0c;会参考全国大学排名的情况。下面介绍一些计算机中与排序相关的概念&#xff1a;排序&#xff1a;所谓排序&#xf…...

基于注解管理Bean

一、介绍从 Java 5 开始&#xff0c;Java 增加了对注解&#xff08;Annotation&#xff09;的支持&#xff0c;它是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下&#x…...

Containerd 的 Bug 导致容器被重建!如何避免?

作者简介邓宇星&#xff0c;SUSE Rancher 中国区软件架构师&#xff0c;6 年云原生领域经验&#xff0c;参与Rancher 1.x 到 Rancher 2.x 版本迭代&#xff0c;目前负责 Rancher For openEuler(RFO) 项目开发。最近我们关注到一个关于 containerd 运行时的 issue(​​https://g…...

win环境安装部署Jenkins

win环境安装部署Jenkins&#xff0c;2022年11月&#xff1a;从2022年 6 月 28 日发布的 Jenkins 2.357 和2022年9 月发布的 LTS 版本开始&#xff0c;Jenkins 需要 Java 11 才能使用&#xff0c;放弃 Java 8&#xff0c;如果用JDK1.8&#xff0c;那么Jenkins版本需要是2.357版本…...

网络变压器与不同芯片之间的匹配原则及POE通讯产品需要注意哪些方面

Hqst盈盛电子导读&#xff1a;网络变压器与不同芯片之间的匹配原则及POE通讯产品需要注意哪些方面网络变压器与不同芯片之间的匹配原则&#xff1a;一&#xff0c;电流型PHY芯片一般要配的网络变压器&#xff1a;1、变压器PHY侧3线共模电感 &#xff08;更适合POE产品&#xff…...

Spring WebFlux

目录 基于注解编程模型 函数式编程模型 传统的基于Servlet的Web框架,如Spring MVC,在本质上都是阻塞和多线程的,每个连接都会使用一个线程。在请求处理的时候,会在线程池中拉取一个工作者( worker )线程来对请求进行处理。同时,请求线程是阻塞的,直到工作者线程提示它已…...

C++基础面试题:new和malloc的区别

面试题&#xff1a;new和malloc的区别或new和malloc的异同 相同点&#xff1a; 1、new/delete和malloc/free它们都是内存申请和释放的函数。 2、new/delete和malloc/free 都要一一对应&#xff0c;调用了多少次new 就需要调用多少次delete&#xff1b;同 理调用多少次ma…...

WebDAV之葫芦儿·派盘+KMPlayer

KMPlayer 支持WebDAV方式连接葫芦儿派盘。 KMPlayer几乎可以播放您系统上所有的影音文件,支持几乎全部音视频格式。通过其强大的插件功能,可以支持层出不穷的新格式。软件还具有齐全的操控功能,支持捕获音频、捕获AVI、捕获画面、外挂字幕、自定义编辑设置,是视频爱好者的不…...

杨浦区人工智能及大数据(云计算)企业登记工作(2023年度)的通知

各相关单位&#xff1a; 根据《“长阳秀带”在线新经济产业集聚发展若干政策》&#xff08;杨府发〔2022〕2号&#xff09;及其实施细则的要求&#xff0c;现组织开展2023年度杨浦区人工智能与大数据(云计算&#xff09;企业登记备案工作,现将相关工作通知如下&#xff1a; 一…...

2023年去培训机构学前端还是Java?

选择专业肯定是优先考虑更有发展前景和钱途的专业。毕竟IT专业的培训费都不低&#xff0c;基本都要一两万左右&#xff0c;咱们花钱总是希望获得最大回报。 那么到底哪个更有发展前景呢&#xff1f; 零基础能学得会吗&#xff1f; 就业薪资如何呢&#xff1f; 前言 不知道大家有…...

【React】组件事件

React(二) 创建组件 函数组件 函数组件&#xff1a;使用JS的函数或者箭头函数创建的组件 使用 JS 的函数(或箭头函数)创建的组件&#xff0c;叫做函数组件约定1&#xff1a;函数名称必须以大写字母开头&#xff0c;React 据此区分组件和普通的 HTML约定2&#xff1a;函数组…...

黑/白盒测试说明

白盒测试白盒测试也称结构测试或逻辑驱动测试&#xff0c;它是按照程序内部的结构测试程序&#xff0c;通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行&#xff0c;检验程序中的每条通路是否都能按预定要求正确工作。白盒测试的测试方法有代码检查法、静态结…...

车道线检测-Eigenlanes 论文学习笔记

论文&#xff1a;《Eigenlanes: Data-Driven Lane Descriptors for Structurally Diverse Lanes》 代码&#xff1a;https://github.com/dongkwonjin/Eigenlanes 核心&#xff1a;在 Eigenlane Space 中检测车道线 创新点 Eigenlane&#xff1a;数据驱动的车道描述符&#xff…...

docker run mysql -e 的环境变量 Environment Variables

例子 sudo docker run -itd --name DockerMysqlLatest3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORDroot的密码 mysql:latest### root无密码 sudo docker run -itd --name Mysql57 -p 57:3306 -e MYSQL_ALLOW_EMPTY_PASSWORDroot mysql:5.7https://hub.docker.com/_/mysql?tabde…...

第17章 MongoDB 条件操作符教程

第17章 MongoDB 条件操作符教程 描述 条件操作符用于比较两个表达式并从mongoDB集合中获取数据。 在本章节中&#xff0c;咱们将讨论如何在MongoDB中使用条件操作符。 MongoDB中条件操作符有&#xff1a; (>) 大于 - $gt(<) 小于 - $lt(>) 大于等于 - $gte(< …...

电子技术——共源共栅放大器

电子技术——共源共栅放大器 之前我们提到过&#xff0c;提高基础增益单元&#xff08;共源放大器&#xff09;的一种方法是提高其 ror_oro​ 的阻值&#xff0c;之后我们学过共栅放大器作为电流缓冲器可以做到这一点&#xff0c;自然地我们就得到了终极解决方案&#xff0c;也…...

《MySQL学习》 事务隔离 与 MVCC

《MySQL学习》 事务隔离 一.事务的概念 事务保证一组数据要么全部成功要么全部失败&#xff0c;MySQL的事务基于引擎&#xff08;如InnoDB&#xff09;实现。 二.事务的隔离性与隔离级别 MySQL的标准隔离级别&#xff1a; 读未提交 &#xff1a; 一个事务还没提交时&#…...

html(二)基础标签

一 HTML中的注释 重点&#xff1a; 在哪写注释? 注释的形式? vs code和webstorm都可以通过 ctrl / 进行单行注释和取消注释 ① html中注释的形式 1) html文档中单行和多行注释是"<!-- -->" -->html2) 在html文档中,script标签…...

leetcode刷题---递归思想

leetcode刷题---递归思想&#xff09;1.1 递归介绍1.2 基本步骤1.3 代表题目1.3.1 入门题---青蛙跳1.3.2.1 初级题226.翻转二叉树112.路径总和1.3.3 中级题---汉诺塔问题1.3.4 进阶题---细胞分裂1.1 递归介绍 如果在函数中存在着调用函数本身的情况&#xff0c;这种现象就叫递…...

ThreadLocal 源码级别详解

ThreadLocal简介 稍微翻译一下&#xff1a; ThreadLocal提供线程局部变量。这些变量与正常的变量不同&#xff0c;因为每一个线程在访问ThreadLocal实例的时候&#xff08;通过其get或set方法&#xff09;都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静…...

怎么让别人看到自己做的网站/火狐搜索引擎

原文地址&#xff1a;https://blog.csdn.net/u011080472/article/details/51337422 多任务和高并发的内存交互...

南昌建站系统外包/今日小说搜索百度风云榜

最新的 Firefox 2 版本为 Firefox 2.0.0.14&#xff0c; Firefox 3 版本为 Firefox 3.0rc1。主流依然是 Firefox 2.0.0.14&#xff0c;但由于在不久的将来 Firefox 2 会升级到 Firefox 3&#xff0c;对于我们前端是好消息&#xff08;更好更优的功能&#xff09;&#xff0c;也…...

如何用图片做网站背景/百度投流运营

java中int和Integer的区别 一看就懂int 是基本类型&#xff0c;直接存数值integer是对象&#xff0c;用一个引用指向这个对象1.Java 中的数据类型分为基本数据类型和复杂数据类型int 是前者>>integer 是后者(也就是一个类)Integer 是对象类型 int是原始类型 适用场合有很…...

设计小程序多少钱/seo推广小分享

Activity之间传数据时&#xff0c;为了避免麻烦&#xff0c;往往会将一些值封装成对象&#xff0c;然后将整个对象传递过去。传对象的时候有两种情况&#xff0c;一种是实现Parcelable接口&#xff0c;一种是实现Serializable接口。0、解释两种接口&#xff1a;1&#xff09;实…...

如何做微网站平台/百度世界排名

ios操作系统的流畅度非常的高&#xff0c;因此人们都愿意购买 苹果 的手机。大家都知道苹果智能手机的售价是非常昂贵的&#xff0c;并不是社会上每一个人都可以负担得起的。有非常多的消费者为了可以达到非常好的操作体验&#xff0c;因此有非常多人们都会购买安卓智能手机&am…...

网站建设招聘要求/seo培训

1、Python中的列表和元组有什么区别&#xff1f; 列表是动态数组&#xff0c;它们不可变且可以重设长度&#xff08;改变其内部元素的个数&#xff09;。 元组是静态数组&#xff0c;它们不可变&#xff0c;且其内部数据一旦创建便无法改变。 元组缓存于Python运行时环境&…...