aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/ContextPropagation.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/ContextPropagation.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/ContextPropagation.scala92
1 files changed, 92 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/ContextPropagation.scala b/kamon-core/src/main/scala/kamon/ContextPropagation.scala
new file mode 100644
index 00000000..8f2ed8e4
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/ContextPropagation.scala
@@ -0,0 +1,92 @@
+package kamon
+
+import com.typesafe.config.Config
+import kamon.context.BinaryPropagation.{ByteStreamReader, ByteStreamWriter}
+import kamon.context.HttpPropagation.{HeaderReader, HeaderWriter}
+import kamon.context.{BinaryPropagation, HttpPropagation, Propagation}
+
+trait ContextPropagation { self: Configuration with ClassLoading =>
+ @volatile private var _propagationComponents: ContextPropagation.Components = _
+ @volatile private var _defaultHttpPropagation: Propagation[HeaderReader, HeaderWriter] = _
+ @volatile private var _defaultBinaryPropagation: Propagation[ByteStreamReader, ByteStreamWriter] = _
+
+ // Initial configuration and reconfigures
+ init(self.config)
+ self.onReconfigure(newConfig => self.init(newConfig))
+
+
+ /**
+ * Retrieves the HTTP propagation channel with the supplied name. Propagation channels are configured on the
+ * kamon.propagation.http configuration section.
+ *
+ * @param channelName Channel name to retrieve.
+ * @return The HTTP propagation, if available.
+ */
+ def httpPropagation(channelName: String): Option[Propagation[HeaderReader, HeaderWriter]] =
+ _propagationComponents.httpChannels.get(channelName)
+
+ /**
+ * Retrieves the binary propagation channel with the supplied name. Propagation channels are configured on the
+ * kamon.propagation.binary configuration section.
+ *
+ * @param channelName Channel name to retrieve.
+ * @return The binary propagation, if available.
+ */
+ def binaryPropagation(channelName: String): Option[Propagation[ByteStreamReader, ByteStreamWriter]] =
+ _propagationComponents.binaryChannels.get(channelName)
+
+ /**
+ * Retrieves the default HTTP propagation channel. Configuration for this channel can be found under the
+ * kamon.propagation.http.default configuration section.
+ *
+ * @return The default HTTP propagation.
+ */
+ def defaultHttpPropagation(): Propagation[HeaderReader, HeaderWriter] =
+ _defaultHttpPropagation
+
+ /**
+ * Retrieves the default binary propagation channel. Configuration for this channel can be found under the
+ * kamon.propagation.binary.default configuration section.
+ *
+ * @return The default HTTP propagation.
+ */
+ def defaultBinaryPropagation(): Propagation[ByteStreamReader, ByteStreamWriter] =
+ _defaultBinaryPropagation
+
+
+
+ private def init(config: Config): Unit = synchronized {
+ _propagationComponents = ContextPropagation.Components.from(self.config, self)
+ _defaultHttpPropagation = _propagationComponents.httpChannels(ContextPropagation.DefaultHttpChannel)
+ _defaultBinaryPropagation = _propagationComponents.binaryChannels(ContextPropagation.DefaultBinaryChannel)
+ }
+}
+
+object ContextPropagation {
+ val DefaultHttpChannel = "default"
+ val DefaultBinaryChannel = "default"
+
+ case class Components(
+ httpChannels: Map[String, Propagation[HeaderReader, HeaderWriter]],
+ binaryChannels: Map[String, Propagation[ByteStreamReader, ByteStreamWriter]]
+ )
+
+ object Components {
+
+ def from(config: Config, classLoading: ClassLoading): Components = {
+ val propagationConfig = config.getConfig("kamon.propagation")
+ val httpChannelsConfig = propagationConfig.getConfig("http").configurations
+ val binaryChannelsConfig = propagationConfig.getConfig("binary").configurations
+
+ val httpChannels = httpChannelsConfig.map {
+ case (channelName, channelConfig) => (channelName -> HttpPropagation.from(channelConfig, classLoading))
+ }
+
+ val binaryChannels = binaryChannelsConfig.map {
+ case (channelName, channelConfig) => (channelName -> BinaryPropagation.from(channelConfig, classLoading))
+ }
+
+ Components(httpChannels, binaryChannels)
+ }
+ }
+}