-
Notifications
You must be signed in to change notification settings - Fork 906
Extended opentelemetry #7496
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Extended opentelemetry #7496
Changes from all commits
4e5b156
869b4d8
9f9dc92
fb8e571
f182ad2
30c578a
01a9383
fb08d7d
1f00dcb
cfd444b
0e0bc4e
c8bfbd4
e93fceb
96218f7
1147733
1807b62
00829e7
ecd9c7b
802c056
fed1754
6924bf5
fe34bb1
552dea2
92848a4
fa6c704
698b753
612c2c0
41c92ee
7a69952
30a0fe7
f917d9d
c5af0ef
c70b63d
53ec454
f66057c
06590dc
d5f2ce5
2ff74e2
10d7c47
215f832
c3e86da
4b7c986
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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 |
---|---|---|
@@ -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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The goal (IMO) is to have |
||
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( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What do we get from these withers? There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 |
---|---|---|
|
@@ -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; | ||
|
@@ -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) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is cool - frees up callers from needing to worry about initializing |
||
OpenTelemetryConfigurationModel configurationModel = parse(inputStream); | ||
return create(configurationModel); | ||
} | ||
|
@@ -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); | ||
} | ||
|
||
|
@@ -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); | ||
|
||
|
There was a problem hiding this comment.
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.