aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala39
1 files changed, 27 insertions, 12 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala b/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
index c45a49d7..7ef3ac14 100644
--- a/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
+++ b/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
@@ -20,12 +20,13 @@ import java.util.concurrent.ConcurrentLinkedQueue
import akka.event.LoggingAdapter
import kamon.Kamon
-import kamon.metric.{ SegmentMetrics, MetricsModule, TraceMetrics }
+import kamon.metric.{ SegmentMetrics, TraceMetrics }
import kamon.util.{ NanoInterval, RelativeNanoTimestamp }
import scala.annotation.tailrec
+import scala.collection.concurrent.TrieMap
-private[kamon] class MetricsOnlyContext(traceName: String, val token: String, tags: Map[String, String], izOpen: Boolean, val levelOfDetail: LevelOfDetail,
+private[kamon] class MetricsOnlyContext(traceName: String, val token: String, traceTags: Map[String, String], izOpen: Boolean, val levelOfDetail: LevelOfDetail,
val startTimestamp: RelativeNanoTimestamp, log: LoggingAdapter)
extends TraceContext {
@@ -35,6 +36,7 @@ private[kamon] class MetricsOnlyContext(traceName: String, val token: String, ta
private val _finishedSegments = new ConcurrentLinkedQueue[SegmentLatencyData]()
private val _traceLocalStorage = new TraceLocalStorage
+ private val _tags = TrieMap.empty[String, String] ++= traceTags
def rename(newName: String): Unit =
if (isOpen)
@@ -45,37 +47,44 @@ private[kamon] class MetricsOnlyContext(traceName: String, val token: String, ta
def name: String = _name
def isEmpty: Boolean = false
def isOpen: Boolean = _isOpen
+
def addMetadata(key: String, value: String): Unit = {}
+ def addTag(key: String, value: String): Unit = _tags.put(key, value)
+ def removeTag(key: String, value: String): Boolean = _tags.remove(key, value)
+
def finish(): Unit = {
_isOpen = false
val traceElapsedTime = NanoInterval.since(startTimestamp)
_elapsedTime = traceElapsedTime
if (Kamon.metrics.shouldTrack(name, TraceMetrics.category))
- Kamon.metrics.entity(TraceMetrics, name, tags).elapsedTime.record(traceElapsedTime.nanos)
+ Kamon.metrics.entity(TraceMetrics, name, _tags.toMap).elapsedTime.record(traceElapsedTime.nanos)
drainFinishedSegments()
}
def startSegment(segmentName: String, category: String, library: String): Segment =
- new MetricsOnlySegment(segmentName, category, library)
+ startSegment(segmentName, category, library, Map.empty[String, String])
+
+ def startSegment(segmentName: String, category: String, library: String, tags: Map[String, String]): Segment =
+ new MetricsOnlySegment(segmentName, category, library, tags)
@tailrec private def drainFinishedSegments(): Unit = {
val segment = _finishedSegments.poll()
if (segment != null) {
- val segmentTags = Map(
+ val deefaultTags = Map(
"trace" -> name,
"category" -> segment.category,
"library" -> segment.library)
if (Kamon.metrics.shouldTrack(segment.name, SegmentMetrics.category))
- Kamon.metrics.entity(SegmentMetrics, segment.name, segmentTags).elapsedTime.record(segment.duration.nanos)
+ Kamon.metrics.entity(SegmentMetrics, segment.name, deefaultTags ++ segment.tags).elapsedTime.record(segment.duration.nanos)
drainFinishedSegments()
}
}
- protected def finishSegment(segmentName: String, category: String, library: String, duration: NanoInterval): Unit = {
- _finishedSegments.add(SegmentLatencyData(segmentName, category, library, duration))
+ protected def finishSegment(segmentName: String, category: String, library: String, duration: NanoInterval, segmentTags: Map[String, String]): Unit = {
+ _finishedSegments.add(SegmentLatencyData(segmentName, category, library, duration, segmentTags))
if (isClosed) {
drainFinishedSegments()
@@ -89,17 +98,23 @@ private[kamon] class MetricsOnlyContext(traceName: String, val token: String, ta
// will be returned.
def elapsedTime: NanoInterval = _elapsedTime
- class MetricsOnlySegment(segmentName: String, val category: String, val library: String) extends Segment {
+ class MetricsOnlySegment(segmentName: String, val category: String, val library: String, segmentTags: Map[String, String]) extends Segment {
private val _startTimestamp = RelativeNanoTimestamp.now
+ protected val _tags = TrieMap.empty[String, String] ++= segmentTags
+
@volatile private var _segmentName = segmentName
@volatile private var _elapsedTime = NanoInterval.default
@volatile private var _isOpen = true
def name: String = _segmentName
def isEmpty: Boolean = false
- def addMetadata(key: String, value: String): Unit = {}
def isOpen: Boolean = _isOpen
+ def addMetadata(key: String, value: String): Unit = {}
+
+ def addTag(key: String, value: String): Unit = _tags.put(key, value)
+ def removeTag(key: String, value: String): Boolean = _tags.remove(key, value)
+
def rename(newName: String): Unit =
if (isOpen)
_segmentName = newName
@@ -111,7 +126,7 @@ private[kamon] class MetricsOnlyContext(traceName: String, val token: String, ta
val segmentElapsedTime = NanoInterval.since(_startTimestamp)
_elapsedTime = segmentElapsedTime
- finishSegment(name, category, library, segmentElapsedTime)
+ finishSegment(name, category, library, segmentElapsedTime, _tags.toMap)
}
// Handle with care and make sure that the segment is closed before calling this method, otherwise
@@ -121,4 +136,4 @@ private[kamon] class MetricsOnlyContext(traceName: String, val token: String, ta
}
}
-case class SegmentLatencyData(name: String, category: String, library: String, duration: NanoInterval)
+case class SegmentLatencyData(name: String, category: String, library: String, duration: NanoInterval, tags: Map[String, String])