From 7c91725a6839532428ccc410c19e0fe57fb89f76 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Thu, 5 Apr 2018 21:20:34 +0200 Subject: [PATCH 1/9] do not encode ParentID on B3 headers if not present, fixes kamon-io/kamon-akka-http#35 --- .../scala/kamon/trace/B3SpanCodecSpec.scala | 22 ++++++++++++++++--- .../main/scala/kamon/trace/SpanCodec.scala | 4 +++- 2 files changed, 22 insertions(+), 4 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 e6fa283ea..f718d8064 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/src/main/scala/kamon/trace/SpanCodec.scala b/kamon-core/src/main/scala/kamon/trace/SpanCodec.scala index ae78ee677..093257c01 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) From 8ca2ab1caa805ab2eb598978efb6ef4e610fd3eb Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Fri, 6 Apr 2018 14:10:28 +0200 Subject: [PATCH 2/9] release version 1.1.1 --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index ab920457d..61ca1d82e 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "1.1.1-SNAPSHOT" +version in ThisBuild := "1.1.1" From 98b1998244c502fbcacfccae68b93c2fa8dbaeb4 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Fri, 6 Apr 2018 14:12:28 +0200 Subject: [PATCH 3/9] set version to 1.1.2-SNAPSHOT --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index 61ca1d82e..a9bd6a768 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "1.1.1" +version in ThisBuild := "1.1.2-SNAPSHOT" From e5ad42786f1827484239f10bcf1716bfd0899ecf Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Fri, 6 Apr 2018 01:47:40 +0200 Subject: [PATCH 4/9] add the EnvironmentTagBuilder utility class --- .../util/EnvironmentTagBuilderSpec.scala | 104 ++++++++++++++++++ .../kamon/util/EnvironmentTagBuilder.scala | 43 ++++++++ 2 files changed, 147 insertions(+) create mode 100644 kamon-core-tests/src/test/scala/kamon/util/EnvironmentTagBuilderSpec.scala create mode 100644 kamon-core/src/main/scala/kamon/util/EnvironmentTagBuilder.scala 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 000000000..5b7d6262b --- /dev/null +++ b/kamon-core-tests/src/test/scala/kamon/util/EnvironmentTagBuilderSpec.scala @@ -0,0 +1,104 @@ +/* ========================================================================================= + * Copyright © 2013-2017 the kamon project + * + * 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/scala/kamon/util/EnvironmentTagBuilder.scala b/kamon-core/src/main/scala/kamon/util/EnvironmentTagBuilder.scala new file mode 100644 index 000000000..09e643e94 --- /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() + } +} From d5483496a26a0ce3500806682e5d5a1b19f9e1b9 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Tue, 10 Apr 2018 13:08:18 +0200 Subject: [PATCH 5/9] remove unused section from the reference.conf --- kamon-core/src/main/resources/reference.conf | 9 --------- 1 file changed, 9 deletions(-) diff --git a/kamon-core/src/main/resources/reference.conf b/kamon-core/src/main/resources/reference.conf index b3fd3b174..60fa156d5 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 From a89582805f32ccc53005b9c0732f7c401ca990b1 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Tue, 10 Apr 2018 13:46:32 +0200 Subject: [PATCH 6/9] release version 1.1.2 --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index a9bd6a768..1990c4dd4 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "1.1.2-SNAPSHOT" +version in ThisBuild := "1.1.2" From 9212df92e4aa12eaafa4fb2f035c73963ce6aeb3 Mon Sep 17 00:00:00 2001 From: Ashton Hepburn Date: Sat, 22 Jan 2022 20:48:49 -0500 Subject: [PATCH 7/9] mimimal changes to compile a 2.13.x compatible version --- build.sbt | 19 ++++++++++--------- .../main/scala/kamon/ReporterRegistry.scala | 4 ++-- kamon-core/src/main/scala/kamon/package.scala | 2 +- .../src/main/scala/kamon/util/Filters.scala | 2 +- project/plugins.sbt | 2 +- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/build.sbt b/build.sbt index 5c2cc1043..bf57fb45e 100644 --- a/build.sbt +++ b/build.sbt @@ -16,20 +16,21 @@ lazy val kamon = (project in file(".")) .settings(moduleName := "kamon") - .settings(noPublishing: _*) +// .settings(noPublishing: _*) .aggregate(core, testkit, coreTests) val commonSettings = Seq( - scalaVersion := "2.12.4", + scalaVersion := "2.13.8", javacOptions += "-XDignore.symbol.file", + compileOrder := CompileOrder.JavaThenScala, resolvers += Resolver.mavenLocal, - crossScalaVersions := Seq("2.12.4", "2.11.8", "2.10.6"), + crossScalaVersions := Seq("2.13.8"), concurrentRestrictions in Global += Tags.limit(Tags.Test, 1), scalacOptions ++= Seq( - "-deprecation", +// "-deprecation", "-encoding", "UTF-8", "-feature", - "-Xfuture", +// "-Xfuture", "-language:implicitConversions", "-language:higherKinds", "-language:existentials", "-language:postfixOps", "-unchecked" ) ++ (CrossVersion.partialVersion(scalaVersion.value) match { @@ -48,7 +49,7 @@ lazy val core = (project in file("kamon-core")) "com.typesafe" % "config" % "1.3.1", "org.slf4j" % "slf4j-api" % "1.7.25", "org.hdrhistogram" % "HdrHistogram" % "2.1.9", - "com.lihaoyi" %% "fansi" % "0.2.4" + "com.lihaoyi" %% "fansi" % "0.2.14" ) ) @@ -57,7 +58,7 @@ lazy val testkit = (project in file("kamon-testkit")) .settings(commonSettings: _*) .settings( libraryDependencies ++= Seq( - "org.scalatest" %% "scalatest" % "3.0.1" + "org.scalatest" %% "scalatest" % "3.0.9" ) ).dependsOn(core) @@ -67,11 +68,11 @@ lazy val coreTests = (project in file("kamon-core-tests")) moduleName := "kamon-core-tests", resolvers += Resolver.mavenLocal, fork in Test := true) - .settings(noPublishing: _*) +// .settings(noPublishing: _*) .settings(commonSettings: _*) .settings( libraryDependencies ++= Seq( - "org.scalatest" %% "scalatest" % "3.0.1" % "test", + "org.scalatest" %% "scalatest" % "3.0.9" % "test", "ch.qos.logback" % "logback-classic" % "1.2.2" % "test" ) ).dependsOn(testkit) diff --git a/kamon-core/src/main/scala/kamon/ReporterRegistry.scala b/kamon-core/src/main/scala/kamon/ReporterRegistry.scala index ee70de4ae..ad9c14f97 100644 --- a/kamon-core/src/main/scala/kamon/ReporterRegistry.scala +++ b/kamon-core/src/main/scala/kamon/ReporterRegistry.scala @@ -381,7 +381,7 @@ object ReporterRegistry { Future { Try { - entry.reporter.reportSpans(spanBatch.asScala) + entry.reporter.reportSpans(spanBatch.asScala.toSeq) }.failed.foreach { error => logger.error(s"Reporter [${entry.name}] failed to report spans.", error) } @@ -396,7 +396,7 @@ object ReporterRegistry { optimisticMetricTickAlignment = config.getBoolean("kamon.metric.optimistic-tick-alignment"), traceTickInterval = config.getDuration("kamon.trace.tick-interval"), traceReporterQueueSize = config.getInt("kamon.trace.reporter-queue-size"), - configuredReporters = config.getStringList("kamon.reporters").asScala + configuredReporters = config.getStringList("kamon.reporters").asScala.toSeq ) private case class Configuration(metricTickInterval: Duration, optimisticMetricTickAlignment: Boolean, diff --git a/kamon-core/src/main/scala/kamon/package.scala b/kamon-core/src/main/scala/kamon/package.scala index d3b255008..d5507a0c1 100644 --- a/kamon-core/src/main/scala/kamon/package.scala +++ b/kamon-core/src/main/scala/kamon/package.scala @@ -67,7 +67,7 @@ package object kamon { implicit class AtomicGetOrElseUpdateOnTrieMap[K, V](val trieMap: TrieMap[K, V]) extends AnyVal { def atomicGetOrElseUpdate(key: K, op: ⇒ V): V = - atomicGetOrElseUpdate(key, op, { v: V ⇒ Unit }) + atomicGetOrElseUpdate(key, op, { v: V ⇒ () }) def atomicGetOrElseUpdate(key: K, op: ⇒ V, cleanup: V ⇒ Unit): V = trieMap.get(key) match { diff --git a/kamon-core/src/main/scala/kamon/util/Filters.scala b/kamon-core/src/main/scala/kamon/util/Filters.scala index a6c4de88b..24a271763 100644 --- a/kamon-core/src/main/scala/kamon/util/Filters.scala +++ b/kamon-core/src/main/scala/kamon/util/Filters.scala @@ -39,7 +39,7 @@ object Filters { val configKey = ConfigUtil.joinPath(name, key) if(filtersConfig.hasPath(configKey)) - filtersConfig.getStringList(configKey).asScala.map(readMatcher) + filtersConfig.getStringList(configKey).asScala.toSeq.map(readMatcher) else Seq.empty } diff --git a/project/plugins.sbt b/project/plugins.sbt index 323e4f2fc..cb24d52b9 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,4 +1,4 @@ resolvers += Resolver.bintrayIvyRepo("kamon-io", "sbt-plugins") -addSbtPlugin("io.kamon" % "kamon-sbt-umbrella" % "0.0.15") +//addSbtPlugin("io.kamon" % "kamon-sbt-umbrella" % "0.0.15") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.0") From 452faedbb990824ef84a8737ee5585aecb3b3a78 Mon Sep 17 00:00:00 2001 From: Ashton Hepburn Date: Sat, 22 Jan 2022 21:39:34 -0500 Subject: [PATCH 8/9] publish to expected io.kamon.* --- build.sbt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/build.sbt b/build.sbt index bf57fb45e..f88082f45 100644 --- a/build.sbt +++ b/build.sbt @@ -16,15 +16,15 @@ lazy val kamon = (project in file(".")) .settings(moduleName := "kamon") -// .settings(noPublishing: _*) .aggregate(core, testkit, coreTests) + val commonSettings = Seq( + organization := "io.kamon", scalaVersion := "2.13.8", javacOptions += "-XDignore.symbol.file", compileOrder := CompileOrder.JavaThenScala, resolvers += Resolver.mavenLocal, - crossScalaVersions := Seq("2.13.8"), concurrentRestrictions in Global += Tags.limit(Tags.Test, 1), scalacOptions ++= Seq( // "-deprecation", @@ -33,12 +33,7 @@ val commonSettings = Seq( // "-Xfuture", "-language:implicitConversions", "-language:higherKinds", "-language:existentials", "-language:postfixOps", "-unchecked" - ) ++ (CrossVersion.partialVersion(scalaVersion.value) match { - case Some((2,10)) => Seq("-Yno-generic-signatures", "-target:jvm-1.7") - case Some((2,11)) => Seq("-Ybackend:GenBCode","-Ydelambdafy:method","-target:jvm-1.8") - case Some((2,12)) => Seq("-opt:l:method") - case _ => Seq.empty - }) + ) ) lazy val core = (project in file("kamon-core")) From 59f9595b314f8f9d027a3c33b60e93f863fbc218 Mon Sep 17 00:00:00 2001 From: Ashton Hepburn Date: Wed, 26 Jan 2022 10:07:58 -0500 Subject: [PATCH 9/9] publish to asoc-release-local --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index f88082f45..0be714f3c 100644 --- a/build.sbt +++ b/build.sbt @@ -26,6 +26,7 @@ val commonSettings = Seq( compileOrder := CompileOrder.JavaThenScala, resolvers += Resolver.mavenLocal, concurrentRestrictions in Global += Tags.limit(Tags.Test, 1), + publishTo := Some("ASOC Libs" at "https://sumologicusw1.jfrog.io/sumologicusw1/asoc-release-local/"), scalacOptions ++= Seq( // "-deprecation", "-encoding", "UTF-8",