Micrometer counter成为双倍而不是长期的动机是什么?用户是否有理由计算部分更改?在计数超过尾数(我相信约为20亿)之后,它将如何继续测量增量?
有多个原因,计数器是双精度而不是长整数。与任何架构一样,它平衡了权衡。
千分尺是其他度量标准框架的基础,double
是最通用的选项。
例如,Prometheus对其计数器使用double值,并且通过坚持使用相同的类型,可以最大程度地提高兼容性。
作为Prometheus之所以使用double
的另一个原因,是在内部将所有度量标准视为相同,从而简化其体系结构并优化其性能和内存利用率。尽管这是一个不同的话题,需要讨论。
虽然大多数计数器使用的是递增单个事件。在测量其他内容(如接收的字节,已处理的行等)时,计数器仍然是可行的选择。尽管这些示例都不是部分计数。这并不会阻止用户提出他们要测量部分计数的用例。一个例子可能是“花费数秒的处理时间”,因为部分秒数在计算中很常见。某些系统会以毫秒或纳秒为单位来测量整个单位,让我们接下来介绍一下。
double类型提供更高的精度。尽管这听起来有点违反直觉,但请忍受我。可以在计数器中测量的某些持续时间将是执行某些任务所花费的总时间。垃圾收集,数据库处理等。其中一些事件需要纳秒的时间。尽管我不建议使用千分尺代替轮廓仪,但测量较小的时间单位会引起混淆(请参见Who Wants Seconds,Prometheus工程师进一步解释了这种原因)]
如果注册表将所有测量结果标准化为纳秒,则long
(长9十亿分之十,而双倍9千万分之一的数)反正会消耗掉长时的额外精度的那些数量级。
[您会注意到,千分尺使用双精度来测量计时器中的总持续时间,该度量的优点在于实际上是其核心中的一个计数器(单调递增的数字)。
我记得做过一些粗略的数学运算,如果计数器正在测量单个事件,这意味着在超过20,000年的时间里它每秒可以测量10,000个事件,并且不会开始失去精度。
因此,当然有一些局限性需要注意,但是考虑到系统需求的期望,double
就足够了。