From db0f66e0f0508a6565738bb19520710eddd0398c Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Tue, 15 Aug 2017 14:35:17 +0200 Subject: add optional span scoping to the span metrics --- .../scala/kamon/context/ContextCodecSpec.scala | 2 +- .../src/test/scala/kamon/trace/SpanMetrics.scala | 94 ++++++++++++++++------ 2 files changed, 71 insertions(+), 25 deletions(-) (limited to 'kamon-core-tests/src/test') diff --git a/kamon-core-tests/src/test/scala/kamon/context/ContextCodecSpec.scala b/kamon-core-tests/src/test/scala/kamon/context/ContextCodecSpec.scala index 11be85a7..242c3345 100644 --- a/kamon-core-tests/src/test/scala/kamon/context/ContextCodecSpec.scala +++ b/kamon-core-tests/src/test/scala/kamon/context/ContextCodecSpec.scala @@ -14,5 +14,5 @@ class ContextCodecSpec extends WordSpec with Matchers { } } - val ContextCodec = new Codec(Kamon.identityProvider, Kamon.config()) + val ContextCodec = new Codec(Kamon.config()) } diff --git a/kamon-core-tests/src/test/scala/kamon/trace/SpanMetrics.scala b/kamon-core-tests/src/test/scala/kamon/trace/SpanMetrics.scala index 9ecffb24..ae0c7795 100644 --- a/kamon-core-tests/src/test/scala/kamon/trace/SpanMetrics.scala +++ b/kamon-core-tests/src/test/scala/kamon/trace/SpanMetrics.scala @@ -3,16 +3,15 @@ package kamon.trace import kamon.Kamon import kamon.Kamon.buildSpan import kamon.metric._ +import kamon.testkit.{MetricInspection, Reconfigure} import org.scalatest.{Matchers, WordSpecLike} -class SpanMetrics extends WordSpecLike with Matchers { - import SpanMetricsTestHelper._ +class SpanMetrics extends WordSpecLike with Matchers with MetricInspection with Reconfigure { - val errorTag = "error" -> "true" - val histogramMetric: HistogramMetric = Kamon.histogram("span.elapsed-time") + sampleAlways() "Span Metrics" should { - "be recorded for successeful execution" in { + "be recorded for successful execution" in { val operation = "span-success" val operationTag = "operation" -> operation @@ -20,11 +19,11 @@ class SpanMetrics extends WordSpecLike with Matchers { .start() .finish() - val histogram = histogramMetric.refine(operationTag) - histogram.distribution().count === 1 + val histogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, noErrorTag)) + histogram.distribution().count shouldBe 1 - val errorHistogram = histogramMetric.refine(Map(operationTag, errorTag)).distribution() - errorHistogram.count === 0 + val errorHistogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, errorTag)) + errorHistogram.distribution().count shouldBe 0 } @@ -37,28 +36,75 @@ class SpanMetrics extends WordSpecLike with Matchers { .addSpanTag("error", true) .finish() - val histogram = histogramMetric.refine(operationTag) - histogram.distribution().count === 0 + val histogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, noErrorTag)) + histogram.distribution().count shouldBe 0 + + val errorHistogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, errorTag)) + errorHistogram.distribution().count shouldBe 1 + } - val errorHistogram = histogramMetric.refine(operationTag, errorTag).distribution() - errorHistogram.count === 1 + "add a parentOperation tag to the metrics if span metrics scoping is enabled" in { + val parent = buildSpan("parent").start() + val parentOperationTag = "parentOperation" -> "parent" + + val operation = "span-with-parent" + val operationTag = "operation" -> operation + + buildSpan(operation) + .asChildOf(parent) + .start() + .addSpanTag("error", false) + .finish() + buildSpan(operation) + .asChildOf(parent) + .start() + .addSpanTag("error", true) + .finish() + + val histogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, noErrorTag, parentOperationTag)) + histogram.distribution().count shouldBe 1 + + val errorHistogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, errorTag, parentOperationTag)) + errorHistogram.distribution().count shouldBe 1 } - } -} + "not add any parentOperation tag to the metrics if span metrics scoping is disabled" in withoutSpanScopingEnabled { + val parent = buildSpan("parent").start() + val parentOperationTag = "parentOperation" -> "parent" -object SpanMetricsTestHelper { + val operation = "span-with-parent" + val operationTag = "operation" -> operation + + buildSpan(operation) + .asChildOf(parent) + .start() + .addSpanTag("error", false) + .finish() - implicit class HistogramMetricSyntax(histogram: Histogram) { - def distribution(resetState: Boolean = true): Distribution = - histogram match { - case hm: HistogramMetric => hm.refine(Map.empty[String, String]).distribution(resetState) - case h: AtomicHdrHistogram => h.snapshot(resetState).distribution - case h: HdrHistogram => h.snapshot(resetState).distribution - } + buildSpan(operation) + .asChildOf(parent) + .start() + .addSpanTag("error", true) + .finish() + + val histogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, noErrorTag, parentOperationTag)) + histogram.distribution().count shouldBe 0 + + val errorHistogram = Span.Metrics.ProcessingTime.refine(Map(operationTag, errorTag, parentOperationTag)) + errorHistogram.distribution().count shouldBe 0 + } } -} + val errorTag = "error" -> "true" + val noErrorTag = "error" -> "false" + + private def withoutSpanScopingEnabled[T](f: => T): T = { + disableSpanMetricScoping() + val evaluated = f + enableSpanMetricScoping() + evaluated + } +} -- cgit v1.2.3