Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
ca86d38
Reboot the entity prototype
jsuereth Jun 18, 2025
8332527
Add base entity class, merge logic and test
jsuereth Jun 19, 2025
03dbbca
Move Entity and EntityBuilder to be pure interfaces
jsuereth Jun 19, 2025
91ca94e
Add more merge helper methods and tests
jsuereth Jun 19, 2025
76a3f58
Added test for merging raw attributes
jsuereth Jun 19, 2025
a81e3c7
Cleanups and reverting silly changes
jsuereth Jun 19, 2025
0a94cd0
fix minor style issue
jsuereth Jun 19, 2025
4a76e96
Actually wire entities into resource
jsuereth Jun 20, 2025
bc8ae3c
Fix typo
jsuereth Jun 20, 2025
5bd41b0
Remove all publicly accessible references to Entity from stable packages
jsuereth Jun 20, 2025
79947a4
Add incubating EntityProvider API for specification work
jsuereth Jun 20, 2025
a89a46a
Fix refactoring that broke reflection.
jsuereth Jun 21, 2025
95819a8
Fix schema url and test, now that we proved it works
jsuereth Jun 21, 2025
d2c60ff
Initial cut at moving Entity SDK to have correpsonding API.
jsuereth Jul 5, 2025
65f6aac
Further simplify the API and SDK for entities
jsuereth Jul 5, 2025
cefc969
Wire ResourceProvider in end-to-end test with new incubating Extended…
jsuereth Jul 6, 2025
7cfe2cd
Fix javadoc issues
jsuereth Jul 6, 2025
dd932a4
Update exporters/otlp/common/src/main/java/io/opentelemetry/exporter/…
jsuereth Jul 10, 2025
7002eb8
Update sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLoggerProv…
jsuereth Jul 10, 2025
7290ffe
Fixes from review.
jsuereth Jul 10, 2025
eef3d1c
Remove methods we don't need yet.
jsuereth Jul 10, 2025
8083bc1
Remove redundant visibility.
jsuereth Jul 10, 2025
4eeb37f
More cleanups from review.
jsuereth Jul 10, 2025
a2d6bd4
Simplify prototype of SdkResource.
jsuereth Jul 10, 2025
c98012b
Fix typo.
jsuereth Jul 10, 2025
a56e365
More cleanups from review.
jsuereth Jul 10, 2025
48016b0
Add more tests for ResourceProvider.
jsuereth Jul 11, 2025
ad49269
Fix stylecheck.
jsuereth Jul 11, 2025
993c55d
More checkstyle fixes.
jsuereth Jul 11, 2025
dd0c1f3
Rename prototype to more closely match OTEP 4316.
jsuereth Jul 11, 2025
de5763a
Finish remove implementation and listeners.
jsuereth Jul 11, 2025
0e731fa
Remove assertjs helpers, update javadoc.
jsuereth Jul 11, 2025
b1c61a2
Fix entity javadoc.
jsuereth Jul 11, 2025
3336a0a
Fix tests.
jsuereth Jul 11, 2025
2c87949
extract extended opentelemetry only
zeitlinger Jul 16, 2025
146147f
extract extended opentelemetry only
zeitlinger Jul 16, 2025
4091afa
extract extended opentelemetry only
zeitlinger Jul 16, 2025
9b84e85
no api changes
zeitlinger Jul 18, 2025
df73512
no problematic api changes
zeitlinger Jul 18, 2025
176c981
no problematic api changes
zeitlinger Jul 18, 2025
3a7a05a
fix architecture test
zeitlinger Jul 18, 2025
fb76612
fix architecture test
zeitlinger Jul 18, 2025
953d4b1
fix architecture test
zeitlinger Jul 18, 2025
db73c1c
format
zeitlinger Jul 18, 2025
bc251c7
fix module error
zeitlinger Jul 18, 2025
a812460
fix test
zeitlinger Jul 18, 2025
920f158
fix test
zeitlinger Jul 18, 2025
3d792ff
fix test
zeitlinger Jul 18, 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
4 changes: 4 additions & 0 deletions all/src/test/java/io/opentelemetry/all/SdkDesignTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ public boolean test(JavaMethod input) {
parents.addAll(input.getOwner().getAllRawInterfaces());

for (JavaClass parent : parents) {
if (parent.getPackageName().contains(".internal.")) {
continue;
}

Optional<JavaMethod> found = parent.tryGetMethod(name, paramsType);
if (found.isPresent()) {
return true;
Expand Down
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}. */
public interface ExtendedOpenTelemetry extends OpenTelemetry {
/** Returns the {@link ConfigProvider} for this {@link OpenTelemetry}. */
default ConfigProvider getConfigProvider() {
return ConfigProvider.noop();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,11 @@
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.extension.incubator.fileconfig.DeclarativeConfiguration;
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;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
Expand Down Expand Up @@ -114,19 +117,22 @@ void configFile_fileNotFound() {
}

@Test
void configFile_Valid() {
void configFile_Valid() throws IOException {
ConfigProperties config =
DefaultConfigProperties.createFromMap(
Collections.singletonMap("otel.experimental.config.file", configFilePath.toString()));
OpenTelemetryConfigurationModel model =
DeclarativeConfiguration.parse(Files.newInputStream(configFilePath.toFile().toPath()));
OpenTelemetrySdk expectedSdk =
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.setResource(
Resource.getDefault().toBuilder().put("service.name", "test").build())
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
.build())
ExtendedOpenTelemetrySdk.builder()
.setConfigProvider(SdkConfigProvider.create(model))
.withTracerProvider(
b ->
b.setResource(
Resource.getDefault().toBuilder().put("service.name", "test").build())
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())))
.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
@@ -0,0 +1,34 @@
/*
* 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.sdk.OpenTelemetrySdk;
import java.io.Closeable;
import java.lang.reflect.Field;
import javax.annotation.Nullable;

/** A new interface for creating OpenTelemetrySdk that supports getting {@link ConfigProvider}. */
public interface ExtendedOpenTelemetrySdk extends ExtendedOpenTelemetry, Closeable {
/** Returns a builder for {@link ExtendedOpenTelemetrySdk}. */
static ExtendedOpenTelemetrySdkBuilder builder() {
return new ExtendedOpenTelemetrySdkBuilder();
}

@Nullable
static ExtendedOpenTelemetrySdk fromOpenTelemetrySdk(OpenTelemetrySdk openTelemetry) {
try {
Class<?> sdk = Class.forName("io.opentelemetry.sdk.OpenTelemetrySdk");
Field extendedOpenTelemetrySdk = sdk.getDeclaredField("extendedOpenTelemetrySdk");
extendedOpenTelemetrySdk.setAccessible(true);
return (ExtendedOpenTelemetrySdk) extendedOpenTelemetrySdk.get(openTelemetry);
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
throw new IllegalStateException(
"Cannot create ExtendedOpenTelemetrySdk from OpenTelemetrySdk", e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
/*
* 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.internal.shutdown.WithShutdown;
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.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
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 ConfigProvider 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(ConfigProvider 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(
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 OpenTelemetrySdk build() {
SdkTracerProvider tracerProvider = tracerProviderBuilder.build();
SdkMeterProvider meterProvider = meterProviderBuilder.build();
SdkLoggerProvider loggerProvider = loggerProviderBuilder.build();
closeableConsumer.accept(tracerProvider);
closeableConsumer.accept(meterProvider);
closeableConsumer.accept(loggerProvider);
ObfuscatedExtendedOpenTelemetrySdk extendedOpenTelemetrySdk =
new ObfuscatedExtendedOpenTelemetrySdk(
configProvider, tracerProvider, meterProvider, loggerProvider, propagators);
closeableConsumer.accept(extendedOpenTelemetrySdk);

OpenTelemetrySdkBuilder builder =
OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.setMeterProvider(meterProvider)
.setLoggerProvider(loggerProvider)
.setPropagators(propagators);

try {
Method setExtendedOpenTelemetrySdk =
builder.getClass().getDeclaredMethod("setExtendedOpenTelemetrySdk", WithShutdown.class);
setExtendedOpenTelemetrySdk.setAccessible(true);
setExtendedOpenTelemetrySdk.invoke(builder, extendedOpenTelemetrySdk);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("unable to set extended OpenTelemetry SDK", e);
}

return builder.build();
}

/**
* 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 OpenTelemetrySdk buildAndRegisterGlobal() {
OpenTelemetrySdk sdk = build();
GlobalOpenTelemetry.set(sdk);
return sdk;
}
}
Loading
Loading