diff options
Diffstat (limited to 'kamon-newrelic')
7 files changed, 29 insertions, 19 deletions
diff --git a/kamon-newrelic/src/main/resources/reference.conf b/kamon-newrelic/src/main/resources/reference.conf index a1c1c4d3..485598bd 100644 --- a/kamon-newrelic/src/main/resources/reference.conf +++ b/kamon-newrelic/src/main/resources/reference.conf @@ -33,6 +33,9 @@ kamon { akka-dispatcher = [ "**" ] akka-router = [ "**" ] } + + # if true send metrics over SSL + ssl = false } modules { diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala index 3e43da36..49a4993c 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala @@ -63,7 +63,7 @@ class Agent extends Actor with SprayJsonSupport with ActorLogging with MetricsSu def disconnected(attemptsLeft: Int): Receive = { case Connect ⇒ pipe(connectToCollector) to self - case Connected(collector, runID) ⇒ configureChildren(collector, runID) + case Connected(collector, runID, scheme) ⇒ configureChildren(collector, runID, scheme) case ConnectFailed(reason) if (attemptsLeft > 0) ⇒ scheduleReconnection(reason, attemptsLeft) case ConnectFailed(reason) ⇒ giveUpConnection() } @@ -85,8 +85,8 @@ class Agent extends Actor with SprayJsonSupport with ActorLogging with MetricsSu context stop self } - def configureChildren(collector: String, runID: Long): Unit = { - log.info("Configuring New Relic reporters to use runID: [{}] and collector: [{}]", runID, collector) + def configureChildren(collector: String, runID: Long, scheme: String): Unit = { + log.info("Configuring New Relic reporters to use runID: [{}] and collector: [{}] over: [{}]", runID, collector, scheme) context.children.foreach(_ ! Configure(collector, runID)) context become connected } @@ -105,8 +105,8 @@ class Agent extends Actor with SprayJsonSupport with ActorLogging with MetricsSu def connectToCollector: Future[ConnectResult] = { (for { collector ← selectCollector - runID ← connect(collector, agentSettings) - } yield Connected(collector, runID)) recover { case error ⇒ ConnectFailed(error) } + (runID, scheme) ← connect(collector, agentSettings) + } yield Connected(collector, runID, scheme)) recover { case error ⇒ ConnectFailed(error) } } def selectCollector: Future[String] = { @@ -116,10 +116,10 @@ class Agent extends Actor with SprayJsonSupport with ActorLogging with MetricsSu } } - def connect(collectorHost: String, connect: AgentSettings): Future[Long] = { + def connect(collectorHost: String, connect: AgentSettings): Future[(Long, String)] = { val apiClient = new ApiMethodClient(collectorHost, None, agentSettings, IO(Http)(context.system)) apiClient.invokeMethod(RawMethods.Connect, connect) map { json ⇒ - json.extract[Long]('return_value / 'agent_run_id) + (json.extract[Long]('return_value / 'agent_run_id), apiClient.scheme) } } } @@ -132,12 +132,12 @@ object Agent { case class Configure(collector: String, runID: Long) sealed trait ConnectResult - case class Connected(collector: String, runID: Long) extends ConnectResult + case class Connected(collector: String, runID: Long, scheme: String) extends ConnectResult case class ConnectFailed(reason: Throwable) extends ConnectResult } case class AgentSettings(licenseKey: String, appName: String, hostname: String, pid: Int, operationTimeout: Timeout, - maxConnectionRetries: Int, retryDelay: FiniteDuration, apdexT: Double) + maxConnectionRetries: Int, retryDelay: FiniteDuration, apdexT: Double, ssl: Boolean) object AgentSettings { @@ -147,6 +147,7 @@ object AgentSettings { val newRelicConfig = config.getConfig("kamon.newrelic") val licenseKey = newRelicConfig.getString("license-key") assert(licenseKey != "<put-your-key-here>", "You forgot to include your New Relic license key in the configuration settings!") + val ssl = newRelicConfig.getBoolean("ssl") AgentSettings( licenseKey, @@ -156,7 +157,8 @@ object AgentSettings { Timeout(newRelicConfig.getFiniteDuration("operation-timeout")), newRelicConfig.getInt("max-connect-retries"), newRelicConfig.getFiniteDuration("connect-retry-delay"), - newRelicConfig.getFiniteDuration("apdexT").toMillis / 1E3D) + newRelicConfig.getFiniteDuration("apdexT").toMillis / 1E3D, + ssl) } } diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/ApiMethodClient.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/ApiMethodClient.scala index 263faa63..0550f433 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/ApiMethodClient.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/ApiMethodClient.scala @@ -31,7 +31,8 @@ class ApiMethodClient(host: String, val runID: Option[Long], agentSettings: Agen } val httpClient = encode(Deflate) ~> sendReceive(httpTransport) ~> decode(Deflate) ~> unmarshal[JsValue] - val baseCollectorUri = Uri("/agent_listener/invoke_raw_method").withHost(host).withScheme("http") + val scheme = if (agentSettings.ssl) "https" else "http" + val baseCollectorUri = Uri("/agent_listener/invoke_raw_method").withHost(host).withScheme(scheme) def invokeMethod[T: Marshaller](method: String, payload: T): Future[JsValue] = { val methodQuery = ("method" -> method) +: baseQuery diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/JsonProtocol.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/JsonProtocol.scala index 7f0d1383..8db24e46 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/JsonProtocol.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/JsonProtocol.scala @@ -30,6 +30,7 @@ object JsonProtocol extends DefaultJsonProtocol { "host" -> JsString(obj.hostname), "identifier" -> JsString(s"java:${appNames(0)}"), "language" -> JsString("java"), + "ssl" -> JsString(obj.ssl.toString), "pid" -> JsNumber(obj.pid))) } } diff --git a/kamon-newrelic/src/test/scala/kamon/newrelic/AgentSpec.scala b/kamon-newrelic/src/test/scala/kamon/newrelic/AgentSpec.scala index e4289231..063755a8 100644 --- a/kamon-newrelic/src/test/scala/kamon/newrelic/AgentSpec.scala +++ b/kamon-newrelic/src/test/scala/kamon/newrelic/AgentSpec.scala @@ -48,6 +48,7 @@ class AgentSpec extends BaseKamonSpec("metric-reporter-spec") with RequestBuildi | license-key = 1111111111 | connect-retry-delay = 1 second | max-connect-retries = 3 + | ssl = true | } | | modules.kamon-newrelic.auto-start = no @@ -85,14 +86,15 @@ class AgentSpec extends BaseKamonSpec("metric-reporter-spec") with RequestBuildi | "host": "$host", | "identifier": "java:kamon", | "language": "java", - | "pid": $pid + | "pid": $pid, + | "ssl": "true" | } | ] """.stripMargin.parseJson)(sprayJsonMarshaller(JsValueFormat)) }) // Receive the runID - EventFilter.info(message = "Configuring New Relic reporters to use runID: [161221111] and collector: [collector-8.newrelic.com]", occurrences = 1).intercept { + EventFilter.info(message = "Configuring New Relic reporters to use runID: [161221111] and collector: [collector-8.newrelic.com] over: [https]", occurrences = 1).intercept { httpManager.reply(jsonResponse( """ | { @@ -143,7 +145,8 @@ class AgentSpec extends BaseKamonSpec("metric-reporter-spec") with RequestBuildi | "host": "$host", | "identifier": "java:kamon", | "language": "java", - | "pid": $pid + | "pid": $pid, + | "ssl": "true" | } | ] """.stripMargin.parseJson)(sprayJsonMarshaller(JsValueFormat)) @@ -151,7 +154,7 @@ class AgentSpec extends BaseKamonSpec("metric-reporter-spec") with RequestBuildi // Receive the runID EventFilter.info( - message = "Configuring New Relic reporters to use runID: [161221112] and collector: [collector-8.newrelic.com]", occurrences = 1).intercept { + message = "Configuring New Relic reporters to use runID: [161221112] and collector: [collector-8.newrelic.com] over: [https]", occurrences = 1).intercept { httpManager.reply(jsonResponse( """ @@ -202,7 +205,7 @@ class AgentSpec extends BaseKamonSpec("metric-reporter-spec") with RequestBuildi } def rawMethodUri(host: String, methodName: String): Uri = { - Uri(s"http://$host/agent_listener/invoke_raw_method").withQuery( + Uri(s"https://$host/agent_listener/invoke_raw_method").withQuery( "method" -> methodName, "license_key" -> "1111111111", "marshal_format" -> "json", diff --git a/kamon-newrelic/src/test/scala/kamon/newrelic/ConnectJsonWriterSpec.scala b/kamon-newrelic/src/test/scala/kamon/newrelic/ConnectJsonWriterSpec.scala index 1e903e59..cba2bb18 100644 --- a/kamon-newrelic/src/test/scala/kamon/newrelic/ConnectJsonWriterSpec.scala +++ b/kamon-newrelic/src/test/scala/kamon/newrelic/ConnectJsonWriterSpec.scala @@ -34,7 +34,7 @@ class ConnectJsonWriterSpec extends WordSpecLike with Matchers { } } - def agentSettings(appName: String) = AgentSettings("1111111111", appName, "test-host", 1, Timeout(5 seconds), 1, 30 seconds, 1D) + def agentSettings(appName: String) = AgentSettings("1111111111", appName, "test-host", 1, Timeout(5 seconds), 1, 30 seconds, 1D, false) - def expectedJson(appName: String) = s"""[{"identifier":"java:app1","agent_version":"3.1.0","host":"test-host","pid":1,"language":"java","app_name":[$appName]}]""" + def expectedJson(appName: String) = s"""[{"identifier":"java:app1","agent_version":"3.1.0","host":"test-host","ssl":"false","pid":1,"language":"java","app_name":[$appName]}]""" }
\ No newline at end of file diff --git a/kamon-newrelic/src/test/scala/kamon/newrelic/MetricReporterSpec.scala b/kamon-newrelic/src/test/scala/kamon/newrelic/MetricReporterSpec.scala index d4e815e5..ddc6ed69 100644 --- a/kamon-newrelic/src/test/scala/kamon/newrelic/MetricReporterSpec.scala +++ b/kamon-newrelic/src/test/scala/kamon/newrelic/MetricReporterSpec.scala @@ -55,7 +55,7 @@ class MetricReporterSpec extends BaseKamonSpec("metric-reporter-spec") with Spra | """.stripMargin) - val agentSettings = AgentSettings("1111111111", "kamon", "test-host", 1, Timeout(5 seconds), 1, 30 seconds, 1D) + val agentSettings = AgentSettings("1111111111", "kamon", "test-host", 1, Timeout(5 seconds), 1, 30 seconds, 1D, false) val baseQuery = Query( "license_key" -> agentSettings.licenseKey, "marshal_format" -> "json", |