diff options
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" |