hdarritchon
04/18/2019, 1:16 PMDennis Schröder
04/18/2019, 1:21 PMhdarritchon
04/20/2019, 7:09 AMfun Route.routeWithMeasureTime(callback: Route.() -> Unit): Route {
// With createChild, we create a child node for this received Route
val routeWithTimeout = this.createChild(object : RouteSelector(1.0) {
override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation =
RouteSelectorEvaluation.Constant
})
// Intercepts calls from this route at the features step
routeWithTimeout.intercept(ApplicationCallPipeline.Features) {
val timeAndReturn = coroutineMeasureTimeAndReturn {
proceed()
}
timeAndReturn.first.record(this.context.request.local)
}
// Configure this route with the block provided by the user
callback(routeWithTimeout)
return routeWithTimeout
}
suspend fun <T> coroutineMeasureTimeAndReturn(block: suspend CoroutineScope.() -> T): Pair<RequestProcessEvent, T> {
val start = System.currentTimeMillis()
val result = coroutineScope { block() }
val stop = System.currentTimeMillis()
return Pair(RequestProcessEvent(start, stop), result)
}
Dennis Schröder
04/21/2019, 9:30 AM