diff options
author | Diego <diegolparra@gmail.com> | 2014-07-06 19:00:03 -0300 |
---|---|---|
committer | Diego <diegolparra@gmail.com> | 2014-07-06 19:00:03 -0300 |
commit | a80de719ca8b7ef2d6d3c4a10ed1e212a5a1ea83 (patch) | |
tree | cd925fa7a6c15b0ff1897094fad87dba1cb1decf /kamon-play/src/main/scala/kamon | |
parent | f5009fda25a7e2fd68743b00cda2814a562b94f5 (diff) | |
download | Kamon-a80de719ca8b7ef2d6d3c4a10ed1e212a5a1ea83.tar.gz Kamon-a80de719ca8b7ef2d6d3c4a10ed1e212a5a1ea83.tar.bz2 Kamon-a80de719ca8b7ef2d6d3c4a10ed1e212a5a1ea83.zip |
+ play: introducing LoggerLikeInstrumentation in order to copy the properties of TraceLocalStorage to MDC
Diffstat (limited to 'kamon-play/src/main/scala/kamon')
-rw-r--r-- | kamon-play/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala | 70 | ||||
-rw-r--r-- | kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala | 23 |
2 files changed, 81 insertions, 12 deletions
diff --git a/kamon-play/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala b/kamon-play/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala new file mode 100644 index 00000000..b7afeb76 --- /dev/null +++ b/kamon-play/src/main/scala/kamon/play/instrumentation/LoggerLikeInstrumentation.scala @@ -0,0 +1,70 @@ +/* ========================================================================================= + * Copyright © 2013-2014 the kamon project <http://kamon.io/> + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + * ========================================================================================= + */ + +package kamon.play.instrumentation + +import kamon.trace.{ TraceContext, TraceContextAware } +import org.aspectj.lang.ProceedingJoinPoint +import org.aspectj.lang.annotation._ +import org.slf4j.MDC + +@Aspect +class LoggerLikeInstrumentation { + + import LoggerLikeInstrumentation._ + + @DeclareMixin("play.api.LoggerLike+") + def mixinContextAwareToLoggerLike: TraceContextAware = TraceContextAware.default + + @Pointcut("execution(* play.api.LoggerLike+.info(..))") + def infoPointcut(): Unit = {} + + @Pointcut("execution(* play.api.LoggerLike+.warn(..))") + def warnPointcut(): Unit = {} + + @Pointcut("execution(* play.api.LoggerLike+.error(..))") + def errorPointcut(): Unit = {} + + @Pointcut("execution(* play.api.LoggerLike+.trace(..))") + def tracePointcut(): Unit = {} + + @Around("(infoPointcut() || warnPointcut() || errorPointcut() || tracePointcut()) && this(logger)") + def aroundLog(pjp: ProceedingJoinPoint, logger: TraceContextAware): Any = { + withMDC(logger.traceContext) { + pjp.proceed() + } + } +} + +object LoggerLikeInstrumentation { + def withMDC[A](currentContext: Option[TraceContext])(block: ⇒ A): A = { + val keys = currentContext.map(extractProperties).map(putAndExtractKeys) + + try block finally keys.map(k ⇒ k.foreach(MDC.remove(_))) + } + + def putAndExtractKeys(values: Iterable[Map[String, Any]]): Iterable[String] = values.map { + value ⇒ value.map { case (key, value) ⇒ MDC.put(key, value.toString); key } + }.flatten + + def extractProperties(ctx: TraceContext): Iterable[Map[String, Any]] = ctx.traceLocalStorage.underlyingStorage.values.map { + case traceLocalValue @ (p: Product) ⇒ { + val properties = p.productIterator + traceLocalValue.getClass.getDeclaredFields.filter(field ⇒ field.getName != "$outer").map(_.getName -> properties.next).toMap + } + case anything ⇒ Map.empty[String, Any] + } +} + diff --git a/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala b/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala index 00170b1b..db864fb6 100644 --- a/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala +++ b/kamon-play/src/main/scala/kamon/play/instrumentation/RequestInstrumentation.scala @@ -1,18 +1,17 @@ -/* =================================================== +/* ========================================================================================= * Copyright © 2013-2014 the kamon project <http://kamon.io/> * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + * ========================================================================================= + */ package kamon.play.instrumentation @@ -49,7 +48,7 @@ class RequestInstrumentation { } @Around("execution(* play.api.GlobalSettings+.doFilter(*)) && args(next)") - def afterDoFilter(pjp: ProceedingJoinPoint, next: EssentialAction): Any = { + def aroundDoFilter(pjp: ProceedingJoinPoint, next: EssentialAction): Any = { val essentialAction = (requestHeader: RequestHeader) ⇒ { val incomingContext = TraceRecorder.currentContext |