docs: @Singleton
      HttpClientHandler<HttpRequest<?>, HttpResponse<?>> httpClientHandler(HttpTracing httpTracing) {
          return HttpClientHandler.create(httpTracing, new HttpClientAdapter<HttpRequest<?>, HttpResponse<?>>() {
              @Override
              public String method(HttpRequest<?> request) {
                  return request.getMethod().name();
              }
  
              @Override
              public String url(HttpRequest<?> request) {
                  return request.getUri().toString();
              }
  
              @Override
              public String requestHeader(HttpRequest<?> request, String name) {
                  return request.getHeaders().get(name);
              }
  
              @Override
              public Integer statusCode(HttpResponse<?> response) {
                  return response.getStatus().getCode();
              }
  
              @Override
              public boolean parseServerIpAndPort(HttpRequest<?> request, Endpoint.Builder builder) {
                  InetAddress address = request.getServerAddress().getAddress();
                  return builder.parseIp(address);
              }
  
              @Override
              public String methodFromResponse(HttpResponse<?> httpResponse) {
                  return httpResponse.getAttribute(HttpAttributes.METHOD_NAME, String.class)
                                     .orElseGet(() -> super.methodFromResponse(httpResponse));
              }
  
              @Override
              public String route(HttpResponse<?> response) {
                  Optional<String> value = response.getAttribute(HttpAttributes.URI_TEMPLATE, String.class);
                  return value.orElseGet(() -> super.route(response));
              }
          });
      }