Skip to content

Commit 44808da

Browse files
committed
Add GlobalOpenTelemetry#isSet
1 parent de48d1b commit 44808da

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed

api/all/src/main/java/io/opentelemetry/api/GlobalOpenTelemetry.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.opentelemetry.context.propagation.ContextPropagators;
1919
import java.lang.reflect.InvocationTargetException;
2020
import java.lang.reflect.Method;
21+
import java.util.Objects;
2122
import java.util.function.Supplier;
2223
import java.util.logging.Level;
2324
import java.util.logging.Logger;
@@ -85,7 +86,7 @@ public static OpenTelemetry get() {
8586
}
8687

8788
set(OpenTelemetry.noop());
88-
return OpenTelemetry.noop();
89+
openTelemetry = Objects.requireNonNull(globalOpenTelemetry);
8990
}
9091
}
9192
}
@@ -133,6 +134,20 @@ public static void set(Supplier<OpenTelemetry> supplier) {
133134
}
134135
}
135136

137+
/**
138+
* Evaluate if the global instance has been set without the side effects of {@link #get()}.
139+
*
140+
* <p>This is useful for evaluating if any code, like the OpenTelemetry javaagent, has previously
141+
* set the global instance while preserving the ability to set it.
142+
*
143+
* @return true if the global instance has been set, false otherwise.
144+
*/
145+
public static boolean isSet() {
146+
synchronized (mutex) {
147+
return globalOpenTelemetry != null;
148+
}
149+
}
150+
136151
/** Returns the globally registered {@link TracerProvider}. */
137152
public static TracerProvider getTracerProvider() {
138153
return get().getTracerProvider();

api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractOpenTelemetryTest.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ private void setOpenTelemetry() {
3131
GlobalOpenTelemetry.set(getOpenTelemetry());
3232
}
3333

34-
private static OpenTelemetry getGlobalOpenTelemetry() {
35-
return GlobalOpenTelemetry.get();
36-
}
37-
3834
@AfterEach
3935
public void after() {
4036
GlobalOpenTelemetry.resetForTest();
@@ -90,7 +86,9 @@ void independentNonGlobalPropagators() {
9086

9187
@Test
9288
void setThenSet() {
89+
assertThat(GlobalOpenTelemetry.isSet()).isFalse();
9390
setOpenTelemetry();
91+
assertThat(GlobalOpenTelemetry.isSet()).isTrue();
9492
assertThatThrownBy(() -> GlobalOpenTelemetry.set(getOpenTelemetry()))
9593
.isInstanceOf(IllegalStateException.class)
9694
.hasMessageContaining("GlobalOpenTelemetry.set has already been called")
@@ -99,14 +97,29 @@ void setThenSet() {
9997

10098
@Test
10199
void getThenSet() {
102-
assertThat(getGlobalOpenTelemetry().getClass().getName())
103-
.isEqualTo("io.opentelemetry.api.DefaultOpenTelemetry");
100+
assertThat(GlobalOpenTelemetry.isSet()).isFalse();
101+
// Calling GlobalOpenTelemetry.get() has the side affect of setting GlobalOpenTelemetry to an
102+
// (obfuscated) noop.
103+
// Call GlobalOpenTelemetry.get() using a utility method so we can later assert it was
104+
// responsible for setting GlobalOpenTelemetry.
105+
assertThat(getGlobalOpenTelemetry())
106+
.satisfies(
107+
instance ->
108+
assertThat(instance.getClass().getName())
109+
.isEqualTo("io.opentelemetry.api.GlobalOpenTelemetry$ObfuscatedOpenTelemetry"))
110+
.extracting("delegate")
111+
.isSameAs(OpenTelemetry.noop());
112+
assertThat(GlobalOpenTelemetry.isSet()).isTrue();
104113
assertThatThrownBy(() -> GlobalOpenTelemetry.set(getOpenTelemetry()))
105114
.isInstanceOf(IllegalStateException.class)
106115
.hasMessageContaining("GlobalOpenTelemetry.set has already been called")
107116
.hasStackTraceContaining("getGlobalOpenTelemetry");
108117
}
109118

119+
private static OpenTelemetry getGlobalOpenTelemetry() {
120+
return GlobalOpenTelemetry.get();
121+
}
122+
110123
@Test
111124
void toString_noop_Valid() {
112125
assertThat(getOpenTelemetry().toString())
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
Comparing source compatibility of opentelemetry-api-1.56.0-SNAPSHOT.jar against opentelemetry-api-1.55.0.jar
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.api.GlobalOpenTelemetry (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
+++ NEW METHOD: PUBLIC(+) STATIC(+) boolean isSet()

sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void initializeAndGet_noGlobal() {
7373
@Test
7474
void globalOpenTelemetry_AutoConfigureDisabled() {
7575
// Autoconfigure is disabled by default and enabled via otel.java.global-autoconfigure.enabled
76-
assertThat(GlobalOpenTelemetry.get()).isSameAs(OpenTelemetry.noop());
76+
assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isSameAs(OpenTelemetry.noop());
7777

7878
logs.assertContains(
7979
"AutoConfiguredOpenTelemetrySdk found on classpath but automatic configuration is disabled."

sdk/testing/src/test/java/io/opentelemetry/sdk/testing/junit5/OpenTelemetryExtensionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ void afterAll() {
230230
assertThat(extension.getSpans()).isNotEmpty();
231231

232232
extension.afterAll(null);
233-
assertThat(GlobalOpenTelemetry.get()).isSameAs(OpenTelemetry.noop());
233+
assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isSameAs(OpenTelemetry.noop());
234234

235235
meter.counterBuilder("counter").build().add(10);
236236
tracer.spanBuilder("span").startSpan().end();

0 commit comments

Comments
 (0)