diff --git a/kamon-akka-http/src/main/resources/reference.conf b/kamon-akka-http/src/main/resources/reference.conf index 1c030e2..cc97360 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 + add-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..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,9 +61,15 @@ object AkkaHttp { } } + @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) } }) } 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..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,9 +55,13 @@ class ClientRequestInstrumentation { if(status.isFailure()) span.addError(status.reason()) - span - .tag("http.status_code", response.status.intValue()) - .finish() + val spanWithStatusTag = if (AkkaHttp.addHttpStatusCodeAsMetricTag) { + span.tagMetric("http.status_code", status.intValue.toString()) + } else { + span.tag("http.status_code", status.intValue()) + } + + 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 cf07ef3..d250dc3 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 span = Kamon.currentSpan() - .tag("http.status_code", status) + val span = if (addHttpStatusCodeAsMetricTag) { + Kamon.currentSpan().tagMetric("http.status_code", status.toString()) + } else { + Kamon.currentSpan().tag("http.status_code", status) + } if(status == 404) span.setOperationName("unhandled")