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) } } }