diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2017-07-17 13:13:41 +0200 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2017-07-17 13:13:41 +0200 |
commit | 483159862293a065be7cf3743d1aa759fbf31fc0 (patch) | |
tree | c6c2753c1c7abd7f2e44d7686bd088a51267867d /kamon-core/src/main/scala/kamon/trace/Tracer.scala | |
parent | 34010efc7b273e50d805a277646f14aa96aaa8b2 (diff) | |
download | Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.tar.gz Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.tar.bz2 Kamon-483159862293a065be7cf3743d1aa759fbf31fc0.zip |
working on ID generation and SpanContext encoding/decoding
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/Tracer.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/trace/Tracer.scala | 69 |
1 files changed, 32 insertions, 37 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/Tracer.scala b/kamon-core/src/main/scala/kamon/trace/Tracer.scala index 1aec8d7c..08643c63 100644 --- a/kamon-core/src/main/scala/kamon/trace/Tracer.scala +++ b/kamon-core/src/main/scala/kamon/trace/Tracer.scala @@ -27,22 +27,17 @@ import kamon.util.Clock import org.slf4j.LoggerFactory -trait Tracer { - def buildSpan(operationName: String): SpanBuilder +trait ActiveSpanSource { def activeSpan(): ActiveSpan def makeActive(span: Span): ActiveSpan +} - def extract[C](format: SpanContextCodec.Format[C], carrier: C): Option[SpanContext] - def inject[C](spanContext: SpanContext, format: SpanContextCodec.Format[C], carrier: C): Unit - - - - // - // Configuration Utilities - // +trait Tracer extends ActiveSpanSource{ + def buildSpan(operationName: String): SpanBuilder - def setTextMapSpanContextCodec(codec: SpanContextCodec[TextMap]): Unit - def setHttpHeaderSpanContextCodec(codec: SpanContextCodec[TextMap]): Unit + def extract[C](format: SpanContextCodec.Format[C], carrier: C): Option[SpanContext] + def inject[C](spanContext: SpanContext, format: SpanContextCodec.Format[C], carrier: C): C + def inject[C](spanContext: SpanContext, format: SpanContextCodec.Format[C]): C } object Tracer { @@ -57,33 +52,40 @@ object Tracer { private[Tracer] val tracerMetrics = new TracerMetrics(metrics) @volatile private[Tracer] var joinRemoteSpansWithSameID: Boolean = false @volatile private[Tracer] var configuredSampler: Sampler = Sampler.never - @volatile private[Tracer] var idGenerator: IdentifierGenerator = IdentifierGenerator.RandomLong() - @volatile private[Tracer] var textMapSpanContextCodec: SpanContextCodec[TextMap] = SpanContextCodec.TextMap - @volatile private[Tracer] var httpHeaderSpanContextCodec: SpanContextCodec[TextMap] = SpanContextCodec.ZipkinB3 + @volatile private[Tracer] var identityProvider: IdentityProvider = IdentityProvider.Default() + @volatile private[Tracer] var textMapSpanContextCodec: SpanContextCodec[TextMap] = SpanContextCodec.ExtendedB3(identityProvider) + @volatile private[Tracer] var httpHeaderSpanContextCodec: SpanContextCodec[TextMap] = SpanContextCodec.ExtendedB3(identityProvider) reconfigure(initialConfig) - def buildSpan(operationName: String): SpanBuilder = + override def buildSpan(operationName: String): SpanBuilder = new SpanBuilder(operationName, this, reporterRegistry) - def extract[C](format: SpanContextCodec.Format[C], carrier: C): Option[SpanContext] = format match { + override def extract[C](format: SpanContextCodec.Format[C], carrier: C): Option[SpanContext] = format match { case SpanContextCodec.Format.HttpHeaders => httpHeaderSpanContextCodec.extract(carrier.asInstanceOf[TextMap]) case SpanContextCodec.Format.TextMap => textMapSpanContextCodec.extract(carrier.asInstanceOf[TextMap]) case SpanContextCodec.Format.Binary => None case _ => None } - def inject[C](spanContext: SpanContext, format: SpanContextCodec.Format[C], carrier: C): Unit = format match { + override def inject[C](spanContext: SpanContext, format: SpanContextCodec.Format[C], carrier: C): C = format match { case SpanContextCodec.Format.HttpHeaders => httpHeaderSpanContextCodec.inject(spanContext, carrier.asInstanceOf[TextMap]) case SpanContextCodec.Format.TextMap => textMapSpanContextCodec.inject(spanContext, carrier.asInstanceOf[TextMap]) - case SpanContextCodec.Format.Binary => - case _ => + case SpanContextCodec.Format.Binary => carrier + case _ => carrier } - def activeSpan(): ActiveSpan = + override def inject[C](spanContext: SpanContext, format: SpanContextCodec.Format[C]): C = format match { + case SpanContextCodec.Format.HttpHeaders => httpHeaderSpanContextCodec.inject(spanContext) + case SpanContextCodec.Format.TextMap => textMapSpanContextCodec.inject(spanContext) + case SpanContextCodec.Format.Binary => ByteBuffer.allocate(0) // TODO: Implement binary encoding. + case _ => sys.error("can't do") + } + + override def activeSpan(): ActiveSpan = activeSpanStorage.get() - def makeActive(span: Span): ActiveSpan = { + override def makeActive(span: Span): ActiveSpan = { val currentlyActiveSpan = activeSpanStorage.get() val newActiveSpan = ActiveSpan.Default(span, currentlyActiveSpan, activeSpanStorage) activeSpanStorage.set(newActiveSpan) @@ -93,13 +95,6 @@ object Tracer { def sampler: Sampler = configuredSampler - def setTextMapSpanContextCodec(codec: SpanContextCodec[TextMap]): Unit = - this.textMapSpanContextCodec = codec - - def setHttpHeaderSpanContextCodec(codec: SpanContextCodec[TextMap]): Unit = - this.httpHeaderSpanContextCodec = codec - - private[kamon] def reconfigure(config: Config): Unit = synchronized { val traceConfig = config.getConfig("kamon.trace") @@ -110,10 +105,6 @@ object Tracer { case other => sys.error(s"Unexpected sampler name $other.") } } - - private final class TracerMetrics(metricLookup: MetricLookup) { - val createdSpans = metricLookup.counter("tracer.spans-created") - } } final class SpanBuilder(operationName: String, tracer: Tracer.Default, reporterRegistry: ReporterRegistryImpl) { @@ -170,13 +161,13 @@ object Tracer { if(parent.source == Source.Remote && tracer.joinRemoteSpansWithSameID) parent.copy(samplingDecision = samplingDecision) else - parent.createChild(tracer.idGenerator.generateSpanID(), samplingDecision) + parent.createChild(tracer.identityProvider.spanIdentifierGenerator().generate(), samplingDecision) private def newSpanContext(samplingDecision: SamplingDecision): SpanContext = SpanContext( - traceID = tracer.idGenerator.generateTraceID(), - spanID = tracer.idGenerator.generateSpanID(), - parentID = tracer.idGenerator.generateEmptyID(), + traceID = tracer.identityProvider.traceIdentifierGenerator().generate(), + spanID = tracer.identityProvider.spanIdentifierGenerator().generate(), + parentID = IdentityProvider.NoIdentifier, samplingDecision = samplingDecision, baggage = SpanContext.Baggage(), source = Source.Local @@ -185,4 +176,8 @@ object Tracer { def startActive(): ActiveSpan = tracer.makeActive(start()) } + + private final class TracerMetrics(metricLookup: MetricLookup) { + val createdSpans = metricLookup.counter("tracer.spans-created") + } } |