aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/SpanContext.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2017-07-14 14:12:47 +0200
committerIvan Topolnjak <ivantopo@gmail.com>2017-07-14 14:12:47 +0200
commit34010efc7b273e50d805a277646f14aa96aaa8b2 (patch)
tree8f7a6f00eac4e0a4cb60c9093b3c5d06ed982662 /kamon-core/src/main/scala/kamon/trace/SpanContext.scala
parent52c4503b6aea2309feeb550b7db2e5fa627dedc8 (diff)
downloadKamon-34010efc7b273e50d805a277646f14aa96aaa8b2.tar.gz
Kamon-34010efc7b273e50d805a277646f14aa96aaa8b2.tar.bz2
Kamon-34010efc7b273e50d805a277646f14aa96aaa8b2.zip
wip
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/SpanContext.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/SpanContext.scala92
1 files changed, 79 insertions, 13 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/SpanContext.scala b/kamon-core/src/main/scala/kamon/trace/SpanContext.scala
index b37e208b..ae92f46d 100644
--- a/kamon-core/src/main/scala/kamon/trace/SpanContext.scala
+++ b/kamon-core/src/main/scala/kamon/trace/SpanContext.scala
@@ -15,26 +15,92 @@
package kamon.trace
-import java.lang
-import java.util.{Map => JavaMap}
+import kamon.trace.IdentityProvider.Identifier
+import kamon.trace.SpanContext.{Baggage, SamplingDecision, Source}
-import scala.collection.JavaConverters._
+/**
+ *
+ * @param traceID
+ * @param spanID
+ * @param parentID
+ * @param samplingDecision
+ * @param baggage
+ */
+case class SpanContext(traceID: Identifier, spanID: Identifier, parentID: Identifier, samplingDecision: SamplingDecision, baggage: Baggage, source: Source) {
-class SpanContext(val traceID: Long, val spanID: Long, val parentID: Long, val sampled: Boolean,
- private var baggage: Map[String, String]) extends io.opentracing.SpanContext {
+ def createChild(childSpanID: Identifier, samplingDecision: SamplingDecision): SpanContext =
+ this.copy(parentID = this.spanID, spanID = childSpanID)
+}
+
+object SpanContext {
- private[kamon] def addBaggageItem(key: String, value: String): Unit = synchronized {
- baggage = baggage + (key -> value)
+ sealed trait Source
+ object Source {
+ case object Local extends Source
+ case object Remote extends Source
}
- private[kamon] def getBaggage(key: String): String = synchronized {
- baggage.get(key).getOrElse(null)
+ val EmptySpanContext = SpanContext(
+ traceID = IdentityProvider.NoIdentifier,
+ spanID = IdentityProvider.NoIdentifier,
+ parentID = IdentityProvider.NoIdentifier,
+ samplingDecision = SamplingDecision.DoNotSample,
+ baggage = Baggage.EmptyBaggage,
+ source = Source.Local
+ )
+
+
+ sealed trait SamplingDecision
+ object SamplingDecision {
+
+ /**
+ * The Trace is sampled, all child Spans should be sampled as well.
+ */
+ case object Sample extends SamplingDecision
+
+ /**
+ * The Trace is not sampled, none of the child Spans should be sampled.
+ */
+ case object DoNotSample extends SamplingDecision
+
+ /**
+ * The sampling decision has not been taken yet, the Tracer is free to decide when creating a Span.
+ */
+ case object Unknown extends SamplingDecision
}
- private[kamon] def baggageMap: Map[String, String] =
- baggage
+ /**
+ *
+ */
+
+ sealed trait Baggage {
+ def add(key: String, value:String): Unit
+ def get(key: String): Option[String]
+ def getAll(): Map[String, String]
+ }
+
+ object Baggage {
+ def apply(): Baggage = new DefaultBaggage()
+
+ case object EmptyBaggage extends Baggage {
+ override def add(key: String, value: String): Unit = {}
+ override def get(key: String): Option[String] = None
+ override def getAll: Map[String, String] = Map.empty
+ }
+
+
+ final class DefaultBaggage extends Baggage {
+ private var baggage: Map[String, String] = Map.empty
+
+ def add(key: String, value: String): Unit = synchronized {
+ baggage = baggage + (key -> value)
+ }
+
+ def get(key: String): Option[String] =
+ baggage.get(key)
- override def baggageItems(): lang.Iterable[JavaMap.Entry[String, String]] = synchronized {
- baggage.asJava.entrySet()
+ def getAll: Map[String, String] =
+ baggage
+ }
}
}