DropWizard Metrics Meters与计时器

sme*_*eeb 65 java metrics timer dropwizard codahale-metrics

我学习的DropWizard指标库(原科达硬朗指标),我很困惑,当我应该使用到MetersVS Timers.根据文件:

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

和:

计时器:计时器基本上是事件类型持续时间的直方图和其发生率的计量表

基于这些定义,我无法辨别它们之间的区别.令我感到困惑的是,Timer没有像我期望的那样使用它.对我而言,Timer就是这样:一个计时器; 它应该测量a start()和之间的时间差stop().但似乎Timers也可以捕捉事件发生的速度,感觉就像是踩到了Meters脚趾.

如果我能看到每个组件输出的示例,这可能有助于我理解何时/何处使用其中任何一个.

Mat*_*ler 140

你之所以感到困惑,是因为DW Metrics Timer 一款DW Metrics Meter.

仪表专门关注速率,以Hz(每秒事件数)为单位.每个Meter会导致发布4个(?)不同的指标:

  • 自Metrics启动以来的平均(平均)费率
  • 1,5和15分钟滚动平均费率

您可以通过在代码中的不同点记录值来使用仪表 - 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.
Run Code Online (Sandbox Code Playgroud)

我们希望我们的速率为33.3 Hz,因为333次操作发生,两次调用mark()之间的时间是10秒.

计时器计算以上4个指标(将每个Timer.Context视为一个事件)并向其添加许多其他指标:

  • 事件数量的计数
  • 从度量标准开始以来看到的最小,平均和最大持续时间
  • 标准差
  • "直方图",记录分布在第50,97,98,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()
Run Code Online (Sandbox Code Playgroud)

让我们假设expensiveOperation()具有恒定的成本,恒定的负载并在单个线程上运行.在1分钟的报告期内,我们应该期望这次操作6000次.显然,我们不会通过电线6000x报告实际的服务时间 - 相反,我们需要一些方法来总结所有这些操作以适应我们所需的报告窗口.DW Metrics'Timer为我们自动执行此操作,每分钟一次(我们的报告期).5分钟后,我们的指标注册表将报告:

  • 率为100(事件每秒)
  • 1分钟的平均速度为100
  • 5分钟的平均速度为100
  • 数量为30000(看到的总事件数)
  • 最多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()
Run Code Online (Sandbox Code Playgroud)

在1分钟的收集期内,我们现在看到的执行次数少于6000次,因为每1000次执行需要更长的时间.工作到大约5505.在第一分钟(总系统时间为6分钟)后,我们现在看到:

  • 平均率为98(事件每秒)
  • 平均1分钟91.75
  • 5分钟的平均速度为98.35
  • 计数35505(所见事件总数)
  • 最长持续时间1000(ms)
  • 最短持续时间为10
  • 平均持续时间为10.13
  • 第50百分位(p50)值为10
  • 第99.9百分位数(p999)值为1000

如果你把它绘制成图形,你会发现大多数请求(p50,p75,p99等)在10毫秒内完成,但是1000(p99)中的一个请求在1秒内完成.这也可以看作平均率略有下降(约2%),1分钟均值(近9%)大幅减少.

如果你只看时间的意思(速率或持续时间),你永远不会发现这些尖峰 - 当平均很多成功的操作时,它们会被拖入背景噪音中.同样,只知道最大值没有用,因为它不会告诉你最大值出现的频率.这就是为什么直方图是跟踪性能的强大工具,以及为什么DW Metrics的Timer发布速率和直方图.

  • [此处](http://metrics.dropwizard.io/3.1.0/manual/core/#histograms) 包含了一条不错的附加信息。默认情况下,计时器使用指数衰减的存储库。这意味着您看到的数据大约是过去 5 分钟的数据,而您的直方图值偏向于较新的数据。 (2认同)