@Override public EndpointRunnableFactory apply(EndpointRunnableFactory delegate) { return (request, requestContext, endpoint) -> { final String endpointName = endpoint.info().getName(); // note: will not time duration of matching and dispatching final RequestMetrics requestStats = metrics.metricsForEndpointCall(endpointName); requestStats.incoming(request.request()); final TrackedOngoingRequest trackedRequest = new MetricsTrackingOngoingRequest(requestStats, request); final Client instrumentingClient = new InstrumentingClient(requestContext.requestScopedClient(), trackedRequest); final RequestContext instrumentingContext = RequestContexts.create( requestContext.request(), instrumentingClient, requestContext.pathArgs(), requestContext.arrivalTimeNanos(), requestContext.metadata()); return delegate.create(trackedRequest, instrumentingContext, endpoint); }; } }