diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2017-05-18 16:21:44 +0200 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2017-05-18 16:21:44 +0200 |
commit | 77f2666650726352a9e15dcf6019064d91393b2e (patch) | |
tree | c39f7e2a18ac6bb1fcd1e2cc73dd3c165919515e /kamon-core/src/main/scala/kamon/trace/Tracer.scala | |
parent | 5dee54a0794b282e9b5729a3d4b85478c12a68d1 (diff) | |
download | Kamon-77f2666650726352a9e15dcf6019064d91393b2e.tar.gz Kamon-77f2666650726352a9e15dcf6019064d91393b2e.tar.bz2 Kamon-77f2666650726352a9e15dcf6019064d91393b2e.zip |
some more wip
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/Tracer.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/trace/Tracer.scala | 109 |
1 files changed, 107 insertions, 2 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/Tracer.scala b/kamon-core/src/main/scala/kamon/trace/Tracer.scala index 802d95ec..84aafe68 100644 --- a/kamon-core/src/main/scala/kamon/trace/Tracer.scala +++ b/kamon-core/src/main/scala/kamon/trace/Tracer.scala @@ -1,5 +1,110 @@ package kamon.trace -trait Tracer extends io.opentracing.Tracer { - def sampler: Sampler +import java.util.concurrent.atomic.AtomicLong + +import io.opentracing.propagation.Format +import io.opentracing.util.ThreadLocalActiveSpanSource +import kamon.ReporterRegistryImpl +import kamon.metric.RecorderRegistry +import kamon.util.Clock + +class Tracer(metrics: RecorderRegistry, reporterRegistry: ReporterRegistryImpl) extends io.opentracing.Tracer { + private val traceCounter = new AtomicLong() + private val spanCounter = new AtomicLong() + private val activeSpanSource = new ThreadLocalActiveSpanSource() + + + override def buildSpan(operationName: String): io.opentracing.Tracer.SpanBuilder = + new SpanBuilder(operationName, spanCounter.incrementAndGet()) + + override def extract[C](format: Format[C], carrier: C): io.opentracing.SpanContext = + sys.error("Extracting not implemented yet.") + + override def inject[C](spanContext: io.opentracing.SpanContext, format: Format[C], carrier: C): Unit = + sys.error("Injecting not implemented yet.") + + override def activeSpan(): io.opentracing.ActiveSpan = + activeSpanSource.activeSpan() + + override def makeActive(span: io.opentracing.Span): io.opentracing.ActiveSpan = + activeSpanSource.makeActive(span) + + + private[kamon] def newTraceID: Long = + traceCounter.incrementAndGet() + + private class SpanBuilder(operationName: String, spanID: Long) extends io.opentracing.Tracer.SpanBuilder { + private var traceID = 0L + private var startTimestamp = 0L + private var parentID = 0L + private var initialTags = Map.empty[String, String] + + override def start(): io.opentracing.Span = + startManual() + + override def asChildOf(parent: io.opentracing.SpanContext): io.opentracing.Tracer.SpanBuilder = { + parent match { + case kamonSpanContext: kamon.trace.SpanContext => + traceID = kamonSpanContext.traceID + parentID = kamonSpanContext.spanID + case _ => sys.error("Can't extract the parent ID from a non-kamon SpanContext") + } + this + } + + override def asChildOf(parent: io.opentracing.BaseSpan[_]): io.opentracing.Tracer.SpanBuilder = { + parent.context() match { + case kamonSpanContext: kamon.trace.SpanContext => + traceID = kamonSpanContext.traceID + parentID = kamonSpanContext.spanID + case _ => sys.error("Can't extract the parent ID from a non-kamon SpanContext") + } + this + } + + override def addReference(referenceType: String, referencedContext: io.opentracing.SpanContext): io.opentracing.Tracer.SpanBuilder = { + if(referenceType != null && referenceType.equals(io.opentracing.References.CHILD_OF)) { + referencedContext match { + case kamonSpanContext: kamon.trace.SpanContext => + traceID = kamonSpanContext.traceID + parentID = kamonSpanContext.spanID + case _ => sys.error("Can't extract the parent ID from a non-kamon SpanContext") + } + } + this + } + + override def withTag(key: String, value: String): io.opentracing.Tracer.SpanBuilder = { + initialTags = initialTags + (key -> value) + this + } + + override def withTag(key: String, value: Boolean): io.opentracing.Tracer.SpanBuilder = { + initialTags = initialTags + (key -> value.toString) + this + } + + override def withTag(key: String, value: Number): io.opentracing.Tracer.SpanBuilder = { + initialTags = initialTags + (key -> value.toString) + this + } + + override def startManual(): Span = { + if(traceID == 0L) traceID = Tracer.this.newTraceID + val startTimestampMicros = if(startTimestamp != 0L) startTimestamp else Clock.microTimestamp() + new Span(new SpanContext(traceID, spanID, parentID), operationName, startTimestampMicros, metrics, reporterRegistry) + } + + override def withStartTimestamp(microseconds: Long): io.opentracing.Tracer.SpanBuilder = { + startTimestamp = microseconds + this + } + + override def startActive(): io.opentracing.ActiveSpan = { + Tracer.this.makeActive(startManual()) + } + + override def ignoreActiveSpan(): io.opentracing.Tracer.SpanBuilder = ??? + } + } |