aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-12-03 02:10:46 +0100
committerIvan Topolnjak <ivantopo@gmail.com>2014-12-03 02:10:46 +0100
commit594c7a1729789eae7037918cde7287bdc4111b70 (patch)
tree1c54caaee4d218640c93d23dcdf6a8167cb2b4e0 /kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
parentf511e1c25aa683e0d436ef9b65d3e841b4a83732 (diff)
downloadKamon-594c7a1729789eae7037918cde7287bdc4111b70.tar.gz
Kamon-594c7a1729789eae7037918cde7287bdc4111b70.tar.bz2
Kamon-594c7a1729789eae7037918cde7287bdc4111b70.zip
= core: first simple approach to providing traces and a subscription mechanism.
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala99
1 files changed, 99 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala b/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
new file mode 100644
index 00000000..04e61407
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/trace/MetricsOnlyContext.scala
@@ -0,0 +1,99 @@
+package kamon.trace
+
+import java.util.concurrent.ConcurrentLinkedQueue
+
+import akka.actor.ActorSystem
+import akka.event.LoggingAdapter
+import kamon.Kamon
+import kamon.metric.TraceMetrics.TraceMetricRecorder
+import kamon.metric.{ MetricsExtension, TraceMetrics, Metrics }
+
+import scala.annotation.tailrec
+
+class MetricsOnlyContext(
+ traceName: String,
+ val token: String,
+ izOpen: Boolean,
+ val levelOfDetail: LevelOfDetail,
+ val origin: TraceContextOrigin,
+ nanoTimeztamp: Long,
+ log: LoggingAdapter,
+ metricsExtension: MetricsExtension,
+ val system: ActorSystem)
+ extends TraceContext {
+
+ @volatile private var _name = traceName
+ @volatile private var _isOpen = izOpen
+ @volatile protected var _elapsedNanoTime = 0L
+
+ private val _nanoTimestamp = nanoTimeztamp
+ private val _finishedSegments = new ConcurrentLinkedQueue[SegmentLatencyData]()
+ private[kamon] val traceLocalStorage: TraceLocalStorage = new TraceLocalStorage
+
+ def rename(newName: String): Unit =
+ if (isOpen) _name = newName
+ else if (log.isWarningEnabled) log.warning("Can't rename trace from [{}] to [{}] because the trace is already closed.", name, newName)
+
+ def name: String = _name
+ def isEmpty: Boolean = false
+ def isOpen: Boolean = _isOpen
+ def nanoTimestamp: Long = _nanoTimestamp
+ def elapsedNanoTime: Long = _elapsedNanoTime
+ def addMetadata(key: String, value: String): Unit = {}
+
+ def finish(): Unit = {
+ _isOpen = false
+ _elapsedNanoTime = System.nanoTime() - _nanoTimestamp
+ val metricRecorder = metricsExtension.register(TraceMetrics(name), TraceMetrics.Factory)
+
+ metricRecorder.map { traceMetrics ⇒
+ traceMetrics.elapsedTime.record(elapsedNanoTime)
+ drainFinishedSegments(traceMetrics)
+ }
+ }
+
+ def startSegment(segmentName: String, category: String, library: String): Segment =
+ new MetricsOnlySegment(segmentName, category, library)
+
+ @tailrec private def drainFinishedSegments(metricRecorder: TraceMetricRecorder): Unit = {
+ val segment = _finishedSegments.poll()
+ if (segment != null) {
+ metricRecorder.segmentRecorder(segment.identity).record(segment.duration)
+ drainFinishedSegments(metricRecorder)
+ }
+ }
+
+ protected def finishSegment(segmentName: String, category: String, library: String, duration: Long): Unit = {
+ _finishedSegments.add(SegmentLatencyData(SegmentMetricIdentity(segmentName, category, library), duration))
+
+ if (isClosed) {
+ metricsExtension.register(TraceMetrics(name), TraceMetrics.Factory).map { traceMetrics ⇒
+ drainFinishedSegments(traceMetrics)
+ }
+ }
+ }
+
+ class MetricsOnlySegment(segmentName: String, val category: String, val library: String) extends Segment {
+ protected val segmentStartNanoTime = System.nanoTime()
+ @volatile private var _segmentName = segmentName
+ @volatile private var _elapsedNanoTime = 0L
+ @volatile protected var _isOpen = true
+
+ def name: String = _segmentName
+ def isEmpty: Boolean = false
+ def addMetadata(key: String, value: String): Unit = {}
+ def isOpen: Boolean = _isOpen
+ def elapsedNanoTime: Long = _elapsedNanoTime
+
+ def rename(newName: String): Unit =
+ if (isOpen) _segmentName = newName
+ else if (log.isWarningEnabled) log.warning("Can't rename segment from [{}] to [{}] because the segment is already closed.", name, newName)
+
+ def finish: Unit = {
+ _isOpen = false
+ _elapsedNanoTime = System.nanoTime() - segmentStartNanoTime
+
+ finishSegment(name, category, library, elapsedNanoTime)
+ }
+ }
+} \ No newline at end of file