spring-cloud-aws
spring-cloud-aws copied to clipboard
X-Ray support
Would it be possible to document the integration options with X-Ray, if it is even possible?
At the moment an application fails to start because the various AWS clients cannot obtain the segment context.
Caused by: com.amazonaws.xray.exceptions.SegmentNotFoundException: Thread failed to begin a subsegment: segment not found. Verify that a segment is in progress, and that the SegmentContextResolverChain is configured correctly in order to discover the segment.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_131]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_131]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_131]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_131]
at com.amazonaws.xray.strategy.RuntimeErrorContextMissingStrategy.contextMissing(RuntimeErrorContextMissingStrategy.java:17) ~[aws-xray-recorder-sdk-core-1.1.2.jar!/:na]
at com.amazonaws.xray.AWSXRayRecorder.beginSubsegment(AWSXRayRecorder.java:415) ~[aws-xray-recorder-sdk-core-1.1.2.jar!/:na]
at com.amazonaws.xray.handlers.TracingHandler.beforeRequest(TracingHandler.java:147) ~[aws-xray-recorder-sdk-aws-sdk-1.1.2.jar!/:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:767) ~[aws-java-sdk-core-1.11.98.jar!/:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:723) ~[aws-java-sdk-core-1.11.98.jar!/:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:716) ~[aws-java-sdk-core-1.11.98.jar!/:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) ~[aws-java-sdk-core-1.11.98.jar!/:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) ~[aws-java-sdk-core-1.11.98.jar!/:na]
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) ~[aws-java-sdk-core-1.11.98.jar!/:na]
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) ~[aws-java-sdk-core-1.11.98.jar!/:na]
at com.amazonaws.services.cloudformation.AmazonCloudFormationClient.doInvoke(AmazonCloudFormationClient.java:1641) ~[aws-java-sdk-cloudformation-1.11.98.jar!/:na]
at com.amazonaws.services.cloudformation.AmazonCloudFormationClient.invoke(AmazonCloudFormationClient.java:1617) ~[aws-java-sdk-cloudformation-1.11.98.jar!/:na]
at com.amazonaws.services.cloudformation.AmazonCloudFormationClient.describeStackResources(AmazonCloudFormationClient.java:836) ~[aws-java-sdk-cloudformation-1.11.98.jar!/:na]
at org.springframework.cloud.aws.core.env.stack.config.AutoDetectingStackNameProvider.autoDetectStackName(AutoDetectingStackNameProvider.java:76) ~[spring-cloud-aws-core-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at org.springframework.cloud.aws.core.env.stack.config.AutoDetectingStackNameProvider.afterPropertiesSet(AutoDetectingStackNameProvider.java:62) ~[spring-cloud-aws-core-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at org.springframework.cloud.aws.core.env.stack.config.AutoDetectingStackNameProvider.<init>(AutoDetectingStackNameProvider.java:52) ~[spring-cloud-aws-core-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at org.springframework.cloud.aws.core.env.stack.config.AutoDetectingStackNameProvider.<init>(AutoDetectingStackNameProvider.java:56) ~[spring-cloud-aws-core-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration.stackResourceRegistryFactoryBean(ContextStackAutoConfiguration.java:71) ~[spring-cloud-aws-autoconfigure-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration$$EnhancerBySpringCGLIB$$7f7d41cd.CGLIB$stackResourceRegistryFactoryBean$0(<generated>) ~[spring-cloud-aws-autoconfigure-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration$$EnhancerBySpringCGLIB$$7f7d41cd$$FastClassBySpringCGLIB$$11dd24da.invoke(<generated>) ~[spring-cloud-aws-autoconfigure-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) ~[spring-context-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]
at org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration$$EnhancerBySpringCGLIB$$7f7d41cd.stackResourceRegistryFactoryBean(<generated>) ~[spring-cloud-aws-autoconfigure-1.2.0.RELEASE.jar!/:1.2.0.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.7.RELEASE.jar!/:4.3.7.RELEASE]
... 65 common frames omitted
I think the problem is down to the SQS client running in a separate thread pool (which is totally necessary). The Amazon X-Ray code doesn't really seem to handle this at all.
Have there been any updates around adding this feature or found any workarounds?
Sadly not, I couldn't see a quick or obvious way around it.
@adriancole or @marcingrzejszczak any comment?
right now folks sometimes use zipkin-aws which includes instrumentation and an xray exporter. I think sqs might be in a different package tho cc @devinsba @llinder
If you are already using spring cloud, you are probably better off using spring-cloud-sleuth with the components Adrian mentioned. Though a disclaimer is in order here: the XRay reporter does not have feature parity with the native XRay client, we are always open to PRs to help improve support.
On SQS, if you want to trace across your queues then you will want to pull in the smartthings-brave
SQS instrumentation component.
X-Ray traces can now be passed through SQS. I think the SQSListener must be extended to support this and set the tracing context. See the AWS Tutorial.