From 0759505be988ad2b8c9d14ec322681e48033a687 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Tue, 27 Jun 2017 15:05:11 +0200 Subject: add timer utility metric, based on histograms --- .../src/test/scala/kamon/metric/TimerSpec.scala | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 kamon-core/src/test/scala/kamon/metric/TimerSpec.scala (limited to 'kamon-core/src/test/scala/kamon') diff --git a/kamon-core/src/test/scala/kamon/metric/TimerSpec.scala b/kamon-core/src/test/scala/kamon/metric/TimerSpec.scala new file mode 100644 index 00000000..3fc1e169 --- /dev/null +++ b/kamon-core/src/test/scala/kamon/metric/TimerSpec.scala @@ -0,0 +1,72 @@ +package kamon.metric + +import kamon.Kamon +import org.scalatest.{Matchers, WordSpec} + + +class TimerSpec extends WordSpec with Matchers { + import TimerTestHelper._ + + "a Timer" should { + "record the duration between calls to .start() and .stop() in the StartedTimer" in { + val timer = Kamon.timer("timer-spec") + timer.start().stop() + timer.start().stop() + timer.start().stop() + + timer.distribution().count shouldBe(3) + } + + "ensure that a started timer can only be stopped once" in { + val timer = Kamon.timer("timer-spec") + val startedTimer = timer.start() + startedTimer.stop() + startedTimer.stop() + startedTimer.stop() + + timer.distribution().count shouldBe(1) + } + + + "allow to record values and produce distributions as Histograms do" in { + val timer = Kamon.timer("test-timer") + timer.record(100) + timer.record(150, 998) + timer.record(200) + + val distribution = timer.distribution() + distribution.min shouldBe(100) + distribution.max shouldBe(200) + distribution.count shouldBe(1000) + distribution.buckets.length shouldBe 3 + distribution.buckets.map(b => (b.value, b.frequency)) should contain.allOf( + (100 -> 1), + (150 -> 998), + (200 -> 1) + ) + + val emptyDistribution = timer.distribution() + emptyDistribution.min shouldBe(0) + emptyDistribution.max shouldBe(0) + emptyDistribution.count shouldBe(0) + emptyDistribution.buckets.length shouldBe 0 + } + } +} + +object TimerTestHelper { + + implicit class HistogramMetricSyntax(histogram: Histogram) { + def distribution(resetState: Boolean = true): Distribution = histogram match { + case h: AtomicHdrHistogram => h.snapshot(resetState).distribution + case h: HdrHistogram => h.snapshot(resetState).distribution + } + } + + implicit class TimerMetricSyntax(metric: TimerMetric) { + def distribution(resetState: Boolean = true): Distribution = + metric.refine(Map.empty[String, String]) match { + case t: TimerImpl => t.histogram.distribution(resetState) + } + } +} -- cgit v1.2.3