DropWizard 度量米与计时器

我正在学习 DropWizard 度量值库(以前的 Coda Hale 指标) ,我对什么时候应该使用 MetersTimers感到困惑。根据文件:

米: 一米测量一系列事件发生的速率

以及:

计时器: 计时器基本上是一种事件持续时间的直方图和事件发生率的米

根据这些定义,我无法区分它们之间的区别。令我困惑的是,Timer并没有按照我预期的方式使用。对我来说,Timer只是一个定时器,它应该测量 start()stop()之间的时间差。但是看起来 Timers也能捕捉到事件发生的速率,感觉就像是踩到了 Meters的脚趾。

如果我能看到一个例子,每个组件输出,可能有助于我了解何时/何地使用这些。

36752 次浏览

您之所以感到困惑,部分是因为 DW 度量计时器 是的,以及其他一些东西,DW 度量计。

一米专门与速率有关,以赫兹(事件每秒)测量。每米结果4(?)公布的不同指标:

  • 自度量标准开始以来的平均(平均)率
  • 1分钟、5分钟和15分钟滚动平均汇率

你可以通过在代码的不同位置记录一个值来使用 Meter —— DW Metrics 会自动记录下每个调用的挂起时间以及你给它的值,并用这些来计算该值增加的速率:

Meter getRequests = registry.meter("some-operation.operations")
getRequests.mark() //resets the value, e.g. 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秒。

Timer 计算以上4个指标(考虑每个 Timer)。上下文是一个事件) ,并增加了一些额外的指标:

  • 事件数的计数
  • 最小,平均和最大持续时间从公制开始见到
  • 标准差
  • 一个“直方图”,记录分布在第50,97,98,99和99.95百分位的持续时间

每个 Timer 报告了大约15个指标。

简而言之 : 计时器报告了大量的指标,它们可能很难理解,但是一旦你这样做了,它们就是发现棘手行为的一种非常强大的方法。


事实上,仅仅收集两点之间花费的时间并不是一个非常有用的度量标准。考虑一下: 您有这样一个代码块:

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 Metrics 的 Timer 每分钟(我们的报告期)自动为我们做一次。5分钟后,我们的指标注册表将报告:

  • 速率为100(事件/秒)
  • 一分钟的平均速率为100
  • 5分钟的平均速率是100
  • 一数30000(总事件见)
  • 最多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分钟的收集周期内,我们现在看到的执行次数不到6000次,因为每执行1000次需要更长的时间。大概是5505。经过第一分钟(总共6分钟的系统时间) ,我们现在会看到:

  • 平均速率为98(事件/秒)
  • 一分钟的平均速率为91.75
  • 5分钟的平均速率是98.35
  • 点数35505(见活动总数)
  • 最大持续时间为1000(毫秒)
  • 持续时间为10分钟
  • 平均持续时间为10.13
  • 第50百分位(p50)值为10
  • 第99.9百分位(p999)值为1000

如果用图表表示,您将看到大多数请求(p50、 p75、 p99等)在10毫秒内完成,但是1000个请求中有一个(p99)在1秒内完成。这也将被视为平均速率(约2%)的轻微下降和1分钟平均速率(近9%)的大幅下降。

如果您只看时间平均值(速率或持续时间) ,您将永远不会发现这些尖峰——当在许多成功操作中取平均值时,它们会被拖入背景噪声中。类似地,仅仅知道最大值是没有帮助的,因为它不能告诉你最大值出现的频率。这就是为什么直方图是一个跟踪性能的强大工具,也是为什么 DW Metrics 公司的 Timer 同时发布速率和直方图的原因。