diff options
Diffstat (limited to 'kamon-core/src/main/scala/kamon/ContextPropagation.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/ContextPropagation.scala | 92 |
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) + } + } +} |