spring-attic / spring-cloud-aws

All development has moved to https://github.com/awspring/spring-cloud-aws Integration for Amazon Web Services APIs with Spring
https://awspring.io/
Apache License 2.0
590 stars 376 forks source link

X-Ray support #244

Open pacey opened 7 years ago

pacey commented 7 years ago

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.

cdrisc1 commented 6 years ago

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

pacey commented 6 years ago

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

spencergibb commented 5 years ago

@adriancole or @marcingrzejszczak any comment?

codefromthecrypt commented 5 years ago

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

devinsba commented 5 years ago

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.

VolkerK commented 4 years ago

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.