aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/test/scala/kamon/trace
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2017-07-17 13:13:41 +0200
committerIvan Topolnjak <ivantopo@gmail.com>2017-07-17 13:13:41 +0200
commit483159862293a065be7cf3743d1aa759fbf31fc0 (patch)
treec6c2753c1c7abd7f2e44d7686bd088a51267867d /kamon-core/src/test/scala/kamon/trace
parent34010efc7b273e50d805a277646f14aa96aaa8b2 (diff)
downloadKamon-483159862293a065be7cf3743d1aa759fbf31fc0.tar.gz
Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.tar.bz2
Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.zip
working on ID generation and SpanContext encoding/decoding
Diffstat (limited to 'kamon-core/src/test/scala/kamon/trace')
-rw-r--r--kamon-core/src/test/scala/kamon/trace/DefaultIdentityGeneratorSpec.scala46
-rw-r--r--kamon-core/src/test/scala/kamon/trace/ExtendedB3SpanContextCodecSpec.scala144
-rw-r--r--kamon-core/src/test/scala/kamon/trace/SpanContextCodecSpec.scala106
3 files changed, 190 insertions, 106 deletions
diff --git a/kamon-core/src/test/scala/kamon/trace/DefaultIdentityGeneratorSpec.scala b/kamon-core/src/test/scala/kamon/trace/DefaultIdentityGeneratorSpec.scala
new file mode 100644
index 00000000..bbd04df1
--- /dev/null
+++ b/kamon-core/src/test/scala/kamon/trace/DefaultIdentityGeneratorSpec.scala
@@ -0,0 +1,46 @@
+package kamon.trace
+
+import kamon.trace.IdentityProvider.Identifier
+import org.scalatest.{Matchers, OptionValues, WordSpecLike}
+import org.scalactic.TimesOnInt._
+
+class DefaultIdentityGeneratorSpec extends WordSpecLike with Matchers with OptionValues {
+ val idProvider = IdentityProvider.Default()
+ val traceGenerator = idProvider.traceIdentifierGenerator()
+ val spanGenerator = idProvider.spanIdentifierGenerator()
+
+ validateGenerator("TraceID Generator", traceGenerator)
+ validateGenerator("SpanID Generator", spanGenerator)
+
+ def validateGenerator(generatorName: String, generator: IdentityProvider.Generator) = {
+ s"The $generatorName" should {
+ "generate random longs (8 byte) as Span and Trace identifiers" in {
+ 100 times {
+ val Identifier(string, bytes) = generator.generate()
+
+ string.length should be(16)
+ bytes.length should be(8)
+ }
+ }
+
+ "decode the string representation back into a identifier" in {
+ 100 times {
+ val identifier = generator.generate()
+ val decodedIdentifier = generator.from(identifier.string)
+
+ identifier.string should equal(decodedIdentifier.string)
+ identifier.bytes should equal(decodedIdentifier.bytes)
+ }
+ }
+
+ "decode the bytes representation back into a identifier" in {
+ 100 times {
+ val identifier = generator.generate()
+ val decodedIdentifier = generator.from(identifier.bytes)
+
+ identifier should equal(decodedIdentifier)
+ }
+ }
+ }
+ }
+}
diff --git a/kamon-core/src/test/scala/kamon/trace/ExtendedB3SpanContextCodecSpec.scala b/kamon-core/src/test/scala/kamon/trace/ExtendedB3SpanContextCodecSpec.scala
new file mode 100644
index 00000000..9491181f
--- /dev/null
+++ b/kamon-core/src/test/scala/kamon/trace/ExtendedB3SpanContextCodecSpec.scala
@@ -0,0 +1,144 @@
+/*
+ * =========================================================================================
+ * Copyright © 2013-2017 the kamon project <http://kamon.io/>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ * =========================================================================================
+ */
+
+package kamon.trace
+
+import kamon.trace.IdentityProvider.Identifier
+import kamon.trace.SpanContext.{SamplingDecision, Source}
+import org.scalatest.{Matchers, OptionValues, WordSpecLike}
+
+
+class ExtendedB3SpanContextCodecSpec extends WordSpecLike with Matchers with OptionValues {
+ "The ExtendedB3 SpanContextCodec" should {
+ "return a TextMap containing the SpanContext data" in {
+ val context = createSpanContext()
+ context.baggage.add("some", "baggage")
+ context.baggage.add("more", "baggage")
+
+ val textMap = extendedB3Codec.inject(context)
+ textMap.get("X-B3-TraceId").value shouldBe "1234"
+ textMap.get("X-B3-ParentSpanId").value shouldBe "2222"
+ textMap.get("X-B3-SpanId").value shouldBe "4321"
+ textMap.get("X-B3-Sampled").value shouldBe "1"
+ textMap.get("X-B3-Extra-Baggage").value shouldBe "some=baggage;more=baggage"
+ }
+
+ "allow to provide the TextMap to be used for encoding" in {
+ val context = createSpanContext()
+ context.baggage.add("some", "baggage")
+ context.baggage.add("more", "baggage")
+
+ val textMap = TextMap.Default()
+ extendedB3Codec.inject(context, textMap)
+ textMap.get("X-B3-TraceId").value shouldBe "1234"
+ textMap.get("X-B3-ParentSpanId").value shouldBe "2222"
+ textMap.get("X-B3-SpanId").value shouldBe "4321"
+ textMap.get("X-B3-Sampled").value shouldBe "1"
+ textMap.get("X-B3-Extra-Baggage").value shouldBe "some=baggage;more=baggage"
+ }
+
+ "extract a SpanContext from a TextMap when all fields are set" in {
+ val textMap = TextMap.Default()
+ textMap.put("X-B3-TraceId", "1234")
+ textMap.put("X-B3-ParentSpanId", "2222")
+ textMap.put("X-B3-SpanId", "4321")
+ textMap.put("X-B3-Sampled", "1")
+ textMap.put("X-B3-Extra-Baggage", "some=baggage;more=baggage")
+
+ val spanContext = extendedB3Codec.extract(textMap).value
+ spanContext.traceID.string shouldBe "1234"
+ spanContext.spanID.string shouldBe "4321"
+ spanContext.parentID.string shouldBe "2222"
+ spanContext.samplingDecision shouldBe SamplingDecision.Sample
+ spanContext.baggage.getAll() should contain allOf(
+ "some" -> "baggage",
+ "more" -> "baggage"
+ )
+ }
+
+ "use the Debug flag to override the sampling decision, if provided." in {
+ val textMap = TextMap.Default()
+ textMap.put("X-B3-TraceId", "1234")
+ textMap.put("X-B3-SpanId", "4321")
+ textMap.put("X-B3-Sampled", "0")
+ textMap.put("X-B3-Flags", "1")
+
+ val spanContext = extendedB3Codec.extract(textMap).value
+ spanContext.samplingDecision shouldBe SamplingDecision.Sample
+ }
+
+ "use the Debug flag as sampling decision when Sampled is not provided" in {
+ val textMap = TextMap.Default()
+ textMap.put("X-B3-TraceId", "1234")
+ textMap.put("X-B3-SpanId", "4321")
+ textMap.put("X-B3-Flags", "1")
+
+ val spanContext = extendedB3Codec.extract(textMap).value
+ spanContext.samplingDecision shouldBe SamplingDecision.Sample
+ }
+
+ "extract a minimal SpanContext from a TextMap containing only the Trace ID and Span ID" in {
+ val textMap = TextMap.Default()
+ textMap.put("X-B3-TraceId", "1234")
+ textMap.put("X-B3-SpanId", "4321")
+
+ val spanContext = extendedB3Codec.extract(textMap).value
+ spanContext.traceID.string shouldBe "1234"
+ spanContext.spanID.string shouldBe "4321"
+ spanContext.parentID shouldBe IdentityProvider.NoIdentifier
+ spanContext.samplingDecision shouldBe SamplingDecision.Unknown
+ spanContext.baggage.getAll() shouldBe empty
+ }
+
+ "round trip a SpanContext from TextMap -> SpanContext -> TextMap" in {
+ val textMap = TextMap.Default()
+ textMap.put("X-B3-TraceId", "1234")
+ textMap.put("X-B3-ParentSpanId", "2222")
+ textMap.put("X-B3-SpanId", "4321")
+ textMap.put("X-B3-Sampled", "1")
+ textMap.put("X-B3-Extra-Baggage", "some=baggage;more=baggage")
+
+ val spanContext = extendedB3Codec.extract(textMap).value
+ val injectTextMap = extendedB3Codec.inject(spanContext)
+
+ textMap.values.toSeq should contain theSameElementsAs(injectTextMap.values.toSeq)
+ }
+
+ "round trip a baggage that has special characters in there" in {
+ val spanContext = createSpanContext()
+ spanContext.baggage.add("key-with-!specials", "value=with~spec;als")
+
+ val textMap = extendedB3Codec.inject(spanContext)
+ val extractedSpanContext = extendedB3Codec.extract(textMap).value
+ extractedSpanContext.baggage.getAll().values.toSeq should contain theSameElementsAs(spanContext.baggage.getAll().values.toSeq)
+ }
+
+
+ }
+
+ val identityProvider = IdentityProvider.Default()
+ val extendedB3Codec = SpanContextCodec.ExtendedB3(identityProvider)
+
+ def createSpanContext(samplingDecision: SamplingDecision = SamplingDecision.Sample): SpanContext =
+ SpanContext(
+ traceID = Identifier("1234", Array[Byte](1, 2, 3, 4)),
+ spanID = Identifier("4321", Array[Byte](4, 3, 2, 1)),
+ parentID = Identifier("2222", Array[Byte](2, 2, 2, 2)),
+ samplingDecision = samplingDecision,
+ baggage = SpanContext.Baggage(),
+ source = Source.Local
+ )
+} \ No newline at end of file
diff --git a/kamon-core/src/test/scala/kamon/trace/SpanContextCodecSpec.scala b/kamon-core/src/test/scala/kamon/trace/SpanContextCodecSpec.scala
deleted file mode 100644
index 5fa6200d..00000000
--- a/kamon-core/src/test/scala/kamon/trace/SpanContextCodecSpec.scala
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * =========================================================================================
- * Copyright © 2013-2017 the kamon project <http://kamon.io/>
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
- * either express or implied. See the License for the specific language governing permissions
- * and limitations under the License.
- * =========================================================================================
- */
-
-package kamon.trace
-
-import java.util
-
-import io.opentracing.propagation.TextMap
-import org.scalatest.{Matchers, WordSpecLike}
-
-
-class SpanContextCodecSpec extends WordSpecLike with Matchers {
- "The Span Context Codec" should {
-
- "supports Text Map extraction" in {
- val textMap = MapTextMap()
- textMap.put("TRACE_ID", "1")
- textMap.put("PARENT_ID", "2")
- textMap.put("SPAN_ID", "3")
- textMap.put("SAMPLED", "sampled")
- textMap.put("BAGGAGE_1", "awesome-baggage-1")
- textMap.put("BAGGAGE_2", "awesome-baggage-2")
-
- val spanContext = SpanContextCodec.TextMap.extract(textMap, Sampler.never)
-
- spanContext.traceID should be(1)
- spanContext.parentID should be(2)
- spanContext.spanID should be(3)
- spanContext.sampled should be(false)
- spanContext.baggageMap should be(Map("1" -> "awesome-baggage-1", "2" -> "awesome-baggage-2"))
- }
-
- "supports Text Map injection" in {
- val textMap = MapTextMap()
-
- SpanContextCodec.TextMap.inject(new SpanContext(1, 2, 3, false, Map("MDC" -> "awesome-mdc-value")), textMap)
-
- textMap.map.get("TRACE_ID") should be("0000000000000001")
- textMap.map.get("PARENT_ID") should be("0000000000000003")
- textMap.map.get("SPAN_ID") should be("0000000000000002")
- textMap.map.get("SAMPLED") should be(null)
- textMap.map.get("BAGGAGE_MDC") should be("awesome-mdc-value")
- }
-
- "supports Http Headers extraction" in {
- val textMap = MapTextMap()
- textMap.put("X-B3-TraceId", "1")
- textMap.put("X-B3-ParentSpanId", "2")
- textMap.put("X-B3-SpanId", "3")
- textMap.put("X-B3-Sampled", "sampled")
- textMap.put("X-B3-Baggage-1", "awesome-baggage-1")
- textMap.put("X-B3-Baggage-2", "awesome-baggage-2")
-
- val spanContext = SpanContextCodec.ZipkinB3.extract(textMap, Sampler.never)
-
- spanContext.traceID should be(1)
- spanContext.parentID should be(2)
- spanContext.spanID should be(3)
- spanContext.sampled should be(false)
- spanContext.baggageMap should be(Map("1" -> "awesome-baggage-1", "2" -> "awesome-baggage-2"))
- }
-
- "supports Http Headers injection" in {
- val textMap = MapTextMap()
-
- SpanContextCodec.ZipkinB3.inject(new SpanContext(1, 2, 3, false, Map("MDC" -> "awesome-mdc-value")), textMap)
-
- textMap.map.get("X-B3-TraceId") should be("0000000000000001")
- textMap.map.get("X-B3-ParentSpanId") should be("0000000000000003")
- textMap.map.get("X-B3-SpanId") should be("0000000000000002")
- textMap.map.get("X-B3-Sampled") should be(null)
- textMap.map.get("X-B3-Baggage-MDC") should be("awesome-mdc-value")
- }
- }
-}
-
-class MapTextMap extends TextMap {
- val map = new util.HashMap[String, String]()
-
- override def iterator: util.Iterator[util.Map.Entry[String, String]] =
- map.entrySet.iterator
-
- override def put(key: String, value: String): Unit = {
- map.put(key, value)
- }
-}
-
-object MapTextMap {
- def apply(): MapTextMap = new MapTextMap()
-}
-
-
-