aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-11-09 22:55:43 +0100
committerIvan Topolnjak <ivantopo@gmail.com>2014-11-09 22:56:03 +0100
commit447605e612d5bbea9765ede288ba19b1a69af48c (patch)
tree9777130efb47e31bbf262c047cb875d1cdc4724c
parent0bb57412690b8694f742d479213bda6f7f090630 (diff)
downloadKamon-447605e612d5bbea9765ede288ba19b1a69af48c.tar.gz
Kamon-447605e612d5bbea9765ede288ba19b1a69af48c.tar.bz2
Kamon-447605e612d5bbea9765ede288ba19b1a69af48c.zip
+ core,play,spray: allow segments to identify the library they belong to.
-rw-r--r--kamon-core/src/main/scala/kamon/trace/TraceContext.scala24
-rw-r--r--kamon-core/src/test/scala/kamon/metric/TraceMetricsSpec.scala8
-rw-r--r--kamon-core/src/test/scala/kamon/trace/TraceContextManipulationSpec.scala4
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetricExtractor.scala4
-rw-r--r--kamon-play/src/main/scala/kamon/play/Play.scala2
-rw-r--r--kamon-play/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala4
-rw-r--r--kamon-play/src/test/scala/kamon/play/WSInstrumentationSpec.scala4
-rw-r--r--kamon-playground/src/main/scala/test/SimpleRequestProcessor.scala4
-rw-r--r--kamon-spray/src/main/scala/kamon/spray/Spray.scala1
-rw-r--r--kamon-spray/src/main/scala/spray/can/client/ClientRequestInstrumentation.scala4
-rw-r--r--kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala11
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)
}
}
}