Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
4e5b156
Reboot the entity prototype
jsuereth Jun 18, 2025
869b4d8
Add base entity class, merge logic and test
jsuereth Jun 19, 2025
9f9dc92
Move Entity and EntityBuilder to be pure interfaces
jsuereth Jun 19, 2025
fb8e571
Add more merge helper methods and tests
jsuereth Jun 19, 2025
f182ad2
Added test for merging raw attributes
jsuereth Jun 19, 2025
30c578a
Cleanups and reverting silly changes
jsuereth Jun 19, 2025
01a9383
fix minor style issue
jsuereth Jun 19, 2025
fb08d7d
Actually wire entities into resource
jsuereth Jun 20, 2025
1f00dcb
Fix typo
jsuereth Jun 20, 2025
cfd444b
Remove all publicly accessible references to Entity from stable packages
jsuereth Jun 20, 2025
0e0bc4e
Add incubating EntityProvider API for specification work
jsuereth Jun 20, 2025
c8bfbd4
Fix refactoring that broke reflection.
jsuereth Jun 21, 2025
e93fceb
Fix schema url and test, now that we proved it works
jsuereth Jun 21, 2025
96218f7
Initial cut at moving Entity SDK to have correpsonding API.
jsuereth Jul 5, 2025
1147733
Further simplify the API and SDK for entities
jsuereth Jul 5, 2025
1807b62
Wire ResourceProvider in end-to-end test with new incubating Extended…
jsuereth Jul 6, 2025
00829e7
Fix javadoc issues
jsuereth Jul 6, 2025
ecd9c7b
Update exporters/otlp/common/src/main/java/io/opentelemetry/exporter/…
jsuereth Jul 10, 2025
802c056
Update sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLoggerProv…
jsuereth Jul 10, 2025
fed1754
Fixes from review.
jsuereth Jul 10, 2025
6924bf5
Remove methods we don't need yet.
jsuereth Jul 10, 2025
fe34bb1
Remove redundant visibility.
jsuereth Jul 10, 2025
552dea2
More cleanups from review.
jsuereth Jul 10, 2025
92848a4
Simplify prototype of SdkResource.
jsuereth Jul 10, 2025
fa6c704
Fix typo.
jsuereth Jul 10, 2025
698b753
More cleanups from review.
jsuereth Jul 10, 2025
612c2c0
Add more tests for ResourceProvider.
jsuereth Jul 11, 2025
41c92ee
Fix stylecheck.
jsuereth Jul 11, 2025
7a69952
More checkstyle fixes.
jsuereth Jul 11, 2025
30a0fe7
Rename prototype to more closely match OTEP 4316.
jsuereth Jul 11, 2025
f917d9d
Finish remove implementation and listeners.
jsuereth Jul 11, 2025
c5af0ef
Remove assertjs helpers, update javadoc.
jsuereth Jul 11, 2025
c70b63d
Fix entity javadoc.
jsuereth Jul 11, 2025
53ec454
Fix tests.
jsuereth Jul 11, 2025
f66057c
extract extended opentelemetry only
zeitlinger Jul 16, 2025
06590dc
extract extended opentelemetry only
zeitlinger Jul 16, 2025
d5f2ce5
extract extended opentelemetry only
zeitlinger Jul 16, 2025
2ff74e2
return extended otel sdk
zeitlinger Jul 16, 2025
10d7c47
return extended otel sdk
zeitlinger Jul 16, 2025
215f832
return extended otel sdk
zeitlinger Jul 16, 2025
c3e86da
obfuscate sdk config provider
zeitlinger Jul 16, 2025
4b7c986
extended otel must extend otel - because we need AutoConfiguredOpenTe…
zeitlinger Jul 16, 2025
a719606
Remove ExtendedOpenTelemetrySdkBuilder
jack-berg Sep 11, 2025
c272687
Merge branch 'main' of https://github.com/open-telemetry/opentelemetr…
jack-berg Sep 11, 2025
f73aab1
Revise ExtendedOpenTelemetrySdk#toString, make OpenTelemetrySdk metho…
jack-berg Sep 11, 2025
e2584f8
format
zeitlinger Sep 12, 2025
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
@@ -0,0 +1,17 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.api.incubator;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.incubator.config.ConfigProvider;

