From 5e2e5f0cf7fc089e3fec8a386d004a12d456bf8d Mon Sep 17 00:00:00 2001 From: Peter Laszlo Date: Fri, 19 Jan 2018 14:10:43 +0100 Subject: [PATCH 1/3] Adding an config option to include http status code as metric tag --- kamon-akka-http/src/main/resources/reference.conf | 3 +++ .../src/main/scala/kamon/akka/http/AkkaHttp.scala | 9 +++++++++ .../ClientRequestInstrumentation.scala | 11 ++++++++--- .../akka/http/instrumentation/ServerFlowWrapper.scala | 4 ++-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/kamon-akka-http/src/main/resources/reference.conf b/kamon-akka-http/src/main/resources/reference.conf index 1c030e2..103905b 100644 --- a/kamon-akka-http/src/main/resources/reference.conf +++ b/kamon-akka-http/src/main/resources/reference.conf @@ -14,6 +14,9 @@ kamon.akka-http { # cardinality explosion caused by variable sections in the Path. name-generator = default + # Add http status codes as metric tags. The default value is false + http-status-code-as-metric-tag = false + modules { kamon-akka-http { requires-aspectj = yes diff --git a/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala b/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala index 638f222..b162d60 100644 --- a/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala +++ b/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala @@ -61,6 +61,15 @@ object AkkaHttp { } } + val addHttpStatusCodeAsMetricTag: Boolean = { + val statusAsMetricTagConfigName = "kamon.akka-http.http-status-code-as-metric-tag" + if (Kamon.config.hasPath(statusAsMetricTagConfigName)) { + Kamon.config.getBoolean(statusAsMetricTagConfigName) + } else { + false + } + } + Kamon.onReconfigure(new OnReconfigureHook { override def onReconfigure(newConfig: Config): Unit = { nameGenerator = nameGeneratorFromConfig(newConfig) diff --git a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala index 763459e..60e5725 100644 --- a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala +++ b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala @@ -55,9 +55,14 @@ class ClientRequestInstrumentation { if(status.isFailure()) span.addError(status.reason()) - span - .tag("http.status_code", response.status.intValue()) - .finish() + val spanWithStatusTag = span.tag("http.status_code", status.intValue()) + val spanWithStatusMetricTag = if (AkkaHttp.addHttpStatusCodeAsMetricTag) { + spanWithStatusTag.tagMetric("http.status_code", status.intValue.toString()) + } else { + spanWithStatusTag + } + + spanWithStatusMetricTag.finish() } case Failure(t) ⇒ { span.addError(t.getMessage, t).finish() diff --git a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala index e8f284e..c908346 100644 --- a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala +++ b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala @@ -82,8 +82,8 @@ object ServerFlowWrapper { val response = grab(responseIn) val status = response.status.intValue() - val span = Kamon.currentSpan() - .tag("http.status_code", status) + val spanWithStatusTag = Kamon.currentSpan().tag("http.status_code", status) + val span = if (addHttpStatusCodeAsMetricTag) spanWithStatusTag.tagMetric("http.status_code", status.toString()) else spanWithStatusTag if(status >= 400 && status <= 499) { span.setOperationName("not-found") From cccfcd9cd72827f8e94dc14dc5ce9866dfb713f8 Mon Sep 17 00:00:00 2001 From: Peter Laszlo Date: Thu, 1 Feb 2018 08:16:27 +0100 Subject: [PATCH 2/3] Update based on PR review --- kamon-akka-http/src/main/resources/reference.conf | 2 +- .../src/main/scala/kamon/akka/http/AkkaHttp.scala | 10 ++-------- .../instrumentation/ClientRequestInstrumentation.scala | 9 ++++----- .../akka/http/instrumentation/ServerFlowWrapper.scala | 7 +++++-- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/kamon-akka-http/src/main/resources/reference.conf b/kamon-akka-http/src/main/resources/reference.conf index 103905b..cc97360 100644 --- a/kamon-akka-http/src/main/resources/reference.conf +++ b/kamon-akka-http/src/main/resources/reference.conf @@ -15,7 +15,7 @@ kamon.akka-http { name-generator = default # Add http status codes as metric tags. The default value is false - http-status-code-as-metric-tag = false + add-http-status-code-as-metric-tag = false modules { kamon-akka-http { diff --git a/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala b/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala index b162d60..bcbd13c 100644 --- a/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala +++ b/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala @@ -61,14 +61,8 @@ object AkkaHttp { } } - val addHttpStatusCodeAsMetricTag: Boolean = { - val statusAsMetricTagConfigName = "kamon.akka-http.http-status-code-as-metric-tag" - if (Kamon.config.hasPath(statusAsMetricTagConfigName)) { - Kamon.config.getBoolean(statusAsMetricTagConfigName) - } else { - false - } - } + val addHttpStatusCodeAsMetricTag: Boolean = + Kamon.config.getBoolean("kamon.akka-http.add-http-status-code-as-metric-tag") Kamon.onReconfigure(new OnReconfigureHook { override def onReconfigure(newConfig: Config): Unit = { diff --git a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala index 60e5725..6161ffd 100644 --- a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala +++ b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ClientRequestInstrumentation.scala @@ -55,14 +55,13 @@ class ClientRequestInstrumentation { if(status.isFailure()) span.addError(status.reason()) - val spanWithStatusTag = span.tag("http.status_code", status.intValue()) - val spanWithStatusMetricTag = if (AkkaHttp.addHttpStatusCodeAsMetricTag) { - spanWithStatusTag.tagMetric("http.status_code", status.intValue.toString()) + val spanWithStatusTag = if (AkkaHttp.addHttpStatusCodeAsMetricTag) { + span.tagMetric("http.status_code", status.intValue.toString()) } else { - spanWithStatusTag + span.tag("http.status_code", status.intValue()) } - spanWithStatusMetricTag.finish() + spanWithStatusTag.finish() } case Failure(t) ⇒ { span.addError(t.getMessage, t).finish() diff --git a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala index c908346..932f879 100644 --- a/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala +++ b/kamon-akka-http/src/main/scala/kamon/akka/http/instrumentation/ServerFlowWrapper.scala @@ -82,8 +82,11 @@ object ServerFlowWrapper { val response = grab(responseIn) val status = response.status.intValue() - val spanWithStatusTag = Kamon.currentSpan().tag("http.status_code", status) - val span = if (addHttpStatusCodeAsMetricTag) spanWithStatusTag.tagMetric("http.status_code", status.toString()) else spanWithStatusTag + val span = if (addHttpStatusCodeAsMetricTag) { + Kamon.currentSpan().tagMetric("http.status_code", status.toString()) + } else { + Kamon.currentSpan().tag("http.status_code", status) + } if(status >= 400 && status <= 499) { span.setOperationName("not-found") From 546ef14cd6fe236c97a010aa6559871755714358 Mon Sep 17 00:00:00 2001 From: Peter Laszlo Date: Fri, 9 Feb 2018 08:19:52 +0100 Subject: [PATCH 3/3] Make addHttpStatusCodeAsMetricTag reconfigurable --- .../src/main/scala/kamon/akka/http/AkkaHttp.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala b/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala index bcbd13c..d36d284 100644 --- a/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala +++ b/kamon-akka-http/src/main/scala/kamon/akka/http/AkkaHttp.scala @@ -61,12 +61,15 @@ object AkkaHttp { } } - val addHttpStatusCodeAsMetricTag: Boolean = + @volatile var addHttpStatusCodeAsMetricTag: Boolean = addHttpStatusCodeAsMetricTagFromConfig(Kamon.config()) + + private def addHttpStatusCodeAsMetricTagFromConfig(config: Config): Boolean = Kamon.config.getBoolean("kamon.akka-http.add-http-status-code-as-metric-tag") Kamon.onReconfigure(new OnReconfigureHook { override def onReconfigure(newConfig: Config): Unit = { nameGenerator = nameGeneratorFromConfig(newConfig) + addHttpStatusCodeAsMetricTag = addHttpStatusCodeAsMetricTagFromConfig(newConfig) } }) }