@Override
  public Object decode(Response response, Type type) throws IOException, FeignException {
    final Optional<MeteredBody> body = Optional.ofNullable(response.body()).map(MeteredBody::new);

    Response meteredResponse = body.map(b -> response.toBuilder().body(b).build()).orElse(response);

    Object decoded;

    final Timer.Sample sample = Timer.start(meterRegistry);
    Timer timer = null;
    try {
      decoded = decoder.decode(meteredResponse, type);
      timer = createTimer(response, type, null);
    } catch (IOException | RuntimeException e) {
      timer = createTimer(response, type, e);
      createExceptionCounter(response, type, e).count();
      throw e;
    } catch (Exception e) {
      timer = createTimer(response, type, e);
      createExceptionCounter(response, type, e).count();
      throw new IOException(e);
    } finally {
      if (timer == null) {
        timer = createTimer(response, type, null);
      }
      sample.stop(timer);
    }

    body.ifPresent(b -> createSummary(response, type).record(b.count()));

    return decoded;
  }
Wrap feign {@link Decoder} with metrics.
micrometer/src/main/java/feign/micrometer/MeteredDecoder.java