code: private IAsyncResultHandler<IEngineResult> wrapResultHandler(final IAsyncResultHandler<IEngineResult> handler) {
          return (IAsyncResult<IEngineResult> result) -> {
              boolean doRecord = true;
              if (result.isError()) {
                  recordErrorMetrics(result.getError());
              } else {
                  IEngineResult engineResult = result.getResult();
                  if (engineResult.isFailure()) {
                      recordFailureMetrics(engineResult.getPolicyFailure());
                  } else {
                      recordSuccessMetrics(engineResult.getApiResponse());
                      doRecord = false; // don't record the metric now because we need to record # of bytes downloaded, which hasn't happened yet
                  }
              }
              requestMetric.setRequestEnd(new Date());
              if (doRecord) {
                  metrics.record(requestMetric);
              }
              handler.handle(result);
          };
      }
docs: Wraps the result handler so that metrics can be properly recorded.