Add support for new system property otel.sdk.disabled (#4810)

* Add support for new system property otel.sdk.disabled

* address review comments
This commit is contained in:
Bruno Baptista 2022-10-03 17:51:57 +01:00 committed by GitHub
parent 093b21085b
commit c37dada000
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 112 additions and 34 deletions

View File

@ -2,6 +2,11 @@
## Unreleased
* Autoconfigure now supports an option to disable the SDK.
If `otel.sdk.disabled=true`, `AutoConfiguredOpenTelemetrySdk#getOpenTelemetrySdk()`
returns a minimal (but not noop) `OpenTelemetrySdk` with noop tracing, metric and logging providers. The same minimal instance is set
to `GlobalOpenTelemetry`. The now deprecated property `otel.experimental.sdk.enabled` will continue to work in the same way during a transition period.
## Version 1.18.0 (2022-09-09)
### SDK

View File

@ -39,9 +39,9 @@ for more details.
The OpenTelemetry SDK can be disabled entirely. If disabled, `AutoConfiguredOpenTelemetrySdk#getOpenTelemetrySdk()` will return a minimally configured instance (i.e. `OpenTelemetrySdk.builder().build()`).
| System property | Environment variable | Purpose |
|-------------------------------|-------------------------------|----------------------------------------------------------------|
| otel.experimental.sdk.enabled | OTEL_EXPERIMENTAL_SDK_ENABLED | If `false`, disable the OpenTelemetry SDK. Defaults to `true`. |
| System property | Environment variable | Purpose |
|-------------------|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| otel.sdk.disabled | OTEL_SDK_DISABLED | If `true`, disable the OpenTelemetry SDK. Defaults to `false`. The now legacy property `otel.experimental.sdk.enabled` will continue to work with default `true` during a transition period. |
## Exporters

View File

@ -33,7 +33,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
@ -333,7 +332,9 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder().build();
boolean sdkEnabled =
Optional.ofNullable(config.getBoolean("otel.experimental.sdk.enabled")).orElse(true);
!config.getBoolean(
"otel.sdk.disabled", !config.getBoolean("otel.experimental.sdk.enabled", true));
if (sdkEnabled) {
SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder();
meterProviderBuilder.setResource(resource);

View File

@ -77,6 +77,52 @@ class AutoConfiguredOpenTelemetrySdkTest {
private AutoConfiguredOpenTelemetrySdkBuilder builder;
private static BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
getTracerProviderBuilderSpy() {
BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
traceCustomizer =
spy(
new BiFunction<
SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>() {
@Override
public SdkTracerProviderBuilder apply(
SdkTracerProviderBuilder builder, ConfigProperties config) {
return builder;
}
});
return traceCustomizer;
}
private static BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>
getMeterProviderBuilderSpy() {
BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>
metricCustomizer =
spy(
new BiFunction<
SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>() {
@Override
public SdkMeterProviderBuilder apply(
SdkMeterProviderBuilder builder, ConfigProperties config) {
return builder;
}
});
return metricCustomizer;
}
private static BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder>
getLoggerProviderBuilderSpy() {
BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder> logCustomizer =
spy(
new BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder>() {
@Override
public SdkLoggerProviderBuilder apply(
SdkLoggerProviderBuilder builder, ConfigProperties config) {
return builder;
}
});
return logCustomizer;
}
@BeforeEach
void resetGlobal() {
GlobalOpenTelemetry.resetForTest();
@ -313,38 +359,13 @@ class AutoConfiguredOpenTelemetrySdkTest {
}
@Test
void disableSdk() {
void disableSdkLegacyProperty() {
BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
traceCustomizer =
spy(
new BiFunction<
SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>() {
@Override
public SdkTracerProviderBuilder apply(
SdkTracerProviderBuilder builder, ConfigProperties config) {
return builder;
}
});
traceCustomizer = getTracerProviderBuilderSpy();
BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>
metricCustomizer =
spy(
new BiFunction<
SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>() {
@Override
public SdkMeterProviderBuilder apply(
SdkMeterProviderBuilder builder, ConfigProperties config) {
return builder;
}
});
metricCustomizer = getMeterProviderBuilderSpy();
BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder> logCustomizer =
spy(
new BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder>() {
@Override
public SdkLoggerProviderBuilder apply(
SdkLoggerProviderBuilder builder, ConfigProperties config) {
return builder;
}
});
getLoggerProviderBuilderSpy();
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
AutoConfiguredOpenTelemetrySdk.builder()
@ -362,6 +383,57 @@ class AutoConfiguredOpenTelemetrySdkTest {
verify(logCustomizer, never()).apply(any(), any());
}
@Test
void disableSdk() {
BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
traceCustomizer = getTracerProviderBuilderSpy();
BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>
metricCustomizer = getMeterProviderBuilderSpy();
BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder> logCustomizer =
getLoggerProviderBuilderSpy();
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
AutoConfiguredOpenTelemetrySdk.builder()
.addPropertiesSupplier(() -> singletonMap("otel.sdk.disabled", "true"))
.addTracerProviderCustomizer(traceCustomizer)
.addMeterProviderCustomizer(metricCustomizer)
.addLoggerProviderCustomizer(logCustomizer)
.build();
assertThat(autoConfiguredSdk.getOpenTelemetrySdk()).isInstanceOf(OpenTelemetrySdk.class);
// When the SDK is disabled, configuration is skipped and none of the customizers are called
verify(traceCustomizer, never()).apply(any(), any());
verify(metricCustomizer, never()).apply(any(), any());
verify(logCustomizer, never()).apply(any(), any());
}
@Test
void disableSdkNewPropertyWins() {
BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
traceCustomizer = getTracerProviderBuilderSpy();
BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>
metricCustomizer = getMeterProviderBuilderSpy();
BiFunction<SdkLoggerProviderBuilder, ConfigProperties, SdkLoggerProviderBuilder> logCustomizer =
getLoggerProviderBuilderSpy();
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
AutoConfiguredOpenTelemetrySdk.builder()
.addPropertiesSupplier(() -> singletonMap("otel.sdk.disabled", "true"))
.addPropertiesSupplier(() -> singletonMap("otel.experimental.sdk.enabled", "true"))
.addTracerProviderCustomizer(traceCustomizer)
.addMeterProviderCustomizer(metricCustomizer)
.addLoggerProviderCustomizer(logCustomizer)
.build();
assertThat(autoConfiguredSdk.getOpenTelemetrySdk()).isInstanceOf(OpenTelemetrySdk.class);
// When the SDK is disabled, configuration is skipped and none of the customizers are called
verify(traceCustomizer, never()).apply(any(), any());
verify(metricCustomizer, never()).apply(any(), any());
verify(logCustomizer, never()).apply(any(), any());
}
@Test
void tracerProviderCustomizer() {
InMemorySpanExporter spanExporter = InMemorySpanExporter.create();