aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/ContextPropagation.scala
blob: bfcfbf7e39b235b9b2f26d038d8db21feb266302 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package kamon

import com.typesafe.config.Config
import kamon.context.HttpPropagation

trait ContextPropagation { self: Configuration with ClassLoading =>
  @volatile private var _propagationComponents: ContextPropagation.Components = _
  @volatile private var _defaultHttpPropagation: HttpPropagation = _

  // 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.channels configuration setting.
    *
    * @param channelName Channel name to retrieve.
    * @return The HTTP propagation, if defined.
    */
  def httpPropagation(channelName: String): Option[HttpPropagation] =
    _propagationComponents.httpChannels.get(channelName)

  /**
    * Retrieves the default HTTP propagation channel. Configuration for this channel can be found under the
    * kamon.propagation.channels.http configuration setting.
    *
    * @return The default HTTP propagation.
    */
  def defaultHttpPropagation(): HttpPropagation =
    _defaultHttpPropagation



  private def init(config: Config): Unit = synchronized {
    _propagationComponents = ContextPropagation.Components.from(self.config, self)
    _defaultHttpPropagation = _propagationComponents.httpChannels(ContextPropagation.DefaultHttpChannel)
  }
}

object ContextPropagation {
  val DefaultHttpChannel = "default"
  val DefaultBinaryChannel = "default"

  case class Components(
    httpChannels: Map[String, HttpPropagation]
  )

  object Components {

    def from(config: Config, classLoading: ClassLoading): Components = {
      val propagationConfig = config.getConfig("kamon.propagation")
      val httpChannelsConfig = propagationConfig.getConfig("http").configurations
      val httpChannels = httpChannelsConfig.map {
        case (channelName, channelConfig) => (channelName -> HttpPropagation.from(channelConfig, classLoading))
      }

      Components(httpChannels)
    }
  }
}