'AWS XRay wrong service map when using OpenFeign with AppMesh and AWS Service Discovery
I'm testing interservice communication with Spring Boot Rest services deployed on AWS with AppMesh and Service Discovery enabled. To be able to send messages from service a to service b I've to use the OpenFeign client to generate a proxy class.
Tech Stack
- Spring Boot OpenFeign
- AWS XRay
- ECS
- ECR
- Sleuth
- AppMesh (Virtual Node, Virtual Service)
- AWS Service Discovery (instead of Eureka)
Expected Behavior
In AWS XRay, it should show a call trace:
Client -> ServiceA -> ServiceB
Actual Behavior
In AWS XRay, I can see the call traces:
Client -> ServiceA Client -> ServiceB
Another question would be how to tell OpenFeign to use the HttpClient from AWS SDK?
Other Information
Repository available at: https://github.com/czetsuya/lab-microservice-spring-aws
Solution 1:[1]
I was able to fix this issue by using a dynamicNamingStrategy in tracingFilter
@Bean
public Filter tracingFilter(final AWSXRayRecorder awsxRayRecorder) {
log.info("Setting up AWS Xray tracing filter");
return new AWSXRayServletFilter(SegmentNamingStrategy.dynamic(Optional.ofNullable(AWS_XRAY_SEGMENT_NAME).orElse(
"xray-filter")));
}
And create an HttpClientBuilder bean.
@Bean
public HttpClientBuilder xrayHttpClientBuilder() {
log.info("Setting up AWS xray http client configuration");
return HttpClientBuilder.create();
}
AWS XRay should now show the HTTP requests in the trace:
The project code is available at https://github.com/czetsuya/lab-microservice-spring-aws.
Solution 2:[2]
Not sure if you have found solution yet, the snippet code below could help you:
Firstly you need to use Feign Http Client:
implementation 'io.github.openfeign:feign-httpclient:9.5.0'
Create Feign Builder which use apache http client from aws xray
@Bean
public Feign.Builder feignBuilder() {
//aws xray http client
CloseableHttpClient client = HttpClientBuilder.create().build();
return Feign.builder()
.retryer(Retryer.NEVER_RETRY)
.client(new ApacheHttpClient(client));
}
Initialize your client:
@Bean
CallingService TestSnsPushNotificationApis(@Autowired Feign.Builder builder) {
return builder.target(CallingService.class, "http://localhost:8081");
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 |