Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.internal.testing.CleanupExtension;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.OpenTelemetrySdkBuilderUtil;
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.resources.Resource;
Expand All @@ -28,17 +28,20 @@ class DeclarativeConfigurationSpiTest {

@Test
void configFromSpi() {
ExtendedOpenTelemetrySdk expectedSdk =
ExtendedOpenTelemetrySdk.create(
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(
Resource.getDefault().toBuilder().put("service.name", "test").build())
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
.build())
.build(),
SdkConfigProvider.create(new OpenTelemetryConfigurationModel()));
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdkBuilderUtil.setSdkConfigProvider(
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(
Resource.getDefault().toBuilder()
.put("service.name", "test")
.build())
.addSpanProcessor(
SimpleSpanProcessor.create(LoggingSpanExporter.create()))
.build()),
SdkConfigProvider.create(new OpenTelemetryConfigurationModel()))
.build();
cleanup.addCloseable(expectedSdk);
AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder());
Thread thread = new Thread();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ void globalOpenTelemetry_AutoConfigureEnabled() {
private static OpenTelemetry unobfuscate(OpenTelemetry openTelemetry) {
try {
Field delegateField =
Class.forName("io.opentelemetry.api.GlobalOpenTelemetry$ObfuscatedOpenTelemetry")
Class.forName("io.opentelemetry.api.incubator.internal.ObfuscatedExtendedOpenTelemetry")
.getDeclaredField("delegate");
delegateField.setAccessible(true);
Object delegate = delegateField.get(openTelemetry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.OpenTelemetrySdkBuilderUtil;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
Expand Down Expand Up @@ -122,16 +123,18 @@ void configFile_Valid() {

OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
Resource resource = Resource.getDefault().toBuilder().put("service.name", "test").build();
ExtendedOpenTelemetrySdk expectedSdk =
ExtendedOpenTelemetrySdk.create(
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(resource)
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
.build())
.build(),
((ExtendedOpenTelemetrySdk) openTelemetrySdk).getSdkConfigProvider());
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdkBuilderUtil.setSdkConfigProvider(
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(resource)
.addSpanProcessor(
SimpleSpanProcessor.create(LoggingSpanExporter.create()))
.build()),
((ExtendedOpenTelemetrySdk) openTelemetrySdk).getSdkConfigProvider())
.build();

cleanup.addCloseable(expectedSdk);
assertThat(openTelemetrySdk.toString()).hasToString(expectedSdk.toString());
// AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ public ExtendedOpenTelemetrySdk create(
OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) {
SdkConfigProvider sdkConfigProvider =
SdkConfigProvider.create(model, context.getSpiHelper().getComponentLoader());
OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder();
OpenTelemetrySdkBuilder builder =
OpenTelemetrySdkBuilderUtil.setSdkConfigProvider(
OpenTelemetrySdk.builder(), sdkConfigProvider);
String fileFormat = model.getFileFormat();
if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) {
throw new DeclarativeConfigException(
Expand All @@ -44,7 +46,7 @@ public ExtendedOpenTelemetrySdk create(
// behavior for experimental properties.

if (Objects.equals(true, model.getDisabled())) {
return ExtendedOpenTelemetrySdk.create(builder.build(), sdkConfigProvider);
return (ExtendedOpenTelemetrySdk) builder.build();
}

if (model.getPropagator() != null) {
Expand Down Expand Up @@ -92,7 +94,6 @@ public ExtendedOpenTelemetrySdk create(
.build()));
}

OpenTelemetrySdk openTelemetrySdk = context.addCloseable(builder.build());
return ExtendedOpenTelemetrySdk.create(openTelemetrySdk, sdkConfigProvider);
return (ExtendedOpenTelemetrySdk) context.addCloseable(builder.build());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk.extension.incubator.fileconfig;

import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
import java.lang.reflect.Method;

/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public final class OpenTelemetrySdkBuilderUtil {

private OpenTelemetrySdkBuilderUtil() {}

public static OpenTelemetrySdkBuilder setSdkConfigProvider(
OpenTelemetrySdkBuilder builder, SdkConfigProvider sdkConfigProvider) {
try {
Method method =
OpenTelemetrySdkBuilder.class.getDeclaredMethod("setSdkConfigProvider", Object.class);
method.setAccessible(true);
method.invoke(builder, sdkConfigProvider);
return builder;
} catch (NoSuchMethodException
| IllegalAccessException
| java.lang.reflect.InvocationTargetException e) {
throw new IllegalStateException(
"Error calling setSdkConfigProvider on OpenTelemetrySdkBuilder", e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@ public final class SdkConfigProvider implements ConfigProvider {

private SdkConfigProvider(
OpenTelemetryConfigurationModel model, ComponentLoader componentLoader) {
DeclarativeConfigProperties configProperties =
DeclarativeConfiguration.toConfigProperties(model, componentLoader);
this.instrumentationConfig =
configProperties.getStructured("instrumentation/development", empty());
this(
DeclarativeConfiguration.toConfigProperties(model, componentLoader)
.getStructured("instrumentation/development", empty()));
}

private SdkConfigProvider(DeclarativeConfigProperties instrumentationConfig) {
this.instrumentationConfig = instrumentationConfig;
}

/**
Expand All @@ -47,6 +50,15 @@ public static SdkConfigProvider create(
return new SdkConfigProvider(model, componentLoader);
}

/**
* Create a no-op {@link SdkConfigProvider}.
*
* @return the no-op {@link SdkConfigProvider}
*/
public static ConfigProvider noop() {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused and a duplicate of ConfigProvider#noop()

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Called from https://github.com/zeitlinger/opentelemetry-java/blob/0db77eb839b0af1e7f32b0f7ced29e60edcce005/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java#L26 to get an instance for ExtendedOpenTelemetrySdk.

I tried to make it return SdkConfigProvider - but then a design test failed.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Called from https://github.com/zeitlinger/opentelemetry-java/blob/0db77eb839b0af1e7f32b0f7ced29e60edcce005/sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java#L26 to get an instance for ExtendedOpenTelemetrySdk.

I tried to make it return SdkConfigProvider - but then a design test failed.

return new SdkConfigProvider(DeclarativeConfigProperties.empty());
}

@Override
public DeclarativeConfigProperties getInstrumentationConfig() {
return instrumentationConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,10 @@ void create_Defaults() {
List<Closeable> closeables = new ArrayList<>();
OpenTelemetryConfigurationModel model =
new OpenTelemetryConfigurationModel().withFileFormat("1.0-rc.1");
ExtendedOpenTelemetrySdk expectedSdk =
ExtendedOpenTelemetrySdk.create(
OpenTelemetrySdk.builder().build(), SdkConfigProvider.create(model));
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdkBuilderUtil.setSdkConfigProvider(
OpenTelemetrySdk.builder(), SdkConfigProvider.create(model))
.build();
cleanup.addCloseable(expectedSdk);

ExtendedOpenTelemetrySdk sdk =
Expand Down Expand Up @@ -154,9 +155,10 @@ void create_Disabled() {
.withExporter(
new LogRecordExporterModel()
.withOtlpHttp(new OtlpHttpExporterModel()))))));
ExtendedOpenTelemetrySdk expectedSdk =
ExtendedOpenTelemetrySdk.create(
OpenTelemetrySdk.builder().build(), SdkConfigProvider.create(model));
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdkBuilderUtil.setSdkConfigProvider(
OpenTelemetrySdk.builder(), SdkConfigProvider.create(model))
.build();
cleanup.addCloseable(expectedSdk);

ExtendedOpenTelemetrySdk sdk =
Expand Down Expand Up @@ -257,63 +259,64 @@ void create_Configured() throws NoSuchFieldException, IllegalAccessException {
.withName("stream-name")
.withAttributeKeys(null)))));

ExtendedOpenTelemetrySdk expectedSdk =
ExtendedOpenTelemetrySdk.create(
OpenTelemetrySdk.builder()
.setPropagators(
ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(),
W3CBaggagePropagator.getInstance(),
OtTracePropagator.getInstance(),
B3Propagator.injectingMultiHeaders(),
B3Propagator.injectingSingleHeader(),
JaegerPropagator.getInstance())))
.setLoggerProvider(
SdkLoggerProvider.builder()
.setResource(expectedResource)
.setLogLimits(
() ->
LogLimits.builder()
.setMaxAttributeValueLength(1)
.setMaxNumberOfAttributes(2)
OpenTelemetrySdk expectedSdk =
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change isn't strictly necessary is it since the test code could still call ExtendedOpenTelemetrySdk.create(..)? Not suggesting reverting - just trying to confirm my understanding.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OpenTelemetrySdkBuilderUtil.setSdkConfigProvider(
OpenTelemetrySdk.builder()
.setPropagators(
ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(),
W3CBaggagePropagator.getInstance(),
OtTracePropagator.getInstance(),
B3Propagator.injectingMultiHeaders(),
B3Propagator.injectingSingleHeader(),
JaegerPropagator.getInstance())))
.setLoggerProvider(
SdkLoggerProvider.builder()
.setResource(expectedResource)
.setLogLimits(
() ->
LogLimits.builder()
.setMaxAttributeValueLength(1)
.setMaxNumberOfAttributes(2)
.build())
.addLogRecordProcessor(
io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor.builder(
OtlpHttpLogRecordExporter.getDefault())
.build())
.build())
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(expectedResource)
.setSpanLimits(
SpanLimits.builder()
.setMaxNumberOfAttributes(1)
.setMaxAttributeValueLength(2)
.setMaxNumberOfEvents(3)
.setMaxNumberOfLinks(4)
.setMaxNumberOfAttributesPerEvent(5)
.setMaxNumberOfAttributesPerLink(6)
.build())
.setSampler(alwaysOn())
.addSpanProcessor(
io.opentelemetry.sdk.trace.export.BatchSpanProcessor.builder(
OtlpHttpSpanExporter.getDefault())
.build())
.addLogRecordProcessor(
io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor.builder(
OtlpHttpLogRecordExporter.getDefault())
.build())
.build())
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(expectedResource)
.setSpanLimits(
SpanLimits.builder()
.setMaxNumberOfAttributes(1)
.setMaxAttributeValueLength(2)
.setMaxNumberOfEvents(3)
.setMaxNumberOfLinks(4)
.setMaxNumberOfAttributesPerEvent(5)
.setMaxNumberOfAttributesPerLink(6)
.build())
.setSampler(alwaysOn())
.addSpanProcessor(
io.opentelemetry.sdk.trace.export.BatchSpanProcessor.builder(
OtlpHttpSpanExporter.getDefault())
.build())
.build())
.setMeterProvider(
SdkMeterProvider.builder()
.setResource(expectedResource)
.registerMetricReader(
io.opentelemetry.sdk.metrics.export.PeriodicMetricReader.builder(
OtlpHttpMetricExporter.getDefault())
.build())
.registerView(
InstrumentSelector.builder().setName("instrument-name").build(),
View.builder().setName("stream-name").build())
.build())
.build(),
SdkConfigProvider.create(model));
.build())
.setMeterProvider(
SdkMeterProvider.builder()
.setResource(expectedResource)
.registerMetricReader(
io.opentelemetry.sdk.metrics.export.PeriodicMetricReader.builder(
OtlpHttpMetricExporter.getDefault())
.build())
.registerView(
InstrumentSelector.builder().setName("instrument-name").build(),
View.builder().setName("stream-name").build())
.build()),
SdkConfigProvider.create(model))
.build();

cleanup.addCloseable(expectedSdk);

ExtendedOpenTelemetrySdk sdk =
Expand Down
57 changes: 57 additions & 0 deletions sdk/all/src/main/java/io/opentelemetry/sdk/IncubatingUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* Utilities for interacting with incubating components ({@code
* io.opentelemetry:opentelemetry-api-incubator} and {@code
* io.opentelemetry:opentelemetry-sdk-extension-incubator}), which are not guaranteed to be present
* on the classpath. For all methods, callers MUST first separately reflectively confirm that the
* incubator is available on the classpath.
*/
final class IncubatingUtil {

private IncubatingUtil() {}

static Object noopSdkConfigProvider() {
try {
Class<?> sdkConfigProviderClass =
Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider");
Method defaultProviderMethod = sdkConfigProviderClass.getMethod("noop");
return defaultProviderMethod.invoke(null);
} catch (ClassNotFoundException
| NoSuchMethodException
| IllegalAccessException
| InvocationTargetException e) {
throw new IllegalStateException(
"Failed to create default SdkConfigProvider from incubator", e);
}
}

static OpenTelemetrySdk createExtendedOpenTelemetrySdk(
OpenTelemetrySdk openTelemetrySdk, Object sdkConfigProvider) {
try {
Class<?> extendedSdkClass =
Class.forName("io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk");
Class<?> sdkConfigProviderClass =
Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider");
Method createMethod =
extendedSdkClass.getMethod("create", OpenTelemetrySdk.class, sdkConfigProviderClass);
return (OpenTelemetrySdk)
createMethod.invoke(
null, openTelemetrySdk, sdkConfigProviderClass.cast(sdkConfigProvider));
} catch (ClassNotFoundException
| NoSuchMethodException
| IllegalAccessException
| InvocationTargetException e) {
throw new IllegalStateException(
"Failed to create ExtendedOpenTelemetrySdk from incubator", e);
}
}
}
Loading
Loading