Kamon MDC не работает
Я пытаюсь распространять MDC с помощью Kamon, как показано в этой документации, но, похоже, это не работает
Play framework - 2.5
kamon-core - 0.6.2
kamon-play-25 - 0.6.2
Мой шаблон входа в систему:
<pattern>%d{HH:mm:ss.SSS} [%thread] [%level] [%traceToken]- %logger{36}\(%L\) %X{X-ApplicationId} - %message%n%xException</pattern>
Я создал фильтр:
class AccessLoggingFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter with LazyLogging { val ApplicationIdKey = AvailableToMdc("X-ApplicationId") def apply(next: (RequestHeader) => Future[Result])(request: RequestHeader): Future[Result] = { TraceLocal.storeForMdc("X-ApplicationId", request.id.toString) logger.error("first Location") withMdc { logger.error("Second location") next(request) }}}
И добавил это так:
class MyFilters @Inject() (accessLoggingFilter: AccessLoggingFilter) extends DefaultHttpFilters(accessLoggingFilter)
Теперь, когда я делаю HTTP-вызов на сервер, я получаю следующий вывод:
c.v.i.utils.AccessLoggingFilter(24) - first Location c.v.i.utils.AccessLoggingFilter(26) 1 - Second location
И все распечатки журнала впоследствии не показывают '1' X-ApplicationId
Не могу понять, что я делаю не так.
1 ответ
Вот полный (почти) пример:
build.sbt:
name := "kamon-play-example"
version := "1.0"
scalaVersion := "2.11.7"
val kamonVersion = "0.6.2"
val resolutionRepos = Seq("Kamon Repository Snapshots" at "http://snapshots.kamon.io")
val dependencies = Seq(
"io.kamon" %% "kamon-play-25" % kamonVersion,
"io.kamon" %% "kamon-log-reporter" % kamonVersion
)
lazy val root = (project in file(".")).enablePlugins(PlayScala)
.settings(resolvers ++= resolutionRepos)
.settings(libraryDependencies ++= dependencies)
основной фильтр:
class TraceLocalFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
val logger = Logger(this.getClass)
val TraceLocalStorageKey = "MyTraceLocalStorageKey"
val userAgentHeader = "User-Agent"
//this value will be available in the MDC at the moment to call to Logger.*()s
val UserAgentHeaderAvailableToMDC = AvailableToMdc(userAgentHeader)
override def apply(next: (RequestHeader) ⇒ Future[Result])(header: RequestHeader): Future[Result] = {
def onResult(result:Result) = {
val traceLocalContainer = TraceLocal.retrieve(TraceLocalKey).getOrElse(TraceLocalContainer("unknown","unknown"))
result.withHeaders(TraceLocalStorageKey -> traceLocalContainer.traceToken)
}
//update the TraceLocalStorage
TraceLocal.store(TraceLocalKey)(TraceLocalContainer(header.headers.get(TraceLocalStorageKey).getOrElse("unknown"), "unknown"))
TraceLocal.store(UserAgentHeaderAvailableToMDC)(header.headers.get(userAgentHeader).getOrElse("unknown"))
//call the action
next(header).map(onResult)
}
}
нам нужно добавить фильтр:
class Filters @Inject() (traceLocalFilter: TraceLocalFilter) extends HttpFilters {
val filters = Seq(traceLocalFilter)
}
действительно простой контроллер и действие:
class KamonPlayExample @Inject() (kamon: Kamon) extends Controller {
def sayHello = Action.async {
Future {
logger.info("Say hello to Kamon")
Ok("Say hello to Kamon")
}
}
}
в logback.xml добавьте следующий шаблон:
<pattern>%date{HH:mm:ss.SSS} %-5level [%traceToken][%X{User-Agent}] [%thread] %logger{55} - %msg%n</pattern>
добавить sbt-aspectj-runner
плагин для запуска приложения с Aspectjweaver
в режиме DEV:
addSbtPlugin("io.kamon" % "aspectj-play-runner" % "0.1.3")
запустить приложение с aspectj-runner:run
и сделать некоторые curls
:
curl -i -H 'X-Trace-Token:kamon-test' -H 'User-Agent:Super-User-Agent' -X GET "http://localhost:9000/helloKamon"
curl -i -H 'X-Trace-Token:kamon-test'-X GET "http://localhost:9000/helloKamon"
в консоли:
15:09:16.027 INFO [kamon-test][Super-User-Agent] [application-akka.actor.default-dispatcher-8] controllers.KamonPlayExample - Say hello to Kamon
15:09:24.034 INFO [kamon-test][curl/7.47.1] [application-akka.actor.default-dispatcher-8] controllers.KamonPlayExample - Say hello to Kamon
надеюсь, ты поможешь.