DropWizard 指标 仪表与计时器
DropWizard Metrics Meters vs Timers
我正在学习 DropWizard Metrics library(以前称为 Coda Hale 指标),我对何时应该使用 Meters
与 Timers
感到困惑。根据文档:
Meter: A meter measures the rate at which a set of events occur
和:
Timer: A timer is basically a histogram of the duration of a type of event and a meter of the rate of its occurrence
根据这些定义,我无法辨别它们之间的区别。令我困惑的是 Timer
没有按照我预期的方式使用。对我来说,Timer
就是一个计时器;它应该测量 start()
和 stop()
之间的时间差。但似乎 Timers
还捕获了事件发生的速率,感觉就像踩到 Meters
脚趾一样。
如果我能看到每个组件输出的示例,这可能有助于我理解when/where使用其中任何一个。
你感到困惑的部分原因是 DW Metrics Timer IS,除此之外还有 DW Metrics Meter。
A Meter 只关注以 Hz(每秒事件数)为单位的速率。每个 Meter 都会导致 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 秒。
计时器计算以上 4 个指标(将每个 Timer.Context 视为一个事件)并向它们添加一些额外的指标:
- 事件数
- 自指标开始以来的最小、平均和最大持续时间
- 标准偏差
- 一个“直方图”,记录分布在第 50、97、98、99 和 99.95 个百分位数的持续时间
每个计时器总共报告了大约 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 报告实际服务时间——相反,我们需要某种方式来汇总所有这些操作以适合我们所需的报告 window。 DW Metrics 的计时器每分钟(我们的报告期)自动为我们做一次。 5 分钟后,我们的指标注册表将报告:
- 速率为 100(每秒事件数)
- 1 分钟平均速率 100
- 5 分钟平均速率 100
- 计数为 30000(查看的事件总数)
- 最多 10(毫秒)
- 最少 10
- 10 的平均值
- 第 50 个百分位数 (p50) 值为 10
- 第 99.9 个百分位数 (p999) 值为 10
现在,让我们考虑进入一个时期,偶尔我们的操作会完全脱离 rails 并长时间阻塞:
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(每秒事件数)
- 1 分钟平均汇率为 91.75
- 5 分钟平均汇率为 98.35
- 计数为 35505(查看的事件总数)
- 最大持续时间为 1000(毫秒)
- 最短持续时间 10
- 平均持续时间为 10.13
- 第 50 个百分位数 (p50) 值为 10
- 第 99.9 个百分位数 (p999) 值为 1000
如果绘制此图表,您会看到大多数请求(p50、p75、p99 等)在 10 毫秒内完成,但千分之一的请求 (p99) 在 1 秒内完成。这也将被视为平均速率的轻微下降(约 2%)和 1 分钟平均值的大幅下降(近 9%)。
如果您只查看一段时间内的平均值(速率或持续时间),您将永远不会发现这些尖峰 - 当对大量成功操作进行平均时,它们会被拖入背景噪音中。同样,只知道最大值也无济于事,因为它不会告诉您最大值出现的频率。这就是为什么直方图是跟踪性能的强大工具,以及为什么 DW Metrics 的计时器同时发布比率和直方图的原因。
我正在学习 DropWizard Metrics library(以前称为 Coda Hale 指标),我对何时应该使用 Meters
与 Timers
感到困惑。根据文档:
Meter: A meter measures the rate at which a set of events occur
和:
Timer: A timer is basically a histogram of the duration of a type of event and a meter of the rate of its occurrence
根据这些定义,我无法辨别它们之间的区别。令我困惑的是 Timer
没有按照我预期的方式使用。对我来说,Timer
就是一个计时器;它应该测量 start()
和 stop()
之间的时间差。但似乎 Timers
还捕获了事件发生的速率,感觉就像踩到 Meters
脚趾一样。
如果我能看到每个组件输出的示例,这可能有助于我理解when/where使用其中任何一个。
你感到困惑的部分原因是 DW Metrics Timer IS,除此之外还有 DW Metrics Meter。
A Meter 只关注以 Hz(每秒事件数)为单位的速率。每个 Meter 都会导致 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 秒。
计时器计算以上 4 个指标(将每个 Timer.Context 视为一个事件)并向它们添加一些额外的指标:
- 事件数
- 自指标开始以来的最小、平均和最大持续时间
- 标准偏差
- 一个“直方图”,记录分布在第 50、97、98、99 和 99.95 个百分位数的持续时间
每个计时器总共报告了大约 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 报告实际服务时间——相反,我们需要某种方式来汇总所有这些操作以适合我们所需的报告 window。 DW Metrics 的计时器每分钟(我们的报告期)自动为我们做一次。 5 分钟后,我们的指标注册表将报告:
- 速率为 100(每秒事件数)
- 1 分钟平均速率 100
- 5 分钟平均速率 100
- 计数为 30000(查看的事件总数)
- 最多 10(毫秒)
- 最少 10
- 10 的平均值
- 第 50 个百分位数 (p50) 值为 10
- 第 99.9 个百分位数 (p999) 值为 10
现在,让我们考虑进入一个时期,偶尔我们的操作会完全脱离 rails 并长时间阻塞:
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(每秒事件数)
- 1 分钟平均汇率为 91.75
- 5 分钟平均汇率为 98.35
- 计数为 35505(查看的事件总数)
- 最大持续时间为 1000(毫秒)
- 最短持续时间 10
- 平均持续时间为 10.13
- 第 50 个百分位数 (p50) 值为 10
- 第 99.9 个百分位数 (p999) 值为 1000
如果绘制此图表,您会看到大多数请求(p50、p75、p99 等)在 10 毫秒内完成,但千分之一的请求 (p99) 在 1 秒内完成。这也将被视为平均速率的轻微下降(约 2%)和 1 分钟平均值的大幅下降(近 9%)。
如果您只查看一段时间内的平均值(速率或持续时间),您将永远不会发现这些尖峰 - 当对大量成功操作进行平均时,它们会被拖入背景噪音中。同样,只知道最大值也无济于事,因为它不会告诉您最大值出现的频率。这就是为什么直方图是跟踪性能的强大工具,以及为什么 DW Metrics 的计时器同时发布比率和直方图的原因。