aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kamon-core-tests/src/test/scala/kamon/trace/B3SpanCodecSpec.scala22
-rw-r--r--kamon-core-tests/src/test/scala/kamon/util/EnvironmentTagBuilderSpec.scala104
-rw-r--r--kamon-core/src/main/resources/reference.conf9
-rw-r--r--kamon-core/src/main/scala/kamon/trace/SpanCodec.scala10
-rw-r--r--kamon-core/src/main/scala/kamon/util/EnvironmentTagBuilder.scala43
-rw-r--r--version.sbt2
6 files changed, 173 insertions, 17 deletions
diff --git a/kamon-core-tests/src/test/scala/kamon/trace/B3SpanCodecSpec.scala b/kamon-core-tests/src/test/scala/kamon/trace/B3SpanCodecSpec.scala
index e6fa283e..f718d806 100644
--- a/kamon-core-tests/src/test/scala/kamon/trace/B3SpanCodecSpec.scala
+++ b/kamon-core-tests/src/test/scala/kamon/trace/B3SpanCodecSpec.scala
@@ -28,15 +28,21 @@ class B3SpanCodecSpec extends WordSpecLike with Matchers with OptionValues with
"The ExtendedB3 SpanContextCodec" should {
"return a TextMap containing the SpanContext data" in {
- val context = testContext()
-
- val textMap = extendedB3Codec.encode(context)
+ val textMap = extendedB3Codec.encode(testContext())
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"
}
+ "do not include the X-B3-ParentSpanId if there is no parent" in {
+ val textMap = extendedB3Codec.encode(testContextWithoutParent())
+ textMap.get("X-B3-TraceId").value shouldBe "1234"
+ textMap.get("X-B3-ParentSpanId") shouldBe empty
+ textMap.get("X-B3-SpanId").value shouldBe "4321"
+ textMap.get("X-B3-Sampled").value shouldBe "1"
+ }
+
"not inject anything if there is no Span in the Context" in {
val textMap = extendedB3Codec.encode(Context.Empty)
@@ -189,4 +195,14 @@ class B3SpanCodecSpec extends WordSpecLike with Matchers with OptionValues with
Context.create().withKey(Span.ContextKey, Span.Remote(spanContext))
}
+ def testContextWithoutParent(): Context = {
+ val spanContext = createSpanContext().copy(
+ traceID = Identifier("1234", Array[Byte](1, 2, 3, 4)),
+ spanID = Identifier("4321", Array[Byte](4, 3, 2, 1)),
+ parentID = IdentityProvider.NoIdentifier
+ )
+
+ Context.create().withKey(Span.ContextKey, Span.Remote(spanContext))
+ }
+
} \ No newline at end of file
diff --git a/kamon-core-tests/src/test/scala/kamon/util/EnvironmentTagBuilderSpec.scala b/kamon-core-tests/src/test/scala/kamon/util/EnvironmentTagBuilderSpec.scala
new file mode 100644
index 00000000..5b7d6262
--- /dev/null
+++ b/kamon-core-tests/src/test/scala/kamon/util/EnvironmentTagBuilderSpec.scala
@@ -0,0 +1,104 @@
+/* =========================================================================================
+ * 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
+package util
+
+import com.typesafe.config.ConfigFactory
+import org.scalatest.{Matchers, WordSpec}
+
+class EnvironmentTagBuilderSpec extends WordSpec with Matchers {
+ private val testEnv = Environment.fromConfig(ConfigFactory.parseString(
+ """
+ |kamon.environment {
+ | service = environment-spec
+ | host = my-hostname
+ | instance = my-instance-name
+ |
+ | tags {
+ | env = staging
+ | region = asia-1
+ | }
+ |}
+ """.stripMargin
+ ).withFallback(ConfigFactory.defaultReference()))
+
+ "the EnvironmentTagBuilder" should {
+
+ "build the tags from a configuration using the current Environment" in {
+ val config = ConfigFactory.parseString(
+ """
+ |service = yes
+ |host = yes
+ |instance = yes
+ |blacklisted-tags = []
+ """.stripMargin)
+
+ val env = Kamon.environment
+ val tags = EnvironmentTagBuilder.create(config)
+ tags("service") shouldBe env.service
+ tags("host") shouldBe env.host
+ tags("instance") shouldBe env.instance
+ }
+
+ "build tags from a custom Environment" in {
+ val config = ConfigFactory.parseString(
+ """
+ |service = yes
+ |host = yes
+ |instance = yes
+ |blacklisted-tags = []
+ """.stripMargin)
+
+ val tags = EnvironmentTagBuilder.create(testEnv, config)
+ tags("service") shouldBe testEnv.service
+ tags("host") shouldBe testEnv.host
+ tags("instance") shouldBe testEnv.instance
+ tags("env") shouldBe "staging"
+ tags("region") shouldBe "asia-1"
+
+ }
+
+ "remove blacklisted tags" in {
+ val config = ConfigFactory.parseString(
+ """
+ |service = yes
+ |host = yes
+ |instance = yes
+ |blacklisted-tags = [ "region" ]
+ """.stripMargin)
+
+ val tags = EnvironmentTagBuilder.create(testEnv, config)
+ tags("service") shouldBe testEnv.service
+ tags("host") shouldBe testEnv.host
+ tags("instance") shouldBe testEnv.instance
+ tags("env") shouldBe "staging"
+ tags.get("region") shouldBe empty
+ }
+
+ "remove all disabled elements" in {
+ val config = ConfigFactory.parseString(
+ """
+ |service = no
+ |host = no
+ |instance = no
+ |blacklisted-tags = [ "region", "env" ]
+ """.stripMargin)
+
+ val tags = EnvironmentTagBuilder.create(testEnv, config)
+ tags shouldBe empty
+ }
+ }
+}
diff --git a/kamon-core/src/main/resources/reference.conf b/kamon-core/src/main/resources/reference.conf
index b3fd3b17..60fa156d 100644
--- a/kamon-core/src/main/resources/reference.conf
+++ b/kamon-core/src/main/resources/reference.conf
@@ -197,15 +197,6 @@ kamon {
util {
filters {
- # Determines whether entities from a category that doesn't have any filtering configuration should be tracked or
- # not. E.g. If there are no filter sections for the "jdbc-datasource" category and `accept-unmatched-categories`
- # is set to true, all entities for that category will be accepted, otherwise all will be rejected.
- #
- # NOTE: Using entity fil`ters is a commodity for modules that might potentially track thousands of unnecessary
- # entities, but not all modules are required to use filters, check the your module's documentation to
- # determine whether setting up filters make sense or not.
- accept-unmatched = true
-
}
}
} \ No newline at end of file
diff --git a/kamon-core/src/main/scala/kamon/trace/SpanCodec.scala b/kamon-core/src/main/scala/kamon/trace/SpanCodec.scala
index ae78ee67..14b28d54 100644
--- a/kamon-core/src/main/scala/kamon/trace/SpanCodec.scala
+++ b/kamon-core/src/main/scala/kamon/trace/SpanCodec.scala
@@ -37,7 +37,9 @@ object SpanCodec {
val spanContext = span.context()
carrier.put(Headers.TraceIdentifier, urlEncode(spanContext.traceID.string))
carrier.put(Headers.SpanIdentifier, urlEncode(spanContext.spanID.string))
- carrier.put(Headers.ParentSpanIdentifier, urlEncode(spanContext.parentID.string))
+
+ if(spanContext.parentID != IdentityProvider.NoIdentifier)
+ carrier.put(Headers.ParentSpanIdentifier, urlEncode(spanContext.parentID.string))
encodeSamplingDecision(spanContext.samplingDecision).foreach { samplingDecision =>
carrier.put(Headers.Sampled, samplingDecision)
@@ -135,8 +137,8 @@ object SpanCodec {
val spanContext = SpanContext(
traceID = identityProvider.traceIdGenerator().from(colferSpan.traceID),
- spanID = identityProvider.traceIdGenerator().from(colferSpan.spanID),
- parentID = identityProvider.traceIdGenerator().from(colferSpan.parentID),
+ spanID = identityProvider.spanIdGenerator().from(colferSpan.spanID),
+ parentID = identityProvider.spanIdGenerator().from(colferSpan.parentID),
samplingDecision = byteToSamplingDecision(colferSpan.samplingDecision)
)
@@ -163,4 +165,4 @@ object SpanCodec {
override def initialValue(): Array[Byte] = Array.ofDim[Byte](256)
}
}
-} \ No newline at end of file
+}
diff --git a/kamon-core/src/main/scala/kamon/util/EnvironmentTagBuilder.scala b/kamon-core/src/main/scala/kamon/util/EnvironmentTagBuilder.scala
new file mode 100644
index 00000000..09e643e9
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/util/EnvironmentTagBuilder.scala
@@ -0,0 +1,43 @@
+package kamon.util
+
+import com.typesafe.config.Config
+import kamon.{Environment, Kamon}
+
+import scala.collection.JavaConverters._
+
+
+/**
+ * Utility class to create a Map[String, String] encoding all the Environment information based on the provided
+ * Config. The Config instance is expected to have the following members:
+ *
+ * - service: Boolean. If true a service tag is included.
+ * - host: Boolean. If true a host tag is included.
+ * - instance: Boolean. If true a instance tag is included.
+ * - blacklisted-tags: List[String]. List of Environment tags that should not be included in the result.
+ *
+ * This utility is meant to be used mostly by reporter modules.
+ *
+ */
+object EnvironmentTagBuilder {
+
+ def create(config: Config): Map[String, String] =
+ create(Kamon.environment, config)
+
+ def create(env: Environment, config: Config): Map[String, String] = {
+ val envTags = Map.newBuilder[String, String]
+
+ if(config.getBoolean("service"))
+ envTags += ("service" -> env.service)
+
+ if(config.getBoolean("host"))
+ envTags += ("host" -> env.host)
+
+ if(config.getBoolean("instance"))
+ envTags += ("instance" -> env.instance)
+
+ val blacklistedTags = config.getStringList("blacklisted-tags").asScala
+ env.tags.filterKeys(k => !blacklistedTags.contains(k)).foreach(p => envTags += p)
+
+ envTags.result()
+ }
+}
diff --git a/version.sbt b/version.sbt
index ab920457..76dcbae2 100644
--- a/version.sbt
+++ b/version.sbt
@@ -1 +1 @@
-version in ThisBuild := "1.1.1-SNAPSHOT"
+version in ThisBuild := "1.1.3-SNAPSHOT"