From 9d07669dae3ea1bc74b1d21e65618581292a6079 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Fri, 9 Jun 2017 10:29:37 +0200 Subject: replace auto settings for environment with actual values --- kamon-core/src/main/resources/reference.conf | 9 +++- kamon-core/src/main/scala/kamon/Environment.scala | 51 ++++++++++++++++++++++ kamon-core/src/main/scala/kamon/Kamon.scala | 21 ++------- .../src/test/scala/kamon/EnvironmentSpec.scala | 48 ++++++++++++++++++++ 4 files changed, 110 insertions(+), 19 deletions(-) create mode 100644 kamon-core/src/main/scala/kamon/Environment.scala create mode 100644 kamon-core/src/test/scala/kamon/EnvironmentSpec.scala (limited to 'kamon-core/src') diff --git a/kamon-core/src/main/resources/reference.conf b/kamon-core/src/main/resources/reference.conf index d3c8ebd1..80da12a5 100644 --- a/kamon-core/src/main/resources/reference.conf +++ b/kamon-core/src/main/resources/reference.conf @@ -1,8 +1,15 @@ kamon { + environment { + # Identifier for this service. + service = "kamon-application" + + # Identifier for the host where this service is running. If set to `auto` Kamon will resolve the hostname using + # the resolved name for localhost. host = "auto" + + # Identifier for a particular instance of this service. If set to `auto` Kamon will use the pattern service@host. instance = "auto" - application = "kamon-application" } # FQCN of the reporter instances that should be loaded when calling `Kamon.reporters.loadFromConfig()`. diff --git a/kamon-core/src/main/scala/kamon/Environment.scala b/kamon-core/src/main/scala/kamon/Environment.scala new file mode 100644 index 00000000..80833352 --- /dev/null +++ b/kamon-core/src/main/scala/kamon/Environment.scala @@ -0,0 +1,51 @@ +/* ========================================================================================= + * 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 + +import java.net.InetAddress +import java.util.concurrent.ThreadLocalRandom + +import com.typesafe.config.Config +import kamon.util.HexCodec + +case class Environment(host: String, service: String, instance: String, incarnation: String) + +object Environment { + private val incarnation = HexCodec.toLowerHex(ThreadLocalRandom.current().nextLong()) + + def fromConfig(config: Config): Environment = { + val environmentConfig = config.getConfig("kamon.environment") + + val service = environmentConfig.getString("service") + + val host = readValueOrGenerate( + environmentConfig.getString("host"), + InetAddress.getLocalHost.getHostName + ) + + val instance = readValueOrGenerate( + environmentConfig.getString("instance"), + s"$service@$host" + ) + + Environment(host, service, instance, incarnation) + } + + private def readValueOrGenerate(configuredValue: String, generator: => String): String = + if(configuredValue == "auto") generator else configuredValue + + +} diff --git a/kamon-core/src/main/scala/kamon/Kamon.scala b/kamon-core/src/main/scala/kamon/Kamon.scala index a0c35a71..29c85559 100644 --- a/kamon-core/src/main/scala/kamon/Kamon.scala +++ b/kamon-core/src/main/scala/kamon/Kamon.scala @@ -22,21 +22,19 @@ import io.opentracing.propagation.Format import io.opentracing.{ActiveSpan, Span, SpanContext} import kamon.metric._ import kamon.trace.Tracer -import kamon.util.{HexCodec, MeasurementUnit} +import kamon.util.MeasurementUnit import scala.concurrent.Future import scala.concurrent.duration.Duration -import scala.concurrent.forkjoin.ThreadLocalRandom object Kamon extends MetricLookup with ReporterRegistry with io.opentracing.Tracer { private val initialConfig = ConfigFactory.load() - private val incarnation = HexCodec.toLowerHex(ThreadLocalRandom.current().nextLong()) private val metricRegistry = new MetricRegistry(initialConfig) private val reporterRegistry = new ReporterRegistryImpl(metricRegistry, initialConfig) private val tracer = new Tracer(Kamon, reporterRegistry) - private val env = new AtomicReference[Environment](environmentFromConfig(ConfigFactory.load())) + private val env = new AtomicReference[Environment](Environment.fromConfig(ConfigFactory.load())) def environment: Environment = env.get() @@ -44,7 +42,7 @@ object Kamon extends MetricLookup with ReporterRegistry with io.opentracing.Trac def reconfigure(config: Config): Unit = synchronized { metricRegistry.reconfigure(config) reporterRegistry.reconfigure(config) - env.set(environmentFromConfig(config)) + env.set(Environment.fromConfig(config)) } @@ -100,17 +98,4 @@ object Kamon extends MetricLookup with ReporterRegistry with io.opentracing.Trac override def stopAllReporters(): Future[Unit] = reporterRegistry.stopAllReporters() - - - case class Environment(config: Config, application: String, host: String, instance: String, incarnation: String) - - private def environmentFromConfig(config: Config): Environment = { - val environmentConfig = config.getConfig("kamon.environment") - - val application = environmentConfig.getString("application") - val host = environmentConfig.getString("host") - val instance = environmentConfig.getString("instance") - - Environment(config, application, host, instance, incarnation) - } } diff --git a/kamon-core/src/test/scala/kamon/EnvironmentSpec.scala b/kamon-core/src/test/scala/kamon/EnvironmentSpec.scala new file mode 100644 index 00000000..2dee46ab --- /dev/null +++ b/kamon-core/src/test/scala/kamon/EnvironmentSpec.scala @@ -0,0 +1,48 @@ +package kamon + +import com.typesafe.config.ConfigFactory +import org.scalatest.{Matchers, WordSpec} + +class EnvironmentSpec extends WordSpec with Matchers { + private val baseConfig = ConfigFactory.parseString( + """ + |kamon.environment { + | service = environment-spec + | host = auto + | instance = auto + |} + """.stripMargin + ) + + "the Kamon environment" should { + "assign a host and instance name when they are set to 'auto'" in { + val env = Environment.fromConfig(baseConfig) + + env.host shouldNot be("auto") + env.instance shouldNot be("auto") + env.instance shouldBe s"environment-spec@${env.host}" + } + + "use the configured host and instance, if provided" in { + val customConfig = ConfigFactory.parseString( + """ + |kamon.environment { + | host = spec-host + | instance = spec-instance + |} + """.stripMargin) + + val env = Environment.fromConfig(customConfig.withFallback(baseConfig)) + + env.host should be("spec-host") + env.instance should be("spec-instance") + } + + "always return the same incarnation name" in { + val envOne = Environment.fromConfig(baseConfig) + val envTwo = Environment.fromConfig(baseConfig) + + envOne.incarnation shouldBe envTwo.incarnation + } + } +} -- cgit v1.2.3