DropWizard度量标准与定时器
我正在学习DropWizard Metrics库 (以前称为Coda Hale度量标准),对于何时应该使用Meters
和Timers
,我感到困惑。 根据文件:
仪表:仪表测量一组事件发生的速率
和:
定时器:定时器基本上是一种事件types的持续时间的直方图,以及它发生率的一个米
基于这些定义,我无法辨别这些之间的区别。 我感到困惑的是, Timer
并没有像我期望的那样被使用。 对我来说, Timer
就是这样:一个计时器; 它应该测量start()
和stop()
之间的时间差。 但是, Timers
似乎也捕捉到事件发生的速度,这感觉就像是在Meters'
脚趾。
如果我能看到每个组件输出的例子,可以帮助我理解何时/在哪里使用这些。
你很困惑,部分原因是因为DW度量标准定时器是其中一个DW度量标准。
仪表专门关心费率,以Hz(每秒事件)为单位。 每米的结果有4(?)个不同的指标被公布:
- 自Metrics启动以来的平均(平均)速率
- 1,5和15分钟的滚动平均速率
您可以通过在代码中的不同位置logging一个值来使用计量表 – DW度量标准会自动记下每个呼叫的挂墙时间以及您给出的值,并使用这些值计算该值增加的速率:
Meter getRequests = registry.meter("some-operation.operations") getRequests.mark() //resets the value, eg sets it to 0 int numberOfOps = doSomeNumberOfOperations() //takes 10 seconds, returns 333 getRequests.mark(numberOfOps) //sets the value to number of ops.
我们预计我们的速率为33.3 Hz,333次操作发生,两次调用mark()之间的时间为10秒。
一个计时器计算以上4个指标(考虑每个Timer.Context是一个事件),并添加了一些额外的指标:
- 事件的数目
- 分钟,自Metrics启动以来的平均和最大持续时间
- 标准偏差
- logging分布在第50,97,99,99和99.95百分位的持续时间的“直方图”
每个计时器报告总共有15个指标。
简而言之 :计时器报告了大量的度量标准,而且他们可能会很难理解,但是一旦你做了这些,他们就成为了一个非常有效的方法来发现spikey的行为。
事实是,只是收集两点之间的时间并不是一个非常有用的指标。 考虑一下:你有这样一段代码:
Timer timer = registry.timer("costly-operation.service-time") Timer.Context context = timer.time() costlyOperation() //service time 10 ms context.stop()
让我们假设costlyOperation()具有恒定的成本,恒定的负载,并在一个线程上运行。 在1分钟的报告期内,我们应该预计这个操作会有6000次。 显然,我们不会通过6000x线报告实际的服务时间 – 相反,我们需要一些方法来总结所有这些操作,以适应我们所需的报告窗口。 DW度量标准的定时器为我们自动,每分钟一次(我们的报告期)。 5分钟后,我们的度量registry将报告:
- 100(每秒事件)
- 1分钟的平均速率为100
- 5分钟的平均速率为100
- 计数3万(看到的总事件)
- 最大10(ms)
- 10分钟
- 平均10
- 第50百分位值(p50)为10
- 第99.9百分位(p999)值为10
现在,让我们考虑一下,我们进入一个偶尔的时期,我们的操作完全脱离轨道,并阻塞一段时间:
Timer timer = registry.timer("costly-operation.service-time") Timer.Context context = timer.time() costlyOperation() //takes 10 ms usually, but once every 1000 times spikes to 1000 ms context.stop()
在1分钟的收集期内,我们现在将看到less于6000次执行,因为每1000次执行需要更长的时间。 工作到约5505.在第一分钟(总共系统时间6分钟)之后,我们现在看到:
- 平均速率为98(每秒事件)
- 1分钟的平均速率为91.75
- 5分钟的平均速率为98.35
- 计数35505(看到的总事件)
- 最大持续时间1000(ms)
- 10分钟的持续时间
- 平均持续时间10.13
- 第50百分位值(p50)为10
- 1000的第99.9百分位(p999)值
如果你制作了这个图表,你会发现大多数请求(p50,p75,p99等)在10ms内完成,但1000(p99)中的一个请求在1s内完成。 平均比率略有下降(约2%),1分钟平均值下降(接近9%)。
如果你只看一段时间的意思(无论是速率还是持续时间),你将永远不会发现这些峰值 – 当它们被大量的成功操作取平均值时,它们会被拖入背景噪声中。 同样,只知道最大值是没有帮助的,因为它不会告诉你最大值发生的频率。 这就是为什么直方图是跟踪性能的强大工具,为什么DW度量标准的定时器同时发布速率和直方图。