DropWizard度量标准与定时器

我正在学习DropWizard Metrics库 (以前称为Coda Hale度量标准),对于何时应该使用MetersTimers ,我感到困惑。 根据文件:

仪表:仪表测量一组事件发生的速率

和:

定时器:定时器基本上是一种事件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度量标准的定时器同时发布速率和直方图。