Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 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
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} that supports getting {@link ConfigProvider}. */
Copy link
Member

Choose a reason for hiding this comment

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

Let's keep the language generic enough to support evolving use cases.

Suggested change
/** Extension to {@link OpenTelemetry} that supports getting {@link ConfigProvider}. */
/** Extended {@link OpenTelemetry} with experimental APIs. */

public interface ExtendedOpenTelemetry extends OpenTelemetry {
/** Returns the {@link ConfigProvider} for this {@link OpenTelemetry}. */
default ConfigProvider getConfigProvider() {
return ConfigProvider.noop();
}
}
3 changes: 2 additions & 1 deletion docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
Comparing source compatibility of opentelemetry-sdk-1.53.0-SNAPSHOT.jar against opentelemetry-sdk-1.52.0.jar
No changes.
*** MODIFIED CLASS: PUBLIC NON_FINAL (<- FINAL) io.opentelemetry.sdk.OpenTelemetrySdk (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* 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.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
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 class ExtendedOpenTelemetrySdk extends OpenTelemetrySdk
Copy link
Member

Choose a reason for hiding this comment

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

Alternatively, we could skip extending OpenTelemetrySdk and avoid awkwardness of trying to figure mesh together builder and constructors. OpenTelemetrySdk doesn't do much anyway so not much to repeat.

Maybe do something like have ExtendedOpenTelemetrySdk accept a delegate OpenTelemetrySdk instance during initialization and skip the builder pattern? Usage could be something like:

ExtendedOpenTelemetrySdk sdk = ExtendedOpenTelemetrySdk.create(OpenTelemetrySdk, SdkConfigProvider);

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 goal (IMO) is to have AutoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk() return the instance that we can work with - so that library users don't have to jump through hoops to have the correct instance.

implements ExtendedOpenTelemetry, Closeable {

private final ObfuscatedConfigProvider configProvider;

public ExtendedOpenTelemetrySdk(
SdkTracerProvider tracerProvider,
SdkMeterProvider meterProvider,
SdkLoggerProvider loggerProvider,
ContextPropagators propagators,
SdkConfigProvider configProvider) {
super(tracerProvider, meterProvider, loggerProvider, propagators);
this.configProvider = new ObfuscatedConfigProvider(configProvider);
}

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

/**
* This class allows the SDK to unobfuscate an obfuscated static global 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 (SdkMeterProvider) openTelemetry.getMeterProvider()}.
*/
@ThreadSafe
// Visible for testing
static class ObfuscatedConfigProvider implements ConfigProvider {

private final SdkConfigProvider delegate;

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

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

public SdkConfigProvider unobfuscate() {
return delegate;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk.extension.incubator;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import java.io.Closeable;
import java.util.Objects;
import java.util.function.Consumer;

/** An builder for creating an {@link ExtendedOpenTelemetrySdk} instance. */
public final class ExtendedOpenTelemetrySdkBuilder {
private final SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder();
private final SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder();
private final SdkLoggerProviderBuilder loggerProviderBuilder = SdkLoggerProvider.builder();
private ContextPropagators propagators = ContextPropagators.noop();
private SdkConfigProvider configProvider =
SdkConfigProvider.create(new OpenTelemetryConfigurationModel());
private Consumer<Closeable> closeableConsumer =
closeable -> {
// Default no-op closeable consumer
};

/** Sets the {@link ContextPropagators} to use. */
public ExtendedOpenTelemetrySdkBuilder setPropagators(ContextPropagators propagators) {
this.propagators = Objects.requireNonNull(propagators, "propagators must not be null");
return this;
}

/** Sets the {@link ConfigProvider} to use. */
public ExtendedOpenTelemetrySdkBuilder setConfigProvider(SdkConfigProvider configProvider) {
this.configProvider = Objects.requireNonNull(configProvider, "configProvider must not be null");
return this;
}

public ExtendedOpenTelemetrySdkBuilder setCloseableConsumer(Consumer<Closeable> configurator) {
this.closeableConsumer = Objects.requireNonNull(configurator, "configurator must not be null");
return this;
}

/**
* Applies a consumer callback to configure the TracerProvider being built for this OpenTelemetry.
*
* @param configurator A callback fleshing out tracers.
* @return this
*/
public ExtendedOpenTelemetrySdkBuilder withTracerProvider(
Copy link
Member

Choose a reason for hiding this comment

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

What do we get from these withers?

Copy link
Member Author

Choose a reason for hiding this comment

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

This is from the entity PR where it's actually needed

Consumer<SdkTracerProviderBuilder> configurator) {
configurator.accept(this.tracerProviderBuilder);
return this;
}

/**
* Applies a consumer callback to configure the MeterProvider being built for this OpenTelemetry.
*
* @param configurator A callback fleshing out meters.
* @return this
*/
public ExtendedOpenTelemetrySdkBuilder withMeterProvider(
Consumer<SdkMeterProviderBuilder> configurator) {
configurator.accept(this.meterProviderBuilder);
return this;
}

/**
* Applies a consumer callback to configure the LoggerProvider being built for this OpenTelemetry.
*
* @param configurator A callback fleshing out meters.
* @return this
*/
public ExtendedOpenTelemetrySdkBuilder withLoggerProvider(
Consumer<SdkLoggerProviderBuilder> configurator) {
configurator.accept(this.loggerProviderBuilder);
return this;
}

/**
* Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link
* OpenTelemetrySdkBuilder}. This SDK is not registered as the global {@link
* io.opentelemetry.api.OpenTelemetry}. It is recommended that you register one SDK using {@link
* OpenTelemetrySdkBuilder#buildAndRegisterGlobal()} for use by instrumentation that requires
* access to a global instance of {@link io.opentelemetry.api.OpenTelemetry}.
*
* @see GlobalOpenTelemetry
*/
public ExtendedOpenTelemetrySdk build() {
SdkTracerProvider tracerProvider = tracerProviderBuilder.build();
SdkMeterProvider meterProvider = meterProviderBuilder.build();
SdkLoggerProvider loggerProvider = loggerProviderBuilder.build();
closeableConsumer.accept(tracerProvider);
closeableConsumer.accept(meterProvider);
closeableConsumer.accept(loggerProvider);
ExtendedOpenTelemetrySdk sdk =
new ExtendedOpenTelemetrySdk(
tracerProvider, meterProvider, loggerProvider, propagators, configProvider);
closeableConsumer.accept(sdk);
return sdk;
}

/**
* Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link
* OpenTelemetrySdkBuilder} and registers it as the global {@link
* io.opentelemetry.api.OpenTelemetry}. An exception will be thrown if this method is attempted to
* be called multiple times in the lifecycle of an application - ensure you have only one SDK for
* use as the global instance. If you need to configure multiple SDKs for tests, use {@link
* GlobalOpenTelemetry#resetForTest()} between them.
*
* @see GlobalOpenTelemetry
*/
public ExtendedOpenTelemetrySdk buildAndRegisterGlobal() {
ExtendedOpenTelemetrySdk sdk = build();
GlobalOpenTelemetry.set(sdk);
return sdk;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import io.opentelemetry.common.ComponentLoader;
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
import java.io.Closeable;
Expand Down Expand Up @@ -39,6 +40,10 @@ List<Closeable> getCloseables() {
return Collections.unmodifiableList(closeables);
}

ComponentLoader getComponentLoader() {
return spiHelper.getComponentLoader();
}

/**
* Find a registered {@link ComponentProvider} with {@link ComponentProvider#getType()} matching
* {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link
Expand Down
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 @@ -15,14 +15,12 @@
import io.opentelemetry.sdk.internal.ScopeConfigurator;
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.logs.LogLimits;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
import io.opentelemetry.sdk.logs.internal.LoggerConfig;
import io.opentelemetry.sdk.logs.internal.SdkLoggerProviderUtil;
import java.util.List;

final class LoggerProviderFactory
implements Factory<LoggerProviderAndAttributeLimits, SdkLoggerProviderBuilder> {
final class LoggerProviderFactory {

private static final LoggerProviderFactory INSTANCE = new LoggerProviderFactory();

Expand All @@ -32,14 +30,13 @@ static LoggerProviderFactory getInstance() {
return INSTANCE;
}

@Override
public SdkLoggerProviderBuilder create(
LoggerProviderAndAttributeLimits model, DeclarativeConfigContext context) {
SdkLoggerProviderBuilder builder = SdkLoggerProvider.builder();

public void configure(
SdkLoggerProviderBuilder builder,
LoggerProviderAndAttributeLimits model,
DeclarativeConfigContext context) {
LoggerProviderModel loggerProviderModel = model.getLoggerProvider();
if (loggerProviderModel == null) {
return builder;
return;
}

LogLimits logLimits =
Expand Down Expand Up @@ -84,8 +81,6 @@ public SdkLoggerProviderBuilder create(
}
SdkLoggerProviderUtil.setLoggerConfigurator(builder, configuratorBuilder.build());
}

return builder;
}

private static class LoggerConfigFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,13 @@
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel;
import io.opentelemetry.sdk.internal.ScopeConfigurator;
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import java.util.List;

final class MeterProviderFactory implements Factory<MeterProviderModel, SdkMeterProviderBuilder> {

final class MeterProviderFactory {
private static final MeterProviderFactory INSTANCE = new MeterProviderFactory();

private MeterProviderFactory() {}
Expand All @@ -34,11 +32,8 @@ static MeterProviderFactory getInstance() {
return INSTANCE;
}

@Override
public SdkMeterProviderBuilder create(
MeterProviderModel model, DeclarativeConfigContext context) {
SdkMeterProviderBuilder builder = SdkMeterProvider.builder();

public void configure(
SdkMeterProviderBuilder builder, MeterProviderModel model, DeclarativeConfigContext context) {
List<MetricReaderModel> readerModels = model.getReaders();
if (readerModels != null) {
readerModels.forEach(
Expand Down Expand Up @@ -94,8 +89,6 @@ public SdkMeterProviderBuilder create(
}
SdkMeterProviderUtil.setMeterConfigurator(builder, configuratorBuilder.build());
}

return builder;
}

private static class MeterConfigFactory
Expand Down
Loading
Loading