/** Extension to {@link OpenTelemetry} with experimental APIs. */
public interface ExtendedOpenTelemetry extends OpenTelemetry {
/** Returns the {@link ConfigProvider} for this {@link OpenTelemetry}. */
default ConfigProvider getConfigProvider() {
return ConfigProvider.noop();
}
}
10 changes: 9 additions & 1 deletion docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
Comparing source compatibility of opentelemetry-sdk-1.55.0-SNAPSHOT.jar against opentelemetry-sdk-1.54.0.jar
No changes.
*** MODIFIED CLASS: PUBLIC NON_FINAL (<- FINAL) io.opentelemetry.sdk.OpenTelemetrySdk (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.logs.LoggerProvider getLogsBridge()
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.metrics.MeterProvider getMeterProvider()
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.context.propagation.ContextPropagators getPropagators()
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.logs.SdkLoggerProvider getSdkLoggerProvider()
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.metrics.SdkMeterProvider getSdkMeterProvider()
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.sdk.trace.SdkTracerProvider getSdkTracerProvider()
*** MODIFIED METHOD: PUBLIC FINAL (<- NON_FINAL) io.opentelemetry.api.trace.TracerProvider getTracerProvider()
Copy link
Contributor

Choose a reason for hiding this comment

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

These changes are technically breaking changes, yeah? If someone had implemented their own extension to OpenTelemetrySdk? I don't know how likely that is to be the case, but I could imagine a vendor doing it. How concerned are we about making all of these methods (and the class) final breaking someone's custom implementation?

Copy link
Member Author

Choose a reason for hiding this comment

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

The class was final before, so it was not possible to extend OpenTelemetrySdk before

Copy link
Member

Choose a reason for hiding this comment

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

the class itself was final previously

Copy link
Contributor

Choose a reason for hiding this comment

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

Doesn't that top line in the api diff say it's being made final? Am I reading that wrong?

Copy link
Contributor

Choose a reason for hiding this comment

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

oh! it's the opposite. 🤦🏽

Copy link
Contributor

Choose a reason for hiding this comment

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

So, this, then, I guess, is the only thing that's possible a concern to think about...now people will be able to extend OpenTelemetrySdk, which could potentially cause future breaking changes, if we add methods and they collide with ones that have been added externally. 🤔

Copy link
Member

Choose a reason for hiding this comment

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

That's true. But I believe we're already exposed to similar risk: Consider the OpenTelemetry interface: People can extend it, implement the extended methods, and later we could extend OpenTelemetry with conflicting methods.

Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
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.SdkConfigProvider;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
Expand All @@ -25,15 +28,17 @@ class DeclarativeConfigurationSpiTest {

@Test
void configFromSpi() {
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(
Resource.getDefault().toBuilder().put("service.name", "test").build())
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
.build())
.build();
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()));
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 @@ -33,6 +33,7 @@
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
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.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
Expand Down Expand Up @@ -117,16 +118,6 @@ void configFile_Valid() {
ConfigProperties config =
DefaultConfigProperties.createFromMap(
Collections.singletonMap("otel.experimental.config.file", configFilePath.toString()));
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(
Resource.getDefault().toBuilder().put("service.name", "test").build())
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
.build())
.build();
cleanup.addCloseable(expectedSdk);
AutoConfiguredOpenTelemetrySdkBuilder builder = spy(AutoConfiguredOpenTelemetrySdk.builder());
Thread thread = new Thread();
doReturn(thread).when(builder).shutdownHook(any());
Expand All @@ -135,8 +126,20 @@ void configFile_Valid() {
builder.setConfig(config).build();
cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());

assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString())
.isEqualTo(expectedSdk.toString());
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
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(),
((ExtendedOpenTelemetrySdk) openTelemetrySdk).getSdkConfigProvider());
cleanup.addCloseable(expectedSdk);
assertThat(openTelemetrySdk.toString()).hasToString(expectedSdk.toString());
// AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from
// file
assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk.extension.incubator;

import io.opentelemetry.api.incubator.ExtendedOpenTelemetry;
import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
import java.io.Closeable;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;

