spring-cloud-aws icon indicating copy to clipboard operation
spring-cloud-aws copied to clipboard

X-Ray support

Open pacey opened this issue 7 years ago • 6 comments

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.

pacey avatar Jul 11 '17 10:07 pacey

Have there been any updates around adding this feature or found any workarounds?

conadrisca avatar Jul 12 '18 17:07 conadrisca

Sadly not, I couldn't see a quick or obvious way around it.

pacey avatar Jul 26 '18 08:07 pacey

@adriancole or @marcingrzejszczak any comment?

spencergibb avatar Jan 29 '19 01:01 spencergibb

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

codefromthecrypt avatar Jan 29 '19 07:01 codefromthecrypt

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.

devinsba avatar Jan 29 '19 14:01 devinsba

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.

VolkerK avatar Mar 13 '20 08:03 VolkerK