diff --git a/microprofile/telemetry/src/main/java/io/helidon/microprofile/telemetry/TelemetryCdiExtension.java b/microprofile/telemetry/src/main/java/io/helidon/microprofile/telemetry/TelemetryCdiExtension.java index a087a85bcb2..a4767bd01cd 100644 --- a/microprofile/telemetry/src/main/java/io/helidon/microprofile/telemetry/TelemetryCdiExtension.java +++ b/microprofile/telemetry/src/main/java/io/helidon/microprofile/telemetry/TelemetryCdiExtension.java @@ -15,13 +15,19 @@ */ package io.helidon.microprofile.telemetry; +import io.helidon.tracing.Tracer; + import io.opentelemetry.instrumentation.annotations.WithSpan; +import jakarta.annotation.Priority; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.Initialized; import jakarta.enterprise.event.Observes; import jakarta.enterprise.inject.spi.BeforeBeanDiscovery; import jakarta.enterprise.inject.spi.Extension; import jakarta.enterprise.inject.spi.ProcessAnnotatedType; import jakarta.enterprise.inject.spi.WithAnnotations; import jakarta.enterprise.inject.spi.configurator.AnnotatedMethodConfigurator; +import jakarta.interceptor.Interceptor; /** * CDI extension for Microprofile Telemetry implementation. @@ -62,4 +68,13 @@ void processAnnotations(@Observes @WithAnnotations(WithSpan.class) ProcessAnnota } } } + + void finish(@Observes @Priority(Interceptor.Priority.LIBRARY_BEFORE) @Initialized(ApplicationScoped.class) Object startup, + Tracer tracer) { + // Forcing CDI to get us a tracer and then invoking one of the bean's methods triggers the producer to do its + // initialization, including setting the global tracer as part of start up. + tracer.enabled(); + LOGGER.log(System.Logger.Level.TRACE, + () -> "Global tracer set to " + tracer.unwrap(io.opentelemetry.api.trace.Tracer.class)); + } } diff --git a/microprofile/telemetry/src/test/java/io/helidon/microprofile/telemetry/TestExtension.java b/microprofile/telemetry/src/test/java/io/helidon/microprofile/telemetry/TestExtension.java new file mode 100644 index 00000000000..db4707fbca2 --- /dev/null +++ b/microprofile/telemetry/src/test/java/io/helidon/microprofile/telemetry/TestExtension.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2024 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.helidon.microprofile.telemetry; + +import io.helidon.tracing.Tracer; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.context.Initialized; +import jakarta.enterprise.event.Observes; +import jakarta.enterprise.inject.spi.Extension; + +public class TestExtension implements Extension { + + static Tracer globalTracerAtStartup; + + void startup(@Observes @Initialized(ApplicationScoped.class) Object startup) { + globalTracerAtStartup = Tracer.global(); + } +} diff --git a/microprofile/telemetry/src/test/java/io/helidon/microprofile/telemetry/TestTracerAtStartup.java b/microprofile/telemetry/src/test/java/io/helidon/microprofile/telemetry/TestTracerAtStartup.java new file mode 100644 index 00000000000..b8a4556a476 --- /dev/null +++ b/microprofile/telemetry/src/test/java/io/helidon/microprofile/telemetry/TestTracerAtStartup.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2024 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.helidon.microprofile.telemetry; + +import io.helidon.microprofile.testing.junit5.AddConfig; +import io.helidon.microprofile.testing.junit5.HelidonTest; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; + +@HelidonTest +@AddConfig(key = "otel.sdk.disabled", value = "false") +class TestTracerAtStartup { + + @Test + void checkForFullFeaturedTracerAtStartup() { + assertThat("Global tracer from start-up extension", + TestExtension.globalTracerAtStartup.unwrap(io.opentelemetry.api.trace.Tracer.class).getClass().getName(), + not(containsString("Default"))); + } +} diff --git a/microprofile/telemetry/src/test/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension b/microprofile/telemetry/src/test/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension new file mode 100644 index 00000000000..4fe1f6c72f9 --- /dev/null +++ b/microprofile/telemetry/src/test/resources/META-INF/services/jakarta.enterprise.inject.spi.Extension @@ -0,0 +1 @@ +io.helidon.microprofile.telemetry.TestExtension \ No newline at end of file