diff options
34 files changed, 133 insertions, 196 deletions
diff --git a/kamon-annotation/src/main/scala/kamon/annotation/Annotation.scala b/kamon-annotation/src/main/scala/kamon/annotation/Annotation.scala index 6ddf57cf..4a1eed94 100644 --- a/kamon-annotation/src/main/scala/kamon/annotation/Annotation.scala +++ b/kamon-annotation/src/main/scala/kamon/annotation/Annotation.scala @@ -18,17 +18,12 @@ package kamon.annotation import akka.actor.{ ExtendedActorSystem, Extension, ExtensionId, ExtensionIdProvider } import akka.event.Logging import kamon.Kamon +import org.slf4j.LoggerFactory -object Annotation extends ExtensionId[AnnotationExtension] with ExtensionIdProvider { - override def lookup(): ExtensionId[_ <: Extension] = Annotation - override def createExtension(system: ExtendedActorSystem): AnnotationExtension = new AnnotationExtension(system) -} - -class AnnotationExtension(system: ExtendedActorSystem) extends Kamon.Extension { - val log = Logging(system, classOf[AnnotationExtension]) - log.info(s"Starting the Kamon(Annotation) extension") +object AnnotationExtension { + val log = LoggerFactory.getLogger("kamon.annotation.Annotation") - val config = system.settings.config.getConfig("kamon.annotation") + val config = Kamon.config.getConfig("kamon.annotation") val arraySize = config.getInt("instruments-array-size") } diff --git a/kamon-annotation/src/main/scala/kamon/annotation/el/EnhancedELProcessor.scala b/kamon-annotation/src/main/scala/kamon/annotation/el/EnhancedELProcessor.scala index f407930b..a0e42afd 100644 --- a/kamon-annotation/src/main/scala/kamon/annotation/el/EnhancedELProcessor.scala +++ b/kamon-annotation/src/main/scala/kamon/annotation/el/EnhancedELProcessor.scala @@ -18,8 +18,7 @@ package kamon.annotation.el import javax.el.ELProcessor -import kamon.Kamon -import kamon.annotation.Annotation +import kamon.annotation.AnnotationExtension import scala.util.{ Failure, Success, Try } @@ -36,7 +35,7 @@ object EnhancedELProcessor { eval[String](str) match { case Success(value) ⇒ value case Failure(cause) ⇒ - Kamon(Annotation).log.error(s"${cause.getMessage} -> we will complete the operation with 'unknown' string") + AnnotationExtension.log.error(s"${cause.getMessage} -> we will complete the operation with 'unknown' string") "unknown" } } getOrElse expression @@ -45,7 +44,7 @@ object EnhancedELProcessor { eval[Map[String, String]](s"{$str}") match { case Success(value) ⇒ value.asInstanceOf[java.util.HashMap[String, String]].asScala.toMap case Failure(cause) ⇒ - Kamon(Annotation).log.error(s"${cause.getMessage} -> we will complete the operation with an empty map") + AnnotationExtension.log.error(s"${cause.getMessage} -> we will complete the operation with an empty map") Map.empty[String, String] } } getOrElse Map.empty[String, String] diff --git a/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/AnnotationInstrumentation.scala b/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/AnnotationInstrumentation.scala index bfeac62a..e5d1aff9 100644 --- a/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/AnnotationInstrumentation.scala +++ b/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/AnnotationInstrumentation.scala @@ -29,7 +29,7 @@ class AnnotationInstrumentation extends BaseAnnotationInstrumentation { @After("execution((@kamon.annotation.EnableKamon AnnotationInstruments+).new(..)) && this(obj)") def creation(jps: JoinPoint.StaticPart, obj: AnnotationInstruments): Unit = { - val size = Kamon(Annotation).arraySize + val size = AnnotationExtension.arraySize obj.traces = new AtomicReferenceArray[TraceContextInfo](size) obj.segments = new AtomicReferenceArray[SegmentInfo](size) obj.counters = new AtomicReferenceArray[Counter](size) diff --git a/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/StaticAnnotationInstrumentation.scala b/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/StaticAnnotationInstrumentation.scala index 2320cc09..73112f5c 100644 --- a/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/StaticAnnotationInstrumentation.scala +++ b/kamon-annotation/src/main/scala/kamon/annotation/instrumentation/StaticAnnotationInstrumentation.scala @@ -18,8 +18,7 @@ package kamon.annotation.instrumentation import java.util.concurrent.atomic.AtomicReferenceArray -import kamon.Kamon -import kamon.annotation.Annotation +import kamon.annotation.AnnotationExtension import kamon.metric.instrument import kamon.metric.instrument.{ Counter, MinMaxCounter } import org.aspectj.lang.annotation.{ After, AfterReturning, Around, Aspect } @@ -30,7 +29,7 @@ class StaticAnnotationInstrumentation extends BaseAnnotationInstrumentation with @After("staticinitialization(*) && !within(kamon.annotation.instrumentation.*)") def creation(jps: JoinPoint.StaticPart): Unit = { - val size = Kamon(Annotation).arraySize + val size = AnnotationExtension.arraySize traces = new AtomicReferenceArray[TraceContextInfo](size) segments = new AtomicReferenceArray[SegmentInfo](size) counters = new AtomicReferenceArray[Counter](size) diff --git a/kamon-annotation/src/test/resources/application.conf b/kamon-annotation/src/test/resources/application.conf new file mode 100644 index 00000000..89840bd3 --- /dev/null +++ b/kamon-annotation/src/test/resources/application.conf @@ -0,0 +1,4 @@ +kamon.metric { + tick-interval = 1 hour + default-collection-context-buffer-size = 100 +}
\ No newline at end of file diff --git a/kamon-annotation/src/test/scala/kamon/annotation/AnnotationInstrumentationSpec.scala b/kamon-annotation/src/test/scala/kamon/annotation/AnnotationInstrumentationSpec.scala index 3d94d246..142707a4 100644 --- a/kamon-annotation/src/test/scala/kamon/annotation/AnnotationInstrumentationSpec.scala +++ b/kamon-annotation/src/test/scala/kamon/annotation/AnnotationInstrumentationSpec.scala @@ -22,15 +22,6 @@ import kamon.testkit.BaseKamonSpec import kamon.trace.SegmentCategory class AnnotationInstrumentationSpec extends BaseKamonSpec("annotation-instrumentation-spec") { - override lazy val config = - ConfigFactory.parseString( - """ - |kamon.metric { - | tick-interval = 1 hour - | default-collection-context-buffer-size = 100 - |} - """.stripMargin) - "the Kamon Annotation module" should { "create a new trace when is invoked a method annotated with @Trace" in { for (id ← 1 to 10) Annotated(id).trace() diff --git a/kamon-datadog/src/main/resources/reference.conf b/kamon-datadog/src/main/resources/reference.conf index 3af5595b..7da8e645 100644 --- a/kamon-datadog/src/main/resources/reference.conf +++ b/kamon-datadog/src/main/resources/reference.conf @@ -41,9 +41,9 @@ kamon { modules { kamon-datadog { - auto-start = yes requires-aspectj = no - extension-id = "kamon.datadog.Datadog" + auto-start = yes + extension-class = "kamon.datadog.Datadog" } } }
\ No newline at end of file diff --git a/kamon-datadog/src/test/resources/application.conf b/kamon-datadog/src/test/resources/application.conf new file mode 100644 index 00000000..74def03e --- /dev/null +++ b/kamon-datadog/src/test/resources/application.conf @@ -0,0 +1,10 @@ +kamon { + metric { + tick-interval = 10 seconds + default-collection-context-buffer-size = 1000 + } + + datadog { + max-packet-size = 256 bytes + } +}
\ No newline at end of file diff --git a/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala b/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala index 8818ca3e..75265566 100644 --- a/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala +++ b/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala @@ -31,20 +31,6 @@ import java.net.InetSocketAddress import com.typesafe.config.ConfigFactory class DatadogMetricSenderSpec extends BaseKamonSpec("datadog-metric-sender-spec") { - override lazy val config = - ConfigFactory.parseString( - """ - |kamon { - | metrics { - | disable-aspectj-weaver-missing-error = true - | } - | - | datadog { - | max-packet-size = 256 bytes - | } - |} - | - """.stripMargin) "the DataDogMetricSender" should { "send latency measurements" in new UdpListenerFixture { diff --git a/kamon-jdbc/src/main/resources/reference.conf b/kamon-jdbc/src/main/resources/reference.conf index e058c873..457fd76f 100644 --- a/kamon-jdbc/src/main/resources/reference.conf +++ b/kamon-jdbc/src/main/resources/reference.conf @@ -18,9 +18,7 @@ kamon { modules { kamon-jdbc { - auto-start = yes requires-aspectj = yes - extension-id = "kamon.jdbc.Jdbc" } } }
\ No newline at end of file diff --git a/kamon-jdbc/src/main/scala/kamon/jdbc/Jdbc.scala b/kamon-jdbc/src/main/scala/kamon/jdbc/Jdbc.scala index f66af7a6..eca3f89d 100644 --- a/kamon-jdbc/src/main/scala/kamon/jdbc/Jdbc.scala +++ b/kamon-jdbc/src/main/scala/kamon/jdbc/Jdbc.scala @@ -17,27 +17,23 @@ package kamon.jdbc import kamon.util.ConfigTools.Syntax -import akka.actor.{ ExtendedActorSystem, Extension, ExtensionId, ExtensionIdProvider } +import akka.actor._ import kamon.Kamon -object Jdbc extends ExtensionId[JdbcExtension] with ExtensionIdProvider { - override def lookup(): ExtensionId[_ <: Extension] = Jdbc - override def createExtension(system: ExtendedActorSystem): JdbcExtension = new JdbcExtension(system) - +object JdbcExtension { val SegmentLibraryName = "jdbc" -} -class JdbcExtension(system: ExtendedActorSystem) extends Kamon.Extension { - private val config = system.settings.config.getConfig("kamon.jdbc") + private val config = Kamon.config.getConfig("kamon.jdbc") + private val dynamic = new ReflectiveDynamicAccess(getClass.getClassLoader) private val nameGeneratorFQN = config.getString("name-generator") - private val nameGenerator: JdbcNameGenerator = system.dynamicAccess.createInstanceFor[JdbcNameGenerator](nameGeneratorFQN, Nil).get + private val nameGenerator: JdbcNameGenerator = dynamic.createInstanceFor[JdbcNameGenerator](nameGeneratorFQN, Nil).get private val slowQueryProcessorClass = config.getString("slow-query-processor") - private val slowQueryProcessor: SlowQueryProcessor = system.dynamicAccess.createInstanceFor[SlowQueryProcessor](slowQueryProcessorClass, Nil).get + private val slowQueryProcessor: SlowQueryProcessor = dynamic.createInstanceFor[SlowQueryProcessor](slowQueryProcessorClass, Nil).get private val sqlErrorProcessorClass = config.getString("sql-error-processor") - private val sqlErrorProcessor: SqlErrorProcessor = system.dynamicAccess.createInstanceFor[SqlErrorProcessor](sqlErrorProcessorClass, Nil).get + private val sqlErrorProcessor: SqlErrorProcessor = dynamic.createInstanceFor[SqlErrorProcessor](sqlErrorProcessorClass, Nil).get val slowQueryThreshold = config.getFiniteDuration("slow-query-threshold").toMillis diff --git a/kamon-jdbc/src/main/scala/kamon/jdbc/instrumentation/StatementInstrumentation.scala b/kamon-jdbc/src/main/scala/kamon/jdbc/instrumentation/StatementInstrumentation.scala index bef20667..321ce398 100644 --- a/kamon-jdbc/src/main/scala/kamon/jdbc/instrumentation/StatementInstrumentation.scala +++ b/kamon-jdbc/src/main/scala/kamon/jdbc/instrumentation/StatementInstrumentation.scala @@ -18,7 +18,7 @@ package kamon.jdbc.instrumentation import java.util.concurrent.TimeUnit.{ NANOSECONDS ⇒ nanos } import kamon.Kamon -import kamon.jdbc.{ JdbcExtension, Jdbc } +import kamon.jdbc.JdbcExtension import kamon.jdbc.metric.StatementsMetrics import kamon.trace.{ Tracer, TraceContext, SegmentCategory } import org.aspectj.lang.ProceedingJoinPoint @@ -44,14 +44,13 @@ class StatementInstrumentation { @Around("onExecuteStatement(sql) || onExecutePreparedStatement(sql) || onExecutePreparedCall(sql)") def aroundExecuteStatement(pjp: ProceedingJoinPoint, sql: String): Any = { Tracer.currentContext.collect { ctx ⇒ - val jdbcExtension = Kamon(Jdbc) implicit val statementRecorder = Kamon.metrics.entity(StatementsMetrics, "jdbc-statements") sql.replaceAll(CommentPattern, Empty) match { - case SelectStatement(_) ⇒ withSegment(ctx, Select, jdbcExtension)(recordRead(pjp, sql, jdbcExtension)) - case InsertStatement(_) ⇒ withSegment(ctx, Insert, jdbcExtension)(recordWrite(pjp, sql, jdbcExtension)) - case UpdateStatement(_) ⇒ withSegment(ctx, Update, jdbcExtension)(recordWrite(pjp, sql, jdbcExtension)) - case DeleteStatement(_) ⇒ withSegment(ctx, Delete, jdbcExtension)(recordWrite(pjp, sql, jdbcExtension)) + case SelectStatement(_) ⇒ withSegment(ctx, Select)(recordRead(pjp, sql)) + case InsertStatement(_) ⇒ withSegment(ctx, Insert)(recordWrite(pjp, sql)) + case UpdateStatement(_) ⇒ withSegment(ctx, Update)(recordWrite(pjp, sql)) + case DeleteStatement(_) ⇒ withSegment(ctx, Delete)(recordWrite(pjp, sql)) case anythingElse ⇒ log.debug(s"Unable to parse sql [$sql]") pjp.proceed() @@ -64,27 +63,27 @@ class StatementInstrumentation { try thunk finally timeSpent(System.nanoTime() - start) } - def withSegment[A](ctx: TraceContext, statement: String, jdbcExtension: JdbcExtension)(thunk: ⇒ A): A = { - val segmentName = jdbcExtension.generateJdbcSegmentName(statement) - val segment = ctx.startSegment(segmentName, SegmentCategory.Database, Jdbc.SegmentLibraryName) + def withSegment[A](ctx: TraceContext, statement: String)(thunk: ⇒ A): A = { + val segmentName = JdbcExtension.generateJdbcSegmentName(statement) + val segment = ctx.startSegment(segmentName, SegmentCategory.Database, JdbcExtension.SegmentLibraryName) try thunk finally segment.finish() } - def recordRead(pjp: ProceedingJoinPoint, sql: String, jdbcExtension: JdbcExtension)(implicit statementRecorder: StatementsMetrics): Any = { - withTimeSpent(pjp.proceedWithErrorHandler(sql, jdbcExtension)) { timeSpent ⇒ + def recordRead(pjp: ProceedingJoinPoint, sql: String)(implicit statementRecorder: StatementsMetrics): Any = { + withTimeSpent(pjp.proceedWithErrorHandler(sql)) { timeSpent ⇒ statementRecorder.reads.record(timeSpent) val timeSpentInMillis = nanos.toMillis(timeSpent) - if (timeSpentInMillis >= jdbcExtension.slowQueryThreshold) { + if (timeSpentInMillis >= JdbcExtension.slowQueryThreshold) { statementRecorder.slows.increment() - jdbcExtension.processSlowQuery(sql, timeSpentInMillis) + JdbcExtension.processSlowQuery(sql, timeSpentInMillis) } } } - def recordWrite(pjp: ProceedingJoinPoint, sql: String, jdbcExtension: JdbcExtension)(implicit statementRecorder: StatementsMetrics): Any = { - withTimeSpent(pjp.proceedWithErrorHandler(sql, jdbcExtension)) { timeSpent ⇒ + def recordWrite(pjp: ProceedingJoinPoint, sql: String)(implicit statementRecorder: StatementsMetrics): Any = { + withTimeSpent(pjp.proceedWithErrorHandler(sql)) { timeSpent ⇒ statementRecorder.writes.record(timeSpent) } } @@ -106,12 +105,12 @@ object StatementInstrumentation { val Delete = "Delete" implicit class PimpedProceedingJoinPoint(pjp: ProceedingJoinPoint) { - def proceedWithErrorHandler(sql: String, jdbcExtension: JdbcExtension)(implicit statementRecorder: StatementsMetrics): Any = { + def proceedWithErrorHandler(sql: String)(implicit statementRecorder: StatementsMetrics): Any = { try { pjp.proceed() } catch { case NonFatal(cause) ⇒ - jdbcExtension.processSqlError(sql, cause) + JdbcExtension.processSqlError(sql, cause) statementRecorder.errors.increment() throw cause } diff --git a/kamon-jdbc/src/test/resources/application.conf b/kamon-jdbc/src/test/resources/application.conf new file mode 100644 index 00000000..8713252c --- /dev/null +++ b/kamon-jdbc/src/test/resources/application.conf @@ -0,0 +1,14 @@ +kamon { + jdbc { + slow-query-threshold = 100 milliseconds + + # Fully qualified name of the implementation of kamon.jdbc.SlowQueryProcessor. + slow-query-processor = kamon.jdbc.instrumentation.NoOpSlowQueryProcessor + + # Fully qualified name of the implementation of kamon.jdbc.SqlErrorProcessor. + sql-error-processor = kamon.jdbc.instrumentation.NoOpSqlErrorProcessor + + # Fully qualified name of the implementation of kamon.jdbc.JdbcNameGenerator + name-generator = kamon.jdbc.instrumentation.NoOpJdbcNameGenerator + } +}
\ No newline at end of file diff --git a/kamon-jdbc/src/test/scala/kamon/jdbc/instrumentation/StatementInstrumentationSpec.scala b/kamon-jdbc/src/test/scala/kamon/jdbc/instrumentation/StatementInstrumentationSpec.scala index 80107dff..a7781447 100644 --- a/kamon-jdbc/src/test/scala/kamon/jdbc/instrumentation/StatementInstrumentationSpec.scala +++ b/kamon-jdbc/src/test/scala/kamon/jdbc/instrumentation/StatementInstrumentationSpec.scala @@ -18,31 +18,11 @@ package kamon.jdbc.instrumentation import java.sql.{ DriverManager, SQLException } import com.typesafe.config.ConfigFactory -import kamon.jdbc.{ Jdbc, JdbcNameGenerator, SqlErrorProcessor, SlowQueryProcessor } -import kamon.metric.TraceMetricsSpec +import kamon.jdbc.{ JdbcExtension, JdbcNameGenerator, SqlErrorProcessor, SlowQueryProcessor } import kamon.testkit.BaseKamonSpec import kamon.trace.{ Tracer, SegmentCategory } class StatementInstrumentationSpec extends BaseKamonSpec("jdbc-spec") { - override lazy val config = - ConfigFactory.parseString( - """ - |kamon { - | jdbc { - | slow-query-threshold = 100 milliseconds - | - | # Fully qualified name of the implementation of kamon.jdbc.SlowQueryProcessor. - | slow-query-processor = kamon.jdbc.instrumentation.NoOpSlowQueryProcessor - | - | # Fully qualified name of the implementation of kamon.jdbc.SqlErrorProcessor. - | sql-error-processor = kamon.jdbc.instrumentation.NoOpSqlErrorProcessor - | - | # Fully qualified name of the implementation of kamon.jdbc.JdbcNameGenerator - | name-generator = kamon.jdbc.instrumentation.NoOpJdbcNameGenerator - | } - |} - """.stripMargin) - val connection = DriverManager.getConnection("jdbc:h2:mem:jdbc-spec", "SA", "") override protected def beforeAll(): Unit = { @@ -79,7 +59,7 @@ class StatementInstrumentationSpec extends BaseKamonSpec("jdbc-spec") { tags = Map( "trace" -> "jdbc-trace-insert", "category" -> SegmentCategory.Database, - "library" -> Jdbc.SegmentLibraryName)) + "library" -> JdbcExtension.SegmentLibraryName)) segmentSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(100) } @@ -105,7 +85,7 @@ class StatementInstrumentationSpec extends BaseKamonSpec("jdbc-spec") { tags = Map( "trace" -> "jdbc-trace-select", "category" -> SegmentCategory.Database, - "library" -> Jdbc.SegmentLibraryName)) + "library" -> JdbcExtension.SegmentLibraryName)) segmentSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(100) } @@ -131,7 +111,7 @@ class StatementInstrumentationSpec extends BaseKamonSpec("jdbc-spec") { tags = Map( "trace" -> "jdbc-trace-update", "category" -> SegmentCategory.Database, - "library" -> Jdbc.SegmentLibraryName)) + "library" -> JdbcExtension.SegmentLibraryName)) segmentSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(100) } @@ -157,7 +137,7 @@ class StatementInstrumentationSpec extends BaseKamonSpec("jdbc-spec") { tags = Map( "trace" -> "jdbc-trace-delete", "category" -> SegmentCategory.Database, - "library" -> Jdbc.SegmentLibraryName)) + "library" -> JdbcExtension.SegmentLibraryName)) segmentSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(100) diff --git a/kamon-log-reporter/src/main/resources/reference.conf b/kamon-log-reporter/src/main/resources/reference.conf index 5394193e..83b2ca4e 100644 --- a/kamon-log-reporter/src/main/resources/reference.conf +++ b/kamon-log-reporter/src/main/resources/reference.conf @@ -5,9 +5,9 @@ kamon { modules { kamon-log-reporter { - auto-start = yes requires-aspectj = no - extension-id = "kamon.logreporter.LogReporter" + auto-start = yes + extension-class = "kamon.logreporter.LogReporter" } } } diff --git a/kamon-newrelic/src/main/resources/reference.conf b/kamon-newrelic/src/main/resources/reference.conf index a1c1c4d3..6d394bbf 100644 --- a/kamon-newrelic/src/main/resources/reference.conf +++ b/kamon-newrelic/src/main/resources/reference.conf @@ -37,9 +37,9 @@ kamon { modules { kamon-newrelic { - auto-start = yes requires-aspectj = no - extension-id = "kamon.newrelic.NewRelic" + auto-start = yes + extension-class = "kamon.newrelic.NewRelic" } } } diff --git a/kamon-play-2.3.x/src/main/resources/reference.conf b/kamon-play-2.3.x/src/main/resources/reference.conf index af43edec..f7566cac 100644 --- a/kamon-play-2.3.x/src/main/resources/reference.conf +++ b/kamon-play-2.3.x/src/main/resources/reference.conf @@ -25,9 +25,7 @@ kamon { modules { kamon-play { - auto-start = yes requires-aspectj = yes - extension-id = "kamon.play.Play" } } }
\ No newline at end of file diff --git a/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala b/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala index d8ef5c97..0da52283 100644 --- a/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala +++ b/kamon-play-2.3.x/src/main/scala/kamon/play/Play.scala @@ -16,32 +16,27 @@ package kamon.play -import akka.actor.{ ExtendedActorSystem, Extension, ExtensionId, ExtensionIdProvider } -import akka.event.Logging +import akka.actor._ import kamon.Kamon import kamon.util.http.HttpServerMetrics +import org.slf4j.LoggerFactory import play.api.libs.ws.WSRequest 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) - +object PlayExtension { val SegmentLibraryName = "WS-client" -} -class PlayExtension(private val system: ExtendedActorSystem) extends Kamon.Extension { - val log = Logging(system, classOf[PlayExtension]) - log.info(s"Starting the Kamon(Play) extension") + val log = LoggerFactory.getLogger("kamon.play.PlayExtension") + private val dynamic = new ReflectiveDynamicAccess(getClass.getClassLoader) - private val config = system.settings.config.getConfig("kamon.play") + private val config = Kamon.config.getConfig("kamon.play") val httpServerMetrics = Kamon.metrics.entity(HttpServerMetrics, "play-server") val includeTraceToken: Boolean = config.getBoolean("automatic-trace-token-propagation") val traceTokenHeaderName: String = config.getString("trace-token-header-name") private val nameGeneratorFQN = config.getString("name-generator") - private val nameGenerator: NameGenerator = system.dynamicAccess.createInstanceFor[NameGenerator](nameGeneratorFQN, Nil).get + private val nameGenerator: NameGenerator = dynamic.createInstanceFor[NameGenerator](nameGeneratorFQN, Nil).get def generateTraceName(requestHeader: RequestHeader): String = nameGenerator.generateTraceName(requestHeader) def generateHttpClientSegmentName(request: WSRequest): String = nameGenerator.generateHttpClientSegmentName(request) diff --git a/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala b/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala index c8a808ec..01b37024 100644 --- a/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala +++ b/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala @@ -16,7 +16,7 @@ package kamon.play.instrumentation import kamon.Kamon -import kamon.play.Play +import kamon.play.PlayExtension import kamon.trace._ import kamon.util.SameThreadExecutionContext import org.aspectj.lang.ProceedingJoinPoint @@ -34,10 +34,8 @@ class RequestInstrumentation { def beforeRouteRequest(requestHeader: RequestHeader): Unit = { import Kamon.tracer - val playExtension = Kamon(Play) - - val token = if (playExtension.includeTraceToken) { - requestHeader.headers.get(playExtension.traceTokenHeaderName) + val token = if (PlayExtension.includeTraceToken) { + requestHeader.headers.get(PlayExtension.traceTokenHeaderName) } else None Tracer.setCurrentContext(tracer.newContext("UnnamedTrace", token)) @@ -47,21 +45,19 @@ class RequestInstrumentation { def aroundDoFilter(pjp: ProceedingJoinPoint, next: EssentialAction): Any = { val essentialAction = (requestHeader: RequestHeader) ⇒ { - val playExtension = Kamon(Play) - def onResult(result: Result): Result = { Tracer.currentContext.collect { ctx ⇒ ctx.finish() recordHttpServerMetrics(result.header, ctx.name) - if (playExtension.includeTraceToken) result.withHeaders(playExtension.traceTokenHeaderName -> ctx.token) + if (PlayExtension.includeTraceToken) result.withHeaders(PlayExtension.traceTokenHeaderName -> ctx.token) else result } getOrElse result } //override the current trace name - Tracer.currentContext.rename(playExtension.generateTraceName(requestHeader)) + Tracer.currentContext.rename(PlayExtension.generateTraceName(requestHeader)) // Invoke the action next(requestHeader).map(onResult)(SameThreadExecutionContext) } @@ -76,5 +72,5 @@ class RequestInstrumentation { } def recordHttpServerMetrics(header: ResponseHeader, traceName: String): Unit = - Kamon(Play).httpServerMetrics.recordResponse(traceName, header.status.toString) + PlayExtension.httpServerMetrics.recordResponse(traceName, header.status.toString) } diff --git a/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala b/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala index 2536c77c..1e3cc8a2 100644 --- a/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala +++ b/kamon-play-2.3.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala @@ -16,8 +16,7 @@ package kamon.play.instrumentation -import kamon.Kamon -import kamon.play.Play +import kamon.play.PlayExtension import kamon.trace.{ Tracer, SegmentCategory } import kamon.util.SameThreadExecutionContext import org.aspectj.lang.ProceedingJoinPoint @@ -34,9 +33,8 @@ class WSInstrumentation { @Around("onExecuteRequest(request)") def aroundExecuteRequest(pjp: ProceedingJoinPoint, request: WSRequest): Any = { Tracer.currentContext.collect { ctx ⇒ - val playExtension = Kamon(Play) - val segmentName = playExtension.generateHttpClientSegmentName(request) - val segment = ctx.startSegment(segmentName, SegmentCategory.HttpClient, Play.SegmentLibraryName) + val segmentName = PlayExtension.generateHttpClientSegmentName(request) + val segment = ctx.startSegment(segmentName, SegmentCategory.HttpClient, PlayExtension.SegmentLibraryName) val response = pjp.proceed().asInstanceOf[Future[WSResponse]] response.onComplete(result ⇒ segment.finish())(SameThreadExecutionContext) diff --git a/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala b/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala index 7683f01e..cb71cc72 100644 --- a/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala +++ b/kamon-play-2.3.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala @@ -53,7 +53,7 @@ class WSInstrumentationSpec extends WordSpecLike with Matchers with OneServerPer tags = Map( "trace" -> "GET: /inside", "category" -> SegmentCategory.HttpClient, - "library" -> Play.SegmentLibraryName)) + "library" -> PlayExtension.SegmentLibraryName)) segmentMetricsSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(1) } @@ -71,7 +71,7 @@ class WSInstrumentationSpec extends WordSpecLike with Matchers with OneServerPer tags = Map( "trace" -> "trace-outside-action", "category" -> SegmentCategory.HttpClient, - "library" -> Play.SegmentLibraryName)) + "library" -> PlayExtension.SegmentLibraryName)) segmentMetricsSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(1) } diff --git a/kamon-play-2.4.x/src/main/resources/reference.conf b/kamon-play-2.4.x/src/main/resources/reference.conf index db94b3f6..f0d70c81 100644 --- a/kamon-play-2.4.x/src/main/resources/reference.conf +++ b/kamon-play-2.4.x/src/main/resources/reference.conf @@ -25,9 +25,7 @@ kamon { modules { kamon-play { - auto-start = yes requires-aspectj = yes - extension-id = "kamon.play.Play" } } } diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/Play.scala b/kamon-play-2.4.x/src/main/scala/kamon/play/Play.scala index db05f29f..e0fdb8ff 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/Play.scala +++ b/kamon-play-2.4.x/src/main/scala/kamon/play/Play.scala @@ -16,32 +16,27 @@ package kamon.play -import akka.actor.{ ExtendedActorSystem, Extension, ExtensionId, ExtensionIdProvider } -import akka.event.Logging +import akka.actor._ import kamon.Kamon import kamon.util.http.HttpServerMetrics +import org.slf4j.LoggerFactory import play.api.libs.ws.WSRequest 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) - +object PlayExtension { val SegmentLibraryName = "WS-client" -} -class PlayExtension(private val system: ExtendedActorSystem) extends Kamon.Extension { - val log = Logging(system, classOf[PlayExtension]) - log.info(s"Starting the Kamon(Play) extension") + val log = LoggerFactory.getLogger("kamon.play.PlayExtension") - private val config = system.settings.config.getConfig("kamon.play") + private val config = Kamon.config.getConfig("kamon.play") + private val dynamic = new ReflectiveDynamicAccess(getClass.getClassLoader) val httpServerMetrics = Kamon.metrics.entity(HttpServerMetrics, "play-server") val includeTraceToken: Boolean = config.getBoolean("automatic-trace-token-propagation") val traceTokenHeaderName: String = config.getString("trace-token-header-name") private val nameGeneratorFQN = config.getString("name-generator") - private val nameGenerator: NameGenerator = system.dynamicAccess.createInstanceFor[NameGenerator](nameGeneratorFQN, Nil).get + private val nameGenerator: NameGenerator = dynamic.createInstanceFor[NameGenerator](nameGeneratorFQN, Nil).get def generateTraceName(requestHeader: RequestHeader): String = nameGenerator.generateTraceName(requestHeader) def generateHttpClientSegmentName(request: WSRequest): String = nameGenerator.generateHttpClientSegmentName(request) diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala b/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala index 438d985f..c30b84c8 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala +++ b/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala @@ -17,7 +17,7 @@ package kamon.play.instrumentation import kamon.Kamon import kamon.Kamon.tracer -import kamon.play.Play +import kamon.play.PlayExtension import kamon.trace._ import kamon.util.SameThreadExecutionContext import org.aspectj.lang.ProceedingJoinPoint @@ -33,10 +33,8 @@ class RequestInstrumentation { @Before("call(* play.api.http.DefaultHttpRequestHandler.routeRequest(..)) && args(requestHeader)") def routeRequest(requestHeader: RequestHeader): Unit = { - val playExtension = Kamon(Play) - - val token = if (playExtension.includeTraceToken) { - requestHeader.headers.get(playExtension.traceTokenHeaderName) + val token = if (PlayExtension.includeTraceToken) { + requestHeader.headers.get(PlayExtension.traceTokenHeaderName) } else None Tracer.setCurrentContext(tracer.newContext("UnnamedTrace", token)) @@ -46,20 +44,18 @@ class RequestInstrumentation { def filters(pjp: ProceedingJoinPoint): Any = { val filter = new EssentialFilter { def apply(next: EssentialAction) = EssentialAction((requestHeader) ⇒ { - val playExtension = Kamon(Play) - def onResult(result: Result): Result = { Tracer.currentContext.collect { ctx ⇒ ctx.finish() - playExtension.httpServerMetrics.recordResponse(ctx.name, result.header.status.toString) + PlayExtension.httpServerMetrics.recordResponse(ctx.name, result.header.status.toString) - if (playExtension.includeTraceToken) result.withHeaders(playExtension.traceTokenHeaderName -> ctx.token) + if (PlayExtension.includeTraceToken) result.withHeaders(PlayExtension.traceTokenHeaderName -> ctx.token) else result } getOrElse result } //override the current trace name - Tracer.currentContext.rename(playExtension.generateTraceName(requestHeader)) + Tracer.currentContext.rename(PlayExtension.generateTraceName(requestHeader)) // Invoke the action next(requestHeader).map(onResult)(SameThreadExecutionContext) }) @@ -70,14 +66,14 @@ class RequestInstrumentation { @Before("call(* play.api.http.HttpErrorHandler.onClientServerError(..)) && args(requestContextAware, statusCode, *)") def onClientError(requestContextAware: TraceContextAware, statusCode: Int): Unit = { requestContextAware.traceContext.collect { ctx ⇒ - Kamon(Play).httpServerMetrics.recordResponse(ctx.name, statusCode.toString) + PlayExtension.httpServerMetrics.recordResponse(ctx.name, statusCode.toString) } } @Before("call(* play.api.http.HttpErrorHandler.onServerError(..)) && args(requestContextAware, ex)") def onServerError(requestContextAware: TraceContextAware, ex: Throwable): Unit = { requestContextAware.traceContext.collect { ctx ⇒ - Kamon(Play).httpServerMetrics.recordResponse(ctx.name, InternalServerError.header.status.toString) + PlayExtension.httpServerMetrics.recordResponse(ctx.name, InternalServerError.header.status.toString) } } } diff --git a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala b/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala index 477ade0a..1e3cc8a2 100644 --- a/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala +++ b/kamon-play-2.4.x/src/main/scala/kamon/play/instrumentation/WSInstrumentation.scala @@ -16,15 +16,13 @@ package kamon.play.instrumentation -import kamon.Kamon -import kamon.play.Play +import kamon.play.PlayExtension import kamon.trace.{ Tracer, SegmentCategory } import kamon.util.SameThreadExecutionContext import org.aspectj.lang.ProceedingJoinPoint import org.aspectj.lang.annotation.{ Around, Aspect, Pointcut } import play.api.libs.ws.{ WSRequest, WSResponse } import scala.concurrent.Future -import scala.util.Try @Aspect class WSInstrumentation { @@ -35,9 +33,8 @@ class WSInstrumentation { @Around("onExecuteRequest(request)") def aroundExecuteRequest(pjp: ProceedingJoinPoint, request: WSRequest): Any = { Tracer.currentContext.collect { ctx ⇒ - val playExtension = Kamon(Play) - val segmentName = playExtension.generateHttpClientSegmentName(request) - val segment = ctx.startSegment(segmentName, SegmentCategory.HttpClient, Play.SegmentLibraryName) + val segmentName = PlayExtension.generateHttpClientSegmentName(request) + val segment = ctx.startSegment(segmentName, SegmentCategory.HttpClient, PlayExtension.SegmentLibraryName) val response = pjp.proceed().asInstanceOf[Future[WSResponse]] response.onComplete(result ⇒ segment.finish())(SameThreadExecutionContext) diff --git a/kamon-play-2.4.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala b/kamon-play-2.4.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala index aa379347..3c83dfc1 100644 --- a/kamon-play-2.4.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala +++ b/kamon-play-2.4.x/src/test/scala/kamon/play/WSInstrumentationSpec.scala @@ -51,7 +51,7 @@ class WSInstrumentationSpec extends WordSpecLike with Matchers with OneServerPer tags = Map( "trace" -> "GET: /inside", "category" -> SegmentCategory.HttpClient, - "library" -> Play.SegmentLibraryName)) + "library" -> PlayExtension.SegmentLibraryName)) segmentMetricsSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(1) } @@ -69,7 +69,7 @@ class WSInstrumentationSpec extends WordSpecLike with Matchers with OneServerPer tags = Map( "trace" -> "trace-outside-action", "category" -> SegmentCategory.HttpClient, - "library" -> Play.SegmentLibraryName)) + "library" -> PlayExtension.SegmentLibraryName)) segmentMetricsSnapshot.histogram("elapsed-time").get.numberOfMeasurements should be(1) } diff --git a/kamon-scala/src/main/resources/reference.conf b/kamon-scala/src/main/resources/reference.conf index 2588d5e8..e2934148 100644 --- a/kamon-scala/src/main/resources/reference.conf +++ b/kamon-scala/src/main/resources/reference.conf @@ -6,10 +6,7 @@ kamon { modules { kamon-scala { - // There is nothing to auto-start. - auto-start = no requires-aspectj = yes - extension-id = none } } }
\ No newline at end of file diff --git a/kamon-spm/src/main/resources/reference.conf b/kamon-spm/src/main/resources/reference.conf index 60147097..397f14a7 100644 --- a/kamon-spm/src/main/resources/reference.conf +++ b/kamon-spm/src/main/resources/reference.conf @@ -17,9 +17,9 @@ kamon { modules { kamon-spm { - auto-start = yes requires-aspectj = no - extension-id = "kamon.spm.SPM" + auto-start = yes + extension-class = "kamon.spm.SPM" } } }
\ No newline at end of file diff --git a/kamon-spray/src/main/resources/reference.conf b/kamon-spray/src/main/resources/reference.conf index 1a900fea..1c51d419 100644 --- a/kamon-spray/src/main/resources/reference.conf +++ b/kamon-spray/src/main/resources/reference.conf @@ -39,9 +39,7 @@ kamon { modules { kamon-spray { - auto-start = yes requires-aspectj = yes - extension-id = "kamon.spray.Spray" } } }
\ No newline at end of file diff --git a/kamon-spray/src/main/scala/kamon/spray/instrumentation/ServerRequestInstrumentation.scala b/kamon-spray/src/main/scala/kamon/spray/instrumentation/ServerRequestInstrumentation.scala index d1031962..82d3ceb1 100644 --- a/kamon-spray/src/main/scala/kamon/spray/instrumentation/ServerRequestInstrumentation.scala +++ b/kamon-spray/src/main/scala/kamon/spray/instrumentation/ServerRequestInstrumentation.scala @@ -85,14 +85,11 @@ class ServerRequestInstrumentation { } def verifyTraceContextConsistency(incomingTraceContext: TraceContext, storedTraceContext: TraceContext): Unit = { - def publishWarning(text: String): Unit = - SprayExtension.log.warn(text) - if (incomingTraceContext.nonEmpty) { if (incomingTraceContext.token != storedTraceContext.token) - publishWarning(s"Different trace token found when trying to close a trace, original: [${storedTraceContext.token}] - incoming: [${incomingTraceContext.token}]") + SprayExtension.log.warn(s"Different trace token found when trying to close a trace, original: [${storedTraceContext.token}] - incoming: [${incomingTraceContext.token}]") } else - publishWarning(s"EmptyTraceContext present while closing the trace with token [${storedTraceContext.token}]") + SprayExtension.log.warn(s"EmptyTraceContext present while closing the trace with token [${storedTraceContext.token}]") } def recordHttpServerMetrics(response: HttpMessagePartWrapper, traceName: String): Unit = diff --git a/kamon-statsd/src/main/resources/reference.conf b/kamon-statsd/src/main/resources/reference.conf index b8aca724..4840fb11 100644 --- a/kamon-statsd/src/main/resources/reference.conf +++ b/kamon-statsd/src/main/resources/reference.conf @@ -67,9 +67,9 @@ kamon { modules { kamon-statsd { - auto-start = yes requires-aspectj = no - extension-id = "kamon.statsd.StatsD" + auto-start = yes + extension-class = "kamon.statsd.StatsD" } } }
\ No newline at end of file diff --git a/kamon-statsd/src/test/resources/application.conf b/kamon-statsd/src/test/resources/application.conf new file mode 100644 index 00000000..132007b4 --- /dev/null +++ b/kamon-statsd/src/test/resources/application.conf @@ -0,0 +1,15 @@ +kamon { + metric { + tick-interval = 10 seconds + default-collection-context-buffer-size = 1000 + } + + statsd { + simple-metric-key-generator { + application = kamon + hostname-override = kamon-host + include-hostname = true + metric-name-normalization-strategy = normalize + } + } +}
\ No newline at end of file diff --git a/kamon-statsd/src/test/scala/kamon/statsd/StatsDMetricSenderSpec.scala b/kamon-statsd/src/test/scala/kamon/statsd/StatsDMetricSenderSpec.scala index 51e7cf19..84d2d003 100644 --- a/kamon-statsd/src/test/scala/kamon/statsd/StatsDMetricSenderSpec.scala +++ b/kamon-statsd/src/test/scala/kamon/statsd/StatsDMetricSenderSpec.scala @@ -30,20 +30,6 @@ import java.net.InetSocketAddress import com.typesafe.config.ConfigFactory class StatsDMetricSenderSpec extends BaseKamonSpec("statsd-metric-sender-spec") { - override lazy val config = - ConfigFactory.parseString( - """ - |kamon { - | statsd.simple-metric-key-generator { - | application = kamon - | hostname-override = kamon-host - | include-hostname = true - | metric-name-normalization-strategy = normalize - | } - |} - | - """.stripMargin) - implicit val metricKeyGenerator = new SimpleMetricKeyGenerator(system.settings.config) { override def hostName: String = "localhost_local" } diff --git a/kamon-system-metrics/src/main/resources/reference.conf b/kamon-system-metrics/src/main/resources/reference.conf index 7f5c1fc7..d8b84f07 100644 --- a/kamon-system-metrics/src/main/resources/reference.conf +++ b/kamon-system-metrics/src/main/resources/reference.conf @@ -187,9 +187,9 @@ kamon { modules { kamon-system-metrics { - auto-start = yes requires-aspectj = no - extension-id = "kamon.system.SystemMetrics" + auto-start = yes + extension-class = "kamon.system.SystemMetrics" } } }
\ No newline at end of file |