aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-10-12 02:26:09 +0200
committerIvan Topolnjak <ivantopo@gmail.com>2014-10-12 02:26:09 +0200
commit109ba0e17bf6d5ffbcf784e808fbb8e8f3d32a8c (patch)
treeae78312985700c2b411f027baeb073e43daece84
parent30cd0ea7634615f55314c56b76fd000a52af8449 (diff)
downloadKamon-109ba0e17bf6d5ffbcf784e808fbb8e8f3d32a8c.tar.gz
Kamon-109ba0e17bf6d5ffbcf784e808fbb8e8f3d32a8c.tar.bz2
Kamon-109ba0e17bf6d5ffbcf784e808fbb8e8f3d32a8c.zip
= core: fix NPE when finishing segments, fixes #88
-rw-r--r--kamon-core/src/main/scala/kamon/trace/TraceContext.scala12
-rw-r--r--kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala13
2 files changed, 20 insertions, 5 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/TraceContext.scala b/kamon-core/src/main/scala/kamon/trace/TraceContext.scala
index 6ea30511..a15a4326 100644
--- a/kamon-core/src/main/scala/kamon/trace/TraceContext.scala
+++ b/kamon-core/src/main/scala/kamon/trace/TraceContext.scala
@@ -26,6 +26,8 @@ import kamon.trace.TraceContextAware.DefaultTraceContextAware
import kamon.trace.TraceContext.SegmentIdentity
import kamon.metric.TraceMetrics.TraceMetricRecorder
+import scala.annotation.tailrec
+
trait TraceContext {
def name: String
def token: String
@@ -136,10 +138,12 @@ class SimpleMetricCollectionContext(traceName: String, val token: String, metada
}
}
- private def drainFinishedSegments(metricRecorder: TraceMetricRecorder): Unit = {
- while (!finishedSegments.isEmpty) {
- val segmentData = finishedSegments.poll()
- metricRecorder.segmentRecorder(segmentData.identity).record(segmentData.duration)
+ @tailrec private def drainFinishedSegments(metricRecorder: TraceMetricRecorder): Unit = {
+ val segment = finishedSegments.poll()
+ if(segment != null) {
+ metricRecorder.segmentRecorder(segment.identity).record(segment.duration)
+ println("CLOSED")
+ drainFinishedSegments(metricRecorder)
}
}
diff --git a/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala b/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala
index 1db2db67..b6bcc677 100644
--- a/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala
+++ b/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala
@@ -21,6 +21,7 @@ import akka.routing.RoundRobinPool
import akka.util.Timeout
import kamon.Kamon
import kamon.metric.Subscriptions.TickMetricSnapshot
+import kamon.metric.TraceMetrics.HttpClientRequest
import kamon.metric._
import kamon.spray.KamonTraceDirectives
import kamon.trace.TraceRecorder
@@ -124,6 +125,16 @@ object SimpleRequestProcessor extends App with SimpleRoutingApp with RequestBuil
throw new NullPointerException
"okk"
}
+ } ~
+ path("segment") {
+ complete {
+ val segment = TraceRecorder.startSegment(HttpClientRequest("hello-world"))
+ (replier ? "hello").mapTo[String].onComplete { t =>
+ segment.get.finish()
+ }
+
+ "segment"
+ }
}
}
}
@@ -166,7 +177,7 @@ class Replier extends Actor with ActorLogging {
if (TraceRecorder.currentContext.isEmpty)
log.warning("PROCESSING A MESSAGE WITHOUT CONTEXT")
- log.info("Processing at the Replier, and self is: {}", self)
+ //log.info("Processing at the Replier, and self is: {}", self)
sender ! anything
}
}