aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Smith <Colin.Smith@monitise.com>2015-10-09 14:31:20 +0100
committerColin Smith <Colin.Smith@monitise.com>2015-10-09 14:31:20 +0100
commita4924ee0607f17bfe5ba61742e035af19c381785 (patch)
tree91f297a67952f91ffc492bb73ad660787862a174
parent91859be4df789c64ae30ef879b9c6c83503b99c2 (diff)
downloadKamon-a4924ee0607f17bfe5ba61742e035af19c381785.tar.gz
Kamon-a4924ee0607f17bfe5ba61742e035af19c381785.tar.bz2
Kamon-a4924ee0607f17bfe5ba61742e035af19c381785.zip
+ newrelic: add ssl support to agent
Use kamon.newrelic.ssl = true to send metrics over https
-rw-r--r--kamon-newrelic/src/main/resources/reference.conf3
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/Agent.scala22
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/ApiMethodClient.scala3
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/JsonProtocol.scala1
-rw-r--r--kamon-newrelic/src/test/scala/kamon/newrelic/AgentSpec.scala13
-rw-r--r--kamon-newrelic/src/test/scala/kamon/newrelic/ConnectJsonWriterSpec.scala4
-rw-r--r--kamon-newrelic/src/test/scala/kamon/newrelic/MetricReporterSpec.scala2
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",