diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2014-11-09 22:55:43 +0100 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2014-11-09 22:56:03 +0100 |
commit | 447605e612d5bbea9765ede288ba19b1a69af48c (patch) | |
tree | 9777130efb47e31bbf262c047cb875d1cdc4724c | |
parent | 0bb57412690b8694f742d479213bda6f7f090630 (diff) | |
download | Kamon-447605e612d5bbea9765ede288ba19b1a69af48c.tar.gz Kamon-447605e612d5bbea9765ede288ba19b1a69af48c.tar.bz2 Kamon-447605e612d5bbea9765ede288ba19b1a69af48c.zip |
+ core,play,spray: allow segments to identify the library they belong to.
11 files changed, 39 insertions, 31 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/TraceContext.scala b/kamon-core/src/main/scala/kamon/trace/TraceContext.scala index 9555daba..5b74e6b2 100644 --- a/kamon-core/src/main/scala/kamon/trace/TraceContext.scala +++ b/kamon-core/src/main/scala/kamon/trace/TraceContext.scala @@ -37,14 +37,15 @@ sealed trait TraceContext { def isClosed: Boolean = !isOpen def isEmpty: Boolean def nonEmpty: Boolean = !isEmpty - def startSegment(segmentName: String, label: String): Segment + def startSegment(segmentName: String, category: String, library: String): Segment def nanoTimestamp: Long } sealed trait Segment { def name: String def rename(newName: String): Unit - def label: String + def category: String + def library: String def finish(): Unit def isEmpty: Boolean } @@ -57,12 +58,13 @@ case object EmptyTraceContext extends TraceContext { def origin: TraceContextOrigin = TraceContextOrigin.Local def isOpen: Boolean = false def isEmpty: Boolean = true - def startSegment(segmentName: String, label: String): Segment = EmptySegment + def startSegment(segmentName: String, category: String, library: String): Segment = EmptySegment def nanoTimestamp: Long = 0L case object EmptySegment extends Segment { val name: String = "empty-segment" - val label: String = "empty-label" + val category: String = "empty-category" + val library: String = "empty-library" def isEmpty: Boolean = true def rename(newName: String): Unit = {} def finish: Unit = {} @@ -99,7 +101,7 @@ class DefaultTraceContext(traceName: String, val token: String, izOpen: Boolean, } } - def startSegment(segmentName: String, segmentLabel: String): Segment = new DefaultSegment(segmentName, segmentLabel) + def startSegment(segmentName: String, category: String, library: String): Segment = new DefaultSegment(segmentName, category, library) @tailrec private def drainFinishedSegments(metricRecorder: TraceMetricRecorder): Unit = { val segment = finishedSegments.poll() @@ -109,8 +111,8 @@ class DefaultTraceContext(traceName: String, val token: String, izOpen: Boolean, } } - private def finishSegment(segmentName: String, label: String, duration: Long): Unit = { - finishedSegments.add(SegmentData(SegmentMetricIdentity(segmentName, label), duration)) + private def finishSegment(segmentName: String, category: String, library: String, duration: Long): Unit = { + finishedSegments.add(SegmentData(SegmentMetricIdentity(segmentName, category, library), duration)) if (isClosed) { metricsExtension.register(TraceMetrics(name), TraceMetrics.Factory).map { traceMetrics ⇒ @@ -119,7 +121,7 @@ class DefaultTraceContext(traceName: String, val token: String, izOpen: Boolean, } } - class DefaultSegment(segmentName: String, val label: String) extends Segment { + class DefaultSegment(segmentName: String, val category: String, val library: String) extends Segment { private val _segmentStartNanoTime = System.nanoTime() @volatile private var _segmentName = segmentName @volatile private var _isOpen = true @@ -130,15 +132,15 @@ class DefaultTraceContext(traceName: String, val token: String, izOpen: Boolean, def finish: Unit = { val segmentFinishNanoTime = System.nanoTime() - finishSegment(name, label, (segmentFinishNanoTime - _segmentStartNanoTime)) + finishSegment(name, category, library, (segmentFinishNanoTime - _segmentStartNanoTime)) } } } -case class SegmentMetricIdentity(name: String, label: String) extends MetricIdentity +case class SegmentMetricIdentity(name: String, category: String, library: String) extends MetricIdentity case class SegmentData(identity: SegmentMetricIdentity, duration: Long) -object SegmentMetricIdentityLabel { +object SegmentCategory { val HttpClient = "http-client" } diff --git a/kamon-core/src/test/scala/kamon/metric/TraceMetricsSpec.scala b/kamon-core/src/test/scala/kamon/metric/TraceMetricsSpec.scala index 6453dd77..cd10f2d3 100644 --- a/kamon-core/src/test/scala/kamon/metric/TraceMetricsSpec.scala +++ b/kamon-core/src/test/scala/kamon/metric/TraceMetricsSpec.scala @@ -53,7 +53,7 @@ class TraceMetricsSpec extends TestKitBase with WordSpecLike with Matchers with "record the elapsed time for segments that occur inside a given trace" in { TraceRecorder.withNewTraceContext("trace-with-segments") { - val segment = TraceRecorder.currentContext.startSegment("test-segment", "test-label") + val segment = TraceRecorder.currentContext.startSegment("test-segment", "test-category", "test-library") segment.finish() TraceRecorder.finish() } @@ -61,12 +61,12 @@ class TraceMetricsSpec extends TestKitBase with WordSpecLike with Matchers with val snapshot = takeSnapshotOf("trace-with-segments") snapshot.elapsedTime.numberOfMeasurements should be(1) snapshot.segments.size should be(1) - snapshot.segments(SegmentMetricIdentity("test-segment", "test-label")).numberOfMeasurements should be(1) + snapshot.segments(SegmentMetricIdentity("test-segment", "test-category", "test-library")).numberOfMeasurements should be(1) } "record the elapsed time for segments that finish after their correspondent trace has finished" in { val segment = TraceRecorder.withNewTraceContext("closing-segment-after-trace") { - val s = TraceRecorder.currentContext.startSegment("test-segment", "test-label") + val s = TraceRecorder.currentContext.startSegment("test-segment", "test-category", "test-library") TraceRecorder.finish() s } @@ -80,7 +80,7 @@ class TraceMetricsSpec extends TestKitBase with WordSpecLike with Matchers with val afterFinishSegmentSnapshot = takeSnapshotOf("closing-segment-after-trace") afterFinishSegmentSnapshot.elapsedTime.numberOfMeasurements should be(0) afterFinishSegmentSnapshot.segments.size should be(1) - afterFinishSegmentSnapshot.segments(SegmentMetricIdentity("test-segment", "test-label")).numberOfMeasurements should be(1) + afterFinishSegmentSnapshot.segments(SegmentMetricIdentity("test-segment", "test-category", "test-library")).numberOfMeasurements should be(1) } } diff --git a/kamon-core/src/test/scala/kamon/trace/TraceContextManipulationSpec.scala b/kamon-core/src/test/scala/kamon/trace/TraceContextManipulationSpec.scala index e2031a72..0875deff 100644 --- a/kamon-core/src/test/scala/kamon/trace/TraceContextManipulationSpec.scala +++ b/kamon-core/src/test/scala/kamon/trace/TraceContextManipulationSpec.scala @@ -78,7 +78,7 @@ class TraceContextManipulationSpec extends TestKitBase with WordSpecLike with Ma "allow creating a segment within a trace" in { val createdContext = TraceRecorder.withNewTraceContext("trace-with-segments") { - val segment = TraceRecorder.currentContext.startSegment("segment-1", "segment-1-label") + val segment = TraceRecorder.currentContext.startSegment("segment-1", "segment-1-category", "segment-library") TraceRecorder.currentContext } @@ -88,7 +88,7 @@ class TraceContextManipulationSpec extends TestKitBase with WordSpecLike with Ma "allow renaming a segment" in { TraceRecorder.withNewTraceContext("trace-with-renamed-segment") { - val segment = TraceRecorder.currentContext.startSegment("original-segment-name", "segment-label") + val segment = TraceRecorder.currentContext.startSegment("original-segment-name", "segment-label", "segment-library") segment.name should be("original-segment-name") segment.rename("new-segment-name") diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetricExtractor.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetricExtractor.scala index 3710595c..15eba982 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetricExtractor.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetricExtractor.scala @@ -19,7 +19,7 @@ package kamon.newrelic import kamon.metric._ import kamon.metric.TraceMetrics.ElapsedTime import kamon.metric.instrument.Histogram -import kamon.trace.SegmentMetricIdentityLabel.HttpClient +import kamon.trace.SegmentCategory.HttpClient import kamon.trace.SegmentMetricIdentity object WebTransactionMetricExtractor extends MetricExtractor { @@ -45,7 +45,7 @@ object WebTransactionMetricExtractor extends MetricExtractor { Metric.fromKamonMetricSnapshot(snapshot, s"WebTransaction/Custom/$name", None, Scale.Unit) // Extract all external services. - case (SegmentMetricIdentity(segmentName, label), snapshot: Histogram.Snapshot) if label.equals(HttpClient) ⇒ + case (SegmentMetricIdentity(segmentName, category, library), snapshot: Histogram.Snapshot) if category.equals(HttpClient) ⇒ accumulatedExternalServices = accumulatedExternalServices.merge(snapshot, collectionContext) Metric.fromKamonMetricSnapshot(snapshot, s"External/$segmentName/all", None, Scale.Unit) diff --git a/kamon-play/src/main/scala/kamon/play/Play.scala b/kamon-play/src/main/scala/kamon/play/Play.scala index 6e2de3c1..9b69f9a3 100644 --- a/kamon-play/src/main/scala/kamon/play/Play.scala +++ b/kamon-play/src/main/scala/kamon/play/Play.scala @@ -27,6 +27,8 @@ import play.api.mvc.RequestHeader object Play extends ExtensionId[PlayExtension] with ExtensionIdProvider { override def lookup(): ExtensionId[_ <: Extension] = Play override def createExtension(system: ExtendedActorSystem): PlayExtension = new PlayExtension(system) + + val SegmentLibraryName = "WS-client" } class PlayExtension(private val system: ExtendedActorSystem) extends Kamon.Extension { diff --git a/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala b/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala index 125db85e..f16c76c8 100644 --- a/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala +++ b/kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala @@ -18,7 +18,7 @@ package kamon.play.instrumentation import kamon.Kamon import kamon.play.Play -import kamon.trace.{ SegmentMetricIdentityLabel, SegmentMetricIdentity, TraceRecorder } +import kamon.trace.{ SegmentCategory, SegmentMetricIdentity, TraceRecorder } import org.aspectj.lang.ProceedingJoinPoint import org.aspectj.lang.annotation.{ Around, Aspect, Pointcut } import play.api.libs.ws.{ WSRequest, WSResponse } @@ -37,7 +37,7 @@ class WSInstrumentation { val playExtension = Kamon(Play)(system) val executor = playExtension.defaultDispatcher val segmentName = playExtension.generateHttpClientSegmentName(request) - val segment = ctx.startSegment(segmentName, SegmentMetricIdentityLabel.HttpClient) + val segment = ctx.startSegment(segmentName, SegmentCategory.HttpClient, Play.SegmentLibraryName) val response = pjp.proceed().asInstanceOf[Future[WSResponse]] response.map(result ⇒ segment.finish())(executor) diff --git a/kamon-play/src/test/scala/kamon/play/WSInstrumentationSpec.scala b/kamon-play/src/test/scala/kamon/play/WSInstrumentationSpec.scala index bf1ead05..bda8281b 100644 --- a/kamon-play/src/test/scala/kamon/play/WSInstrumentationSpec.scala +++ b/kamon-play/src/test/scala/kamon/play/WSInstrumentationSpec.scala @@ -19,7 +19,7 @@ package kamon.play import kamon.Kamon import kamon.metric.TraceMetrics.TraceMetricsSnapshot import kamon.metric.{ Metrics, TraceMetrics } -import kamon.trace.{ SegmentMetricIdentityLabel, SegmentMetricIdentity, TraceRecorder } +import kamon.trace.{ SegmentCategory, SegmentMetricIdentity, TraceRecorder } import org.scalatest.{ Matchers, WordSpecLike } import org.scalatestplus.play.OneServerPerSuite import play.api.libs.ws.WS @@ -49,7 +49,7 @@ class WSInstrumentationSpec extends WordSpecLike with Matchers with OneServerPer val snapshot = takeSnapshotOf("GET: /inside") snapshot.elapsedTime.numberOfMeasurements should be(1) snapshot.segments.size should be(1) - snapshot.segments(SegmentMetricIdentity("http://localhost:19001/async", SegmentMetricIdentityLabel.HttpClient)).numberOfMeasurements should be(1) + snapshot.segments(SegmentMetricIdentity("http://localhost:19001/async", SegmentCategory.HttpClient, Play.SegmentLibraryName)).numberOfMeasurements should be(1) } "propagate the TraceContext outside an Action and complete the WS request" in { diff --git a/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala b/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala index 506e0bff..da6a3cbe 100644 --- a/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala +++ b/kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala @@ -23,7 +23,7 @@ import kamon.Kamon import kamon.metric.Subscriptions.TickMetricSnapshot import kamon.metric._ import kamon.spray.KamonTraceDirectives -import kamon.trace.{ SegmentMetricIdentityLabel, TraceRecorder } +import kamon.trace.{ SegmentCategory, TraceRecorder } import spray.http.{ StatusCodes, Uri } import spray.httpx.RequestBuilding import spray.routing.SimpleRoutingApp @@ -127,7 +127,7 @@ object SimpleRequestProcessor extends App with SimpleRoutingApp with RequestBuil } ~ path("segment") { complete { - val segment = TraceRecorder.currentContext.startSegment("hello-world", SegmentMetricIdentityLabel.HttpClient) + val segment = TraceRecorder.currentContext.startSegment("hello-world", SegmentCategory.HttpClient, "none") (replier ? "hello").mapTo[String].onComplete { t ⇒ segment.finish() } diff --git a/kamon-spray/src/main/scala/kamon/spray/Spray.scala b/kamon-spray/src/main/scala/kamon/spray/Spray.scala index 72b997d7..ab8d6a7d 100644 --- a/kamon-spray/src/main/scala/kamon/spray/Spray.scala +++ b/kamon-spray/src/main/scala/kamon/spray/Spray.scala @@ -28,6 +28,7 @@ object Spray extends ExtensionId[SprayExtension] with ExtensionIdProvider { def lookup(): ExtensionId[_ <: actor.Extension] = Spray def createExtension(system: ExtendedActorSystem): SprayExtension = new SprayExtension(system) + val SegmentLibraryName = "spray-client" } object ClientSegmentCollectionStrategy { diff --git a/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala b/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala index 94fc3572..813915c4 100644 --- a/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala +++ b/kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala @@ -53,7 +53,7 @@ class ClientRequestInstrumentation { if (sprayExtension.clientSegmentCollectionStrategy == ClientSegmentCollectionStrategy.Internal) { if (requestContext.segment.isEmpty) { val clientRequestName = sprayExtension.generateHostLevelApiSegmentName(request) - val segment = ctx.startSegment(clientRequestName, SegmentMetricIdentityLabel.HttpClient) + val segment = ctx.startSegment(clientRequestName, SegmentCategory.HttpClient, Spray.SegmentLibraryName) requestContext.segment = segment } @@ -116,7 +116,7 @@ class ClientRequestInstrumentation { val sprayExtension = Kamon(Spray)(system) val segment = if (sprayExtension.clientSegmentCollectionStrategy == ClientSegmentCollectionStrategy.Pipelining) - ctx.startSegment(sprayExtension.generateRequestLevelApiSegmentName(request), SegmentMetricIdentityLabel.HttpClient) + ctx.startSegment(sprayExtension.generateRequestLevelApiSegmentName(request), SegmentCategory.HttpClient, Spray.SegmentLibraryName) else EmptyTraceContext.EmptySegment diff --git a/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala b/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala index 57f9ebe1..b90b0f3b 100644 --- a/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala +++ b/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala @@ -23,7 +23,7 @@ import org.scalatest.time.{ Millis, Seconds, Span } import org.scalatest.{ Matchers, WordSpecLike } import spray.httpx.RequestBuilding import spray.http.{ HttpResponse, HttpRequest } -import kamon.trace.{ SegmentMetricIdentityLabel, SegmentMetricIdentity, TraceRecorder } +import kamon.trace.{ SegmentCategory, SegmentMetricIdentity, TraceRecorder } import com.typesafe.config.ConfigFactory import spray.can.Http import spray.http.HttpHeaders.RawHeader @@ -144,7 +144,8 @@ class ClientRequestInstrumentationSpec extends TestKitBase with WordSpecLike wit val traceMetricsSnapshot = takeSnapshotOf("assign-name-to-segment-with-request-level-api") traceMetricsSnapshot.elapsedTime.numberOfMeasurements should be(1) - traceMetricsSnapshot.segments(SegmentMetricIdentity("request-level /request-level-api-segment", SegmentMetricIdentityLabel.HttpClient)).numberOfMeasurements should be(1) + traceMetricsSnapshot.segments(SegmentMetricIdentity("request-level /request-level-api-segment", + SegmentCategory.HttpClient, Spray.SegmentLibraryName)).numberOfMeasurements should be(1) } "rename a request level api segment once it reaches the relevant host connector" in { @@ -174,7 +175,8 @@ class ClientRequestInstrumentationSpec extends TestKitBase with WordSpecLike wit val traceMetricsSnapshot = takeSnapshotOf("rename-segment-with-request-level-api") traceMetricsSnapshot.elapsedTime.numberOfMeasurements should be(1) - traceMetricsSnapshot.segments(SegmentMetricIdentity("host-level /request-level-api-segment", SegmentMetricIdentityLabel.HttpClient)).numberOfMeasurements should be(1) + traceMetricsSnapshot.segments(SegmentMetricIdentity("host-level /request-level-api-segment", + SegmentCategory.HttpClient, Spray.SegmentLibraryName)).numberOfMeasurements should be(1) } } @@ -261,7 +263,8 @@ class ClientRequestInstrumentationSpec extends TestKitBase with WordSpecLike wit val traceMetricsSnapshot = takeSnapshotOf("create-segment-with-host-level-api") traceMetricsSnapshot.elapsedTime.numberOfMeasurements should be(1) - traceMetricsSnapshot.segments(SegmentMetricIdentity("host-level /host-level-api-segment", SegmentMetricIdentityLabel.HttpClient)).numberOfMeasurements should be(1) + traceMetricsSnapshot.segments(SegmentMetricIdentity("host-level /host-level-api-segment", + SegmentCategory.HttpClient, Spray.SegmentLibraryName)).numberOfMeasurements should be(1) } } } |