8

I have Feign client setup with Hystrix and I am trying to log all the HTTP status codes that I get from my API calls into a database. So this means, if one of my calls give me a 201, I would want to log that into DB. If my call results in a failure, my fallback handler can obviously log that but I want to do the DB inserts in one place. Does feign have a way to get access to responses or some kind of general callback?

oneCoderToRuleThemAll
  • 834
  • 2
  • 12
  • 33

2 Answers2

1

You have to provide custom decoder to get your response in ResponseEntity<Object>.

NotificationClient notificationClient = Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(customDecoder())
                .target(Target.EmptyTarget.create(NotificationClient.class));

Here you define your custom decoder bean. You can define your own by implementing Decoder but I'm using spring decoder.

@Bean
public Decoder customDecoder() {
    HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customObjectMapper());
    ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(jacksonConverter);
    return new ResponseEntityDecoder(new SpringDecoder(objectFactory));
}

Now collect your response in ResponseEntity<Object>

ResponseEntity<Object> response = notificationClient.notify();
int status = response.getStatusCodeValue();
Muhammad Usman
  • 863
  • 1
  • 11
  • 18
0

Another option is to create your own feign.Logger implementation, overriding the logAndRebufferResponse method:

protected Response logAndRebufferResponse(
   String configKey, Level logLevel, Response response, long elapsedTime);

This may be simpler than creating a Decoder and is guaranteed to be called when a response is received regardless of status. Decoders are only called if the request does not trigger an error.

Kevin Davis
  • 1,193
  • 8
  • 14