Ao conectar uma aplicação Java que usa OpenFeign ao Application Monitoring do ARMS, os dados da aplicação podem ficar incompletos e as informações das aplicações downstream podem não ser exibidas.
Isso ocorre porque o OpenFeign ativa o Hystrix por padrão, e o Hystrix usa internamente o framework assíncrono RxJava. Quando o Hystrix despacha uma requisição para uma thread diferente, o agente do ARMS perde o contexto de rastreamento, o que interrompe o vínculo entre as chamadas upstream e downstream.
Esse problema afeta apenas versões do agente do ARMS anteriores à 2.6.0. O agente do ARMS 2.6.0 e posteriores oferece suporte nativo a frameworks assíncronos e rastreia corretamente chamadas OpenFeign + Hystrix sem necessidade de alterações.
Solução
Opção 1: Atualizar o agente do ARMS (recomendado)
Atualize o agente do ARMS da sua aplicação Java para a versão 2.6.0 ou superior. Essa versão oferece suporte nativo a frameworks assíncronos, permitindo rastrear chamadas OpenFeign + Hystrix sem alterações no código.
Opção 2: Substituir Hystrix por OkHttp
Caso não seja possível atualizar o agente do ARMS, desative o Hystrix e use o OkHttp como cliente HTTP para o Feign. Essa abordagem evita a troca assíncrona de threads que causa a perda do contexto de rastreamento.
-
Adicione a dependência
feign-okhttpao arquivo pom.xml:<!-- Use OkHttp as the HTTP client for Feign --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency> -
Atualize o arquivo de configuração do Spring Cloud para ativar o OkHttp e desativar o Hystrix:
feign.okhttp.enabled: true feign.hystrix.enabled: false -
Adicione uma classe de configuração do OkHttp ao projeto e ajuste os valores de timeout conforme as necessidades da aplicação.
@Configuration @ConditionalOnClass(Feign.class) @AutoConfigureBefore(FeignAutoConfiguration.class) public class FeignClientOkHttpConfiguration { @Bean public OkHttpClient okHttpClient() { return new OkHttpClient.Builder() .connectTimeout(20, TimeUnit.SECONDS) // Connection timeout .readTimeout(20, TimeUnit.SECONDS) // Response timeout .writeTimeout(20, TimeUnit.SECONDS) // Write request timeout .retryOnConnectionFailure(true) // Enable automatic reconnection .connectionPool(new ConnectionPool()) // Use the default connection pool .build(); } }
Verificar o resultado
Após aplicar qualquer uma das soluções, reinicie a aplicação e verifique o console do Application Monitoring do ARMS:
Os dados da aplicação referentes às chamadas OpenFeign estão completos.
As informações das aplicações downstream são exibidas corretamente.