Skip to content

In unit tests: GlobalOpenTelemetry.set has already been called. #1607

@BrianSetz

Description

@BrianSetz

I have a very strange problem where I get an exception that only happens in unit tests. When I run the application normally, the exception does not show up. This behaviour only shows up after adding a guard rail (either input or output, both will trigger this behaviour) to my application.

I am aware this all sounds very vague, my apologies for that. I'm trying to make a small reproducer but I haven't succeeded yet. Perhaps someone could point me in the right direction that could trigger this kind of unit test exclusive behaviour?

Full stack trace:

java.lang.AssertionError: 1 expectation failed.
Expected status code <200> but was <500>.

	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:263)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:277)
	at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:512)
	at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure$validate$1.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
	at io.restassured.internal.ResponseSpecificationImpl.forceValidateResponse(ResponseSpecificationImpl.groovy:682)
	at io.restassured.module.kotlin.extensions.RestAssuredKotlinExtensionsKt.Then$lambda$1(RestAssuredKotlinExtensions.kt:61)
	at io.restassured.module.kotlin.extensions.RestAssuredKotlinExtensionsKt.doIfValidatableResponseImpl$lambda$2(RestAssuredKotlinExtensions.kt:80)
	at io.restassured.module.kotlin.extensions.RestAssuredKotlinExtensionsKt.Then(RestAssuredKotlinExtensions.kt:60)
	at nl.rug.digitallab.rag.resources.RagResourceTest.Inferring a question should succeed(RagResourceTest.kt:18)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at io.quarkus.test.junit.QuarkusTestExtension.runExtensionMethod(QuarkusTestExtension.java:999)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:847)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	Suppressed: io.quarkiverse.langchain4j.runtime.aiservice.GuardrailException: Error creating synthetic bean [Le6zQbzkojAYO_OiKIQWJf4lGa4]: io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException: Unexpected configuration error
		at io.quarkiverse.langchain4j.runtime.aiservice.GuardrailsSupport.invokeInputGuardrails(GuardrailsSupport.java:55)
		at io.quarkiverse.langchain4j.runtime.aiservice.AiServiceMethodImplementationSupport.doImplement(AiServiceMethodImplementationSupport.java:266)
		at io.quarkiverse.langchain4j.runtime.aiservice.AiServiceMethodImplementationSupport.implement(AiServiceMethodImplementationSupport.java:154)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$1.apply(MethodImplementationSupportProducer.java:31)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$1.apply(MethodImplementationSupportProducer.java:28)
		at io.quarkiverse.langchain4j.runtime.aiservice.SpanWrapper.wrap(SpanWrapper.java:32)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$2.apply(MethodImplementationSupportProducer.java:40)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$2.apply(MethodImplementationSupportProducer.java:37)
		at io.quarkiverse.langchain4j.runtime.aiservice.MetricsTimedWrapper$2.get(MetricsTimedWrapper.java:42)
		at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:69)
		at io.quarkiverse.langchain4j.runtime.aiservice.MetricsTimedWrapper.wrap(MetricsTimedWrapper.java:39)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$2.apply(MethodImplementationSupportProducer.java:40)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$2.apply(MethodImplementationSupportProducer.java:37)
		at io.quarkiverse.langchain4j.runtime.aiservice.MetricsCountedWrapper.wrap(MetricsCountedWrapper.java:22)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$2.apply(MethodImplementationSupportProducer.java:40)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1$2.apply(MethodImplementationSupportProducer.java:37)
		at io.quarkiverse.langchain4j.runtime.aiservice.MethodImplementationSupportProducer$1.implement(MethodImplementationSupportProducer.java:46)
		at nl.rug.digitallab.rag.langchain.StudentAssistantAiService$$QuarkusImpl.answerQuestion(Unknown Source)
		at nl.rug.digitallab.rag.langchain.StudentAssistantAiService$$QuarkusImpl_ClientProxy.answerQuestion(Unknown Source)
		at nl.rug.digitallab.rag.managers.RagManager.infer(RagManager.kt:54)
		at nl.rug.digitallab.rag.managers.RagManager_ClientProxy.infer(Unknown Source)
		at nl.rug.digitallab.rag.resources.RagResource.infer(RagResource.kt:48)
		at nl.rug.digitallab.rag.resources.RagResource$quarkusrestinvoker$infer_6641116d0c2682d92ecd97ca0b8d6e6696d93692.invoke(Unknown Source)
		at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
		at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
		at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
		at io.quarkus.vertx.core.runtime.VertxCoreRecorder$15.runWith(VertxCoreRecorder.java:637)
		at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651)
		at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630)
		at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622)
		at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589)
		at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
		at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
		at java.base/java.lang.Thread.run(Thread.java:1583)
	Caused by: jakarta.enterprise.inject.CreationException: Error creating synthetic bean [Le6zQbzkojAYO_OiKIQWJf4lGa4]: io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException: Unexpected configuration error
		at io.opentelemetry.api.OpenTelemetry_Le6zQbzkojAYO_OiKIQWJf4lGa4_Synthetic_Bean.doCreate(Unknown Source)
		at io.opentelemetry.api.OpenTelemetry_Le6zQbzkojAYO_OiKIQWJf4lGa4_Synthetic_Bean.create(Unknown Source)
		at io.opentelemetry.api.OpenTelemetry_Le6zQbzkojAYO_OiKIQWJf4lGa4_Synthetic_Bean.create(Unknown Source)
		at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119)
		at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
		at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
		at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:32)
		at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
		at io.quarkus.arc.impl.ComputingCacheContextInstances.computeIfAbsent(ComputingCacheContextInstances.java:19)
		at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35)
		at io.opentelemetry.api.OpenTelemetry_Le6zQbzkojAYO_OiKIQWJf4lGa4_Synthetic_Bean.get(Unknown Source)
		at io.opentelemetry.api.OpenTelemetry_Le6zQbzkojAYO_OiKIQWJf4lGa4_Synthetic_Bean.get(Unknown Source)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.WithSpanInterceptor_Bean.doCreate(Unknown Source)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.WithSpanInterceptor_Bean.create(Unknown Source)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.WithSpanInterceptor_Bean.get(Unknown Source)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.WithSpanInterceptor_Bean.get(Unknown Source)
		at nl.rug.digitallab.rag.langchain.inference.BasicInputGuardrail_Subclass.<init>(Unknown Source)
		at nl.rug.digitallab.rag.langchain.inference.BasicInputGuardrail_Bean.doCreate(Unknown Source)
		at nl.rug.digitallab.rag.langchain.inference.BasicInputGuardrail_Bean.create(Unknown Source)
		at nl.rug.digitallab.rag.langchain.inference.BasicInputGuardrail_Bean.create(Unknown Source)
		at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119)
		at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
		at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
		at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.c15(Unknown Source)
		at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.computeIfAbsent(Unknown Source)
		at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35)
		at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:23)
		at nl.rug.digitallab.rag.langchain.inference.BasicInputGuardrail_ClientProxy.arc$delegate(Unknown Source)
		at nl.rug.digitallab.rag.langchain.inference.BasicInputGuardrail_ClientProxy.validate(Unknown Source)
		at io.quarkiverse.langchain4j.runtime.aiservice.GuardrailsSupport.guardrailResult(GuardrailsSupport.java:198)
		at io.quarkiverse.langchain4j.runtime.aiservice.GuardrailsSupport.invokeInputGuardRails(GuardrailsSupport.java:188)
		at io.quarkiverse.langchain4j.runtime.aiservice.GuardrailsSupport.invokeInputGuardrails(GuardrailsSupport.java:50)
		... 34 more
	Caused by: io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException: Unexpected configuration error
		at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder.build(AutoConfiguredOpenTelemetrySdkBuilder.java:527)
		at io.quarkus.opentelemetry.runtime.OpenTelemetryRecorder$2.apply(OpenTelemetryRecorder.java:102)
		at io.quarkus.opentelemetry.runtime.OpenTelemetryRecorder$2.apply(OpenTelemetryRecorder.java:88)
		at io.opentelemetry.api.OpenTelemetry_Le6zQbzkojAYO_OiKIQWJf4lGa4_Synthetic_Bean.createSynthetic(Unknown Source)
		... 66 more
	Caused by: java.lang.IllegalStateException: GlobalOpenTelemetry.set has already been called. GlobalOpenTelemetry.set must be called only once before any calls to GlobalOpenTelemetry.get. If you are using the OpenTelemetrySdk, use OpenTelemetrySdkBuilder.buildAndRegisterGlobal instead. Previous invocation set to cause of this exception.
		at io.opentelemetry.api.GlobalOpenTelemetry.set(GlobalOpenTelemetry.java:107)
		at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder.maybeSetAsGlobal(AutoConfiguredOpenTelemetrySdkBuilder.java:594)
		at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder.build(AutoConfiguredOpenTelemetrySdkBuilder.java:508)
		... 69 more
	Caused by: java.lang.Throwable
		at io.opentelemetry.api.GlobalOpenTelemetry.set(GlobalOpenTelemetry.java:115)
		at io.opentelemetry.api.GlobalOpenTelemetry.get(GlobalOpenTelemetry.java:85)
		at io.opentelemetry.api.GlobalOpenTelemetry.getTracer(GlobalOpenTelemetry.java:134)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.TracerProducer.getTracer(TracerProducer.java:33)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.TracerProducer_ProducerMethod_getTracer_2WbgLITcyJ8m3eLEKU0XTuO1Xs4_Bean.doCreate(Unknown Source)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.TracerProducer_ProducerMethod_getTracer_2WbgLITcyJ8m3eLEKU0XTuO1Xs4_Bean.create(Unknown Source)
		at io.quarkus.opentelemetry.runtime.tracing.cdi.TracerProducer_ProducerMethod_getTracer_2WbgLITcyJ8m3eLEKU0XTuO1Xs4_Bean.create(Unknown Source)
		at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119)
		at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
		at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
		at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.c27(Unknown Source)
		at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.computeIfAbsent(Unknown Source)
		at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35)
		at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:23)
		at io.opentelemetry.api.trace.TracerProducer_ProducerMethod_getTracer_2WbgLITcyJ8m3eLEKU0XTuO1Xs4_ClientProxy.arc$delegate(Unknown Source)
		at io.opentelemetry.api.trace.TracerProducer_ProducerMethod_getTracer_2WbgLITcyJ8m3eLEKU0XTuO1Xs4_ClientProxy.spanBuilder(Unknown Source)
		at io.quarkiverse.langchain4j.runtime.aiservice.SpanWrapper.wrap(SpanWrapper.java:30)
		... 29 more

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions