Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions dependencyManagement/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ rootProject.extra["versions"] = dependencyVersions

val autoValueVersion = "1.11.1"
val errorProneVersion = "2.48.0"
val groovyVersion = "4.0.25"
val jmhVersion = "1.37"
// Mockito 5.x.x requires Java 11 https://github.com/mockito/mockito/releases/tag/v5.0.0
val mockitoVersion = "4.11.0"
Expand Down Expand Up @@ -88,6 +89,7 @@ val DEPENDENCIES = listOf(
"io.opentracing:opentracing-noop:0.33.0",
"junit:junit:4.13.2",
"nl.jqno.equalsverifier:equalsverifier:3.19.4",
"org.apache.groovy:groovy:${groovyVersion}",
"org.awaitility:awaitility:4.3.0",
"org.codehaus.mojo:animal-sniffer-annotations:1.27",
"org.jctools:jctools-core:4.0.6",
Expand Down
1 change: 1 addition & 0 deletions sdk/all/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ dependencies {

testAnnotationProcessor("com.google.auto.value:auto-value")

testImplementation("org.apache.groovy:groovy")
testImplementation(project(":sdk:testing"))

jmh(project(":sdk:testing"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.internal.OpenTelemetrySdkBuilderUtil;
import io.opentelemetry.sdk.internal.SdkConfigProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.annotation.Nullable;

/** A builder for configuring an {@link OpenTelemetrySdk}. */
Expand All @@ -28,16 +29,28 @@ public final class OpenTelemetrySdkBuilder {
@Nullable private Object configProvider;

private static final boolean INCUBATOR_AVAILABLE;
@Nullable private static final Method CREATE_EXTENDED_OPEN_TELEMETRY_SDK_METHOD;

static {
boolean incubatorAvailable = false;
Method createExtendedOpenTelemetrySdk = null;
try {
Class.forName("io.opentelemetry.api.incubator.ExtendedOpenTelemetry");
createExtendedOpenTelemetrySdk =
Class.forName("io.opentelemetry.sdk.IncubatingUtil")
.getDeclaredMethod(
"createExtendedOpenTelemetrySdk", OpenTelemetrySdk.class, Object.class);
incubatorAvailable = true;
} catch (ClassNotFoundException e) {
// Not available
} catch (NoSuchMethodException e) {
throw new IllegalStateException(
"IncubatingUtil.createExtendedOpenTelemetrySdk could not be found."
+ " This is a bug in OpenTelemetry.",
e);
}
INCUBATOR_AVAILABLE = incubatorAvailable;
CREATE_EXTENDED_OPEN_TELEMETRY_SDK_METHOD = createExtendedOpenTelemetrySdk;
}

/**
Expand Down Expand Up @@ -89,12 +102,13 @@ public OpenTelemetrySdkBuilder setPropagators(ContextPropagators propagators) {
}

/**
* Sets the {@link SdkConfigProvider} to use.
* Sets the SDK config provider to use.
*
* <p>This method is experimental so not public. You may reflectively call it using {@link
* OpenTelemetrySdkBuilderUtil#setConfigProvider(OpenTelemetrySdkBuilder, SdkConfigProvider)}.
* OpenTelemetrySdkBuilderUtil#setConfigProvider(OpenTelemetrySdkBuilder,
* io.opentelemetry.sdk.internal.SdkConfigProvider)}.
*/
OpenTelemetrySdkBuilder setConfigProvider(SdkConfigProvider configProvider) {
OpenTelemetrySdkBuilder setConfigProvider(Object configProvider) {
this.configProvider = requireNonNull(configProvider);
return this;
}
Expand Down Expand Up @@ -143,7 +157,33 @@ public OpenTelemetrySdk build() {
OpenTelemetrySdk openTelemetrySdk =
new OpenTelemetrySdk(tracerProvider, meterProvider, loggerProvider, propagators);
return INCUBATOR_AVAILABLE
? IncubatingUtil.createExtendedOpenTelemetrySdk(openTelemetrySdk, configProvider)
? createExtendedOpenTelemetrySdk(openTelemetrySdk, configProvider)
: openTelemetrySdk;
}

private static OpenTelemetrySdk createExtendedOpenTelemetrySdk(
OpenTelemetrySdk openTelemetrySdk, @Nullable Object configProvider) {
try {
return (OpenTelemetrySdk)
requireNonNull(CREATE_EXTENDED_OPEN_TELEMETRY_SDK_METHOD)
.invoke(null, openTelemetrySdk, configProvider);
} catch (IllegalAccessException e) {
throw new IllegalStateException(
"IncubatingUtil.createExtendedOpenTelemetrySdk could not be invoked."
+ " This is a bug in OpenTelemetry.",
e);
} catch (InvocationTargetException e) {
Throwable cause = e.getTargetException();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
}
if (cause instanceof Error) {
throw (Error) cause;
}
throw new IllegalStateException(
"IncubatingUtil.createExtendedOpenTelemetrySdk failed."
+ " This is a bug in OpenTelemetry.",
cause);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ public static OpenTelemetrySdkBuilder setConfigProvider(
OpenTelemetrySdkBuilder builder, SdkConfigProvider configProvider) {
try {
Method method =
OpenTelemetrySdkBuilder.class.getDeclaredMethod(
"setConfigProvider", SdkConfigProvider.class);
OpenTelemetrySdkBuilder.class.getDeclaredMethod("setConfigProvider", Object.class);
method.setAccessible(true);
method.invoke(builder, configProvider);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import groovy.lang.GroovyClassLoader;
import io.github.netmikey.logunit.api.LogCapturer;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
Expand Down Expand Up @@ -138,6 +139,23 @@ void builder() {
assertThat(openTelemetry.getPropagators()).isEqualTo(propagators);
}

@Test
void builder_fromGroovyWithoutIncubator() throws Exception {
try (GroovyClassLoader groovyClassLoader = new GroovyClassLoader(getClass().getClassLoader())) {
Class<?> groovyClass =
groovyClassLoader.parseClass(
"import io.opentelemetry.sdk.OpenTelemetrySdk\n"
+ "class GroovyBuilderCaller {\n"
+ " static Object buildSdk() {\n"
+ " OpenTelemetrySdk.builder().build()\n"
+ " }\n"
+ "}\n");

assertThat(groovyClass.getMethod("buildSdk").invoke(null))
.isInstanceOf(OpenTelemetrySdk.class);
}
}

@Test
void getTracer() {
assertThat(GlobalOpenTelemetry.getTracer("testTracer1"))
Expand Down
Loading