diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2015-02-12 11:30:06 +0100 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2015-02-13 05:15:30 +0100 |
commit | 07fc83bb01c5873b47aff50d6d3abbb9f11842bd (patch) | |
tree | 814c6067a25066978b5cb8bac6541f39d0d4454d /kamon-core/src/main/scala/kamon/Kamon.scala | |
parent | 82a110b23ca57286e4e3dd0315c20ed99b5e8f88 (diff) | |
download | Kamon-07fc83bb01c5873b47aff50d6d3abbb9f11842bd.tar.gz Kamon-07fc83bb01c5873b47aff50d6d3abbb9f11842bd.tar.bz2 Kamon-07fc83bb01c5873b47aff50d6d3abbb9f11842bd.zip |
! all: Kamon now works as a single instance in a companion object.
Diffstat (limited to 'kamon-core/src/main/scala/kamon/Kamon.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/Kamon.scala | 76 |
1 files changed, 44 insertions, 32 deletions
diff --git a/kamon-core/src/main/scala/kamon/Kamon.scala b/kamon-core/src/main/scala/kamon/Kamon.scala index 6fedc065..2bed4737 100644 --- a/kamon-core/src/main/scala/kamon/Kamon.scala +++ b/kamon-core/src/main/scala/kamon/Kamon.scala @@ -16,49 +16,61 @@ package kamon import _root_.akka.actor import _root_.akka.actor._ -import com.typesafe.config.Config +import com.typesafe.config.{ ConfigFactory, Config } import kamon.metric._ -import kamon.supervisor.ModuleSupervisor -import kamon.trace.{ Tracer, TracerExtension } +import kamon.trace.{ TracerExtensionImpl, TracerExtension } -class Kamon(val actorSystem: ActorSystem) { - val metrics: MetricsExtension = Metrics.get(actorSystem) - val tracer: TracerExtension = Tracer.get(actorSystem) - val userMetrics: UserMetricsExtension = UserMetrics.get(actorSystem) +object Kamon { + trait Extension extends actor.Extension - // This will cause all auto-start modules to initiate. - ModuleSupervisor.get(actorSystem) + private case class KamonCoreComponents( + metrics: MetricsExtension, + tracer: TracerExtension, + userMetrics: UserMetricsExtension) - def shutdown(): Unit = - actorSystem.shutdown() -} + @volatile private var _system: ActorSystem = _ + @volatile private var _coreComponents: Option[KamonCoreComponents] = None -object Kamon { - trait Extension extends actor.Extension - def apply[T <: Extension](key: ExtensionId[T])(implicit system: ActorSystem): T = key(system) + def start(config: Config): Unit = synchronized { + if (_coreComponents.isEmpty) { + val metrics = MetricsExtensionImpl(config) + val simpleMetrics = UserMetricsExtensionImpl(metrics) + val tracer = TracerExtensionImpl(metrics, config) - def apply(): Kamon = - apply("kamon") + _coreComponents = Some(KamonCoreComponents(metrics, tracer, simpleMetrics)) + _system = ActorSystem("kamon", config) - def apply(actorSystemName: String): Kamon = - apply(ActorSystem(actorSystemName)) + metrics.start(_system) + tracer.start(_system) - def apply(actorSystemName: String, config: Config): Kamon = - apply(ActorSystem(actorSystemName, config)) + } else sys.error("Kamon has already been started.") + } - def apply(system: ActorSystem): Kamon = - new Kamon(system) + def start(): Unit = + start(ConfigFactory.load) - def create(): Kamon = - apply() + def metrics: MetricsExtension = + ifStarted(_.metrics) - def create(actorSystemName: String): Kamon = - apply(ActorSystem(actorSystemName)) + def tracer: TracerExtension = + ifStarted(_.tracer) - def create(actorSystemName: String, config: Config): Kamon = - apply(ActorSystem(actorSystemName, config)) + def userMetrics: UserMetricsExtension = + ifStarted(_.userMetrics) - def create(system: ActorSystem): Kamon = - new Kamon(system) + def apply[T <: Kamon.Extension](key: ExtensionId[T]): T = + ifStarted { _ ⇒ + if (_system ne null) + key(_system) + else + sys.error("Cannot retrieve extensions while Kamon is being initialized.") + } + + def extension[T <: Kamon.Extension](key: ExtensionId[T]): T = + apply(key) + + private def ifStarted[T](thunk: KamonCoreComponents ⇒ T): T = + _coreComponents.map(thunk(_)) getOrElse (sys.error("Kamon has not been started yet.")) + +} -}
\ No newline at end of file |