Невозможно создать метрики воспроизведения по таймеру на основе API
Я создаю метрики Play на основе API, поэтому для этого у меня есть фильтр, который будет определять URL из заголовка запроса и создавать метрики на основе URL. Но для создания метрик таймера мы должны запускать и останавливать контекст в начале и конце метода соответственно.
Так что в моем пользовательском фильтре он запускает контекст, но мне нужно выяснить, как его остановить, так как вызов API не возвращает ответ через фильтр. Только фильтр проходит через фильтр, но ответ проходит через контроллер.
Нужна помощь, чтобы понять, как я могу достичь метрики на основе API через игровые фильтры. Любые лиды будут хвалиться.
Что достигнуто к настоящему времени:
val getWallets = metrics.defaultRegistry.meter("GetWallets") // val lockWallet = metrics.defaultRegistry.meter("LockWallet")
override def apply(nextFilter: (RequestHeader) => Future[Result])(requestHeader: RequestHeader): Future[Result] = {
requestHeader.uri match {
case IConstant.GET_WALLETS => {
getWallets.mark()
nextFilter(requestHeader)
}
case _ => {
nextFilter(requestHeader)
}
}
}
1 ответ
Учитывая подпись Filter.apply
:
override def apply(nextFilter: (RequestHeader) => Future[Result])(requestHeader: RequestHeader): Future[Result]
этот метод вернет Future[Result]
,
Чтобы ты мог map
над Future
после завершения, чтобы остановить метрику, как показано ниже:
override def apply(nextFilter: (RequestHeader) => Future[Result])(requestHeader: RequestHeader): Future[Result] = {
requestHeader.uri match {
case IConstant.GET_WALLETS => {
getWallets.mark()
nextFilter(requestHeader).map { result =>
// Stop the metric here
result
}
}
case _ => {
nextFilter(requestHeader)
}
}
}