/** A new interface for creating OpenTelemetrySdk that supports getting {@link ConfigProvider}. */
public final class ExtendedOpenTelemetrySdk extends OpenTelemetrySdk
implements ExtendedOpenTelemetry, Closeable {

private final OpenTelemetrySdk openTelemetrySdk;
private final ObfuscatedConfigProvider configProvider;

private ExtendedOpenTelemetrySdk(
OpenTelemetrySdk openTelemetrySdk, SdkConfigProvider configProvider) {
super(
openTelemetrySdk.getSdkTracerProvider(),
openTelemetrySdk.getSdkMeterProvider(),
openTelemetrySdk.getSdkLoggerProvider(),
openTelemetrySdk.getPropagators());
this.openTelemetrySdk = openTelemetrySdk;
this.configProvider = new ObfuscatedConfigProvider(configProvider);
}

public static ExtendedOpenTelemetrySdk create(
OpenTelemetrySdk openTelemetrySdk, SdkConfigProvider sdkConfigProvider) {
return new ExtendedOpenTelemetrySdk(openTelemetrySdk, sdkConfigProvider);
}

@Override
public ConfigProvider getConfigProvider() {
return configProvider;
}

/** Returns the {@link SdkConfigProvider} for this {@link ExtendedOpenTelemetrySdk}. */
public SdkConfigProvider getSdkConfigProvider() {
return configProvider.unobfuscate();
}

@Override
public String toString() {
return "ExtendedOpenTelemetrySdk{"
+ "openTelemetrySdk="
+ openTelemetrySdk
+ ", configProvider="
+ configProvider.unobfuscate()
+ "}";
}

/**
* This class allows the SDK to unobfuscate an obfuscated provider.
*
* <p>Static global providers are obfuscated when they are returned from the API to prevent users
* from casting them to their SDK specific implementation. For example, we do not want users to
* use patterns like {@code (SdkConfigProvider) openTelemetry.getConfigProvider()}.
*/
@ThreadSafe
private static class ObfuscatedConfigProvider implements ConfigProvider {

private final SdkConfigProvider delegate;

private ObfuscatedConfigProvider(SdkConfigProvider delegate) {
this.delegate = delegate;
}

@Override
@Nullable
public DeclarativeConfigProperties getInstrumentationConfig() {
return delegate.getInstrumentationConfig();
}

private SdkConfigProvider unobfuscate() {
return delegate;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel;
import io.opentelemetry.sdk.trace.samplers.Sampler;
Expand Down Expand Up @@ -82,7 +83,7 @@ private DeclarativeConfiguration() {}
*
* @throws DeclarativeConfigException if unable to parse or interpret
*/
public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) {
public static ExtendedOpenTelemetrySdk parseAndCreate(InputStream inputStream) {
Copy link
Member

Choose a reason for hiding this comment

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

This is cool - frees up callers from needing to worry about initializing SdkConfigProvider

OpenTelemetryConfigurationModel configurationModel = parse(inputStream);
return create(configurationModel);
}
Expand All @@ -95,7 +96,8 @@ public static OpenTelemetrySdk parseAndCreate(InputStream inputStream) {
* @return the {@link OpenTelemetrySdk}
* @throws DeclarativeConfigException if unable to interpret
*/
public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurationModel) {
public static ExtendedOpenTelemetrySdk create(
OpenTelemetryConfigurationModel configurationModel) {
return create(configurationModel, DEFAULT_COMPONENT_LOADER);
}

Expand All @@ -109,7 +111,7 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat
* @return the {@link OpenTelemetrySdk}
* @throws DeclarativeConfigException if unable to interpret
*/
public static OpenTelemetrySdk create(
public static ExtendedOpenTelemetrySdk create(
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
SpiHelper spiHelper = SpiHelper.create(componentLoader);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.resources.Resource;
import java.util.Objects;
import java.util.regex.Pattern;

final class OpenTelemetryConfigurationFactory
implements Factory<OpenTelemetryConfigurationModel, OpenTelemetrySdk> {
implements Factory<OpenTelemetryConfigurationModel, ExtendedOpenTelemetrySdk> {

private static final Pattern SUPPORTED_FILE_FORMATS = Pattern.compile("^(0.4)|(1.0(-rc.\\d*)?)$");

Expand All @@ -29,8 +30,9 @@ static OpenTelemetryConfigurationFactory getInstance() {
}

@Override
public OpenTelemetrySdk create(
public ExtendedOpenTelemetrySdk create(
OpenTelemetryConfigurationModel model, DeclarativeConfigContext context) {
SdkConfigProvider sdkConfigProvider = SdkConfigProvider.create(model);
OpenTelemetrySdkBuilder builder = OpenTelemetrySdk.builder();
String fileFormat = model.getFileFormat();
if (fileFormat == null || !SUPPORTED_FILE_FORMATS.matcher(fileFormat).matches()) {
Expand All @@ -41,7 +43,7 @@ public OpenTelemetrySdk create(
// behavior for experimental properties.

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

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

return context.addCloseable(builder.build());
OpenTelemetrySdk openTelemetrySdk = context.addCloseable(builder.build());
return ExtendedOpenTelemetrySdk.create(openTelemetrySdk, sdkConfigProvider);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,9 @@ public static SdkConfigProvider create(
public DeclarativeConfigProperties getInstrumentationConfig() {
return instrumentationConfig;
}

@Override
public String toString() {
return "SdkConfigProvider{" + "instrumentationConfig=" + instrumentationConfig + '}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
import io.opentelemetry.common.ComponentLoader;
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.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
Expand Down Expand Up @@ -157,7 +157,7 @@ void create_ModelCustomizer() {
.withProcessors(
Collections.singletonList(
new SpanProcessorModel().withAdditionalProperty("test", null))));
OpenTelemetrySdk sdk =
ExtendedOpenTelemetrySdk sdk =
DeclarativeConfiguration.create(
model,
// customizer is TestDeclarativeConfigurationCustomizerProvider
Expand Down
Loading
Loading