aboutsummaryrefslogtreecommitdiff
path: root/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala')
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala67
1 files changed, 62 insertions, 5 deletions
diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala
index 75f73ea4..3e43da36 100644
--- a/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala
+++ b/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala
@@ -16,10 +16,13 @@
package kamon.newrelic
-import akka.actor.{ ActorLogging, Actor }
+import akka.actor.{ ActorRef, ActorLogging, Actor }
+import akka.event.LoggingAdapter
import akka.io.IO
import akka.util.Timeout
import com.typesafe.config.Config
+import kamon.Kamon
+import kamon.metric.{ SegmentMetrics, TraceMetrics, MetricsModule, TickMetricSnapshotBuffer }
import spray.can.Http
import spray.json._
import scala.concurrent.Future
@@ -30,16 +33,28 @@ import kamon.util.ConfigTools.Syntax
import Agent._
import JsonProtocol._
import akka.pattern.pipe
-
+import scala.concurrent.duration._
import scala.concurrent.duration.FiniteDuration
-class Agent extends Actor with SprayJsonSupport with ActorLogging {
+class Agent extends Actor with SprayJsonSupport with ActorLogging with MetricsSubscription {
import context.dispatcher
- val agentSettings = AgentSettings.fromConfig(context.system.settings.config)
+ private val config = context.system.settings.config
+
+ val agentSettings = AgentSettings.fromConfig(config)
// Start the reporters
- context.actorOf(MetricReporter.props(agentSettings), "metric-reporter")
+ private val reporter = context.actorOf(MetricReporter.props(agentSettings), "metric-reporter")
+
+ val metricsSubscriber = {
+ val tickInterval = Kamon.metrics.settings.tickInterval
+
+ // Metrics are always sent to New Relic in 60 seconds intervals.
+ if (tickInterval == 60.seconds) reporter
+ else context.actorOf(TickMetricSnapshotBuffer.props(1 minute, reporter), "metric-buffer")
+ }
+
+ subscribeToMetrics(config, metricsSubscriber, Kamon.metrics)
// Start the connection to the New Relic collector.
self ! Connect
@@ -143,4 +158,46 @@ object AgentSettings {
newRelicConfig.getFiniteDuration("connect-retry-delay"),
newRelicConfig.getFiniteDuration("apdexT").toMillis / 1E3D)
}
+}
+
+trait MetricsSubscription {
+ import kamon.util.ConfigTools.Syntax
+ import scala.collection.JavaConverters._
+ import MetricsSubscription._
+
+ def log: LoggingAdapter
+
+ def subscriptions(config: Config) = config getConfig "kamon.newrelic" getConfig "custom-metric-subscriptions"
+
+ def subscriptionKeys(config: Config) = subscriptions(config).firstLevelKeys filterNot isTraceOrSegmentEntityName
+
+ def subscribeToMetrics(config: Config, metricsSubscriber: ActorRef, extension: MetricsModule): Unit = {
+ subscribeToCustomMetrics(config, metricsSubscriber, extension)
+ subscribeToTransactionMetrics(metricsSubscriber, extension)
+ }
+
+ def subscribeToCustomMetrics(config: Config, metricsSubscriber: ActorRef, extension: MetricsModule): Unit =
+ subscriptionKeys(config) foreach { subscriptionCategory ⇒
+ subscriptions(config).getStringList(subscriptionCategory).asScala foreach { pattern ⇒
+ log.debug("Subscribing NewRelic reporting for custom metric '{}' : {}", subscriptionCategory, pattern)
+ extension.subscribe(subscriptionCategory, pattern, metricsSubscriber)
+ }
+ }
+
+ def subscribeToTransactionMetrics(metricsSubscriber: ActorRef, extension: MetricsModule): Unit =
+ traceAndSegmentMetrics foreach { subscriptionCategory ⇒
+ log.debug("Subscribing NewRelic reporting for transaction metric '{}' : {}", subscriptionCategory, defaultPattern)
+ extension.subscribe(subscriptionCategory, defaultPattern, metricsSubscriber)
+ }
+
+}
+
+object MetricsSubscription {
+
+ private val defaultPattern = "**"
+
+ private val traceAndSegmentMetrics = Seq(TraceMetrics.category, SegmentMetrics.category)
+
+ def isTraceOrSegmentEntityName(name: String): Boolean = traceAndSegmentMetrics contains name
+
} \ No newline at end of file