Provide a way to register / skip the shutdown hook in AutoConfiguredOpenTelemetrySdkBuilder (#4072)

This commit is contained in:
Roberto Cortez 2022-01-11 17:46:53 +00:00 committed by GitHub
parent 89a6ff24cb
commit 7b570f53ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 12 deletions

View File

@ -16,6 +16,7 @@ import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.resources.Resource;
@ -23,10 +24,13 @@ import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.concurrent.TimeUnit;
import java.util.function.BiFunction;
import java.util.function.Supplier;
import java.util.logging.Level;
@ -61,6 +65,8 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
private ClassLoader serviceClassLoader =
AutoConfiguredOpenTelemetrySdkBuilder.class.getClassLoader();
private boolean registerShutdownHook = true;
private boolean setResultAsGlobal = true;
private boolean customized;
@ -170,6 +176,22 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
return this;
}
/**
* Control the registration of a shutdown hook to shut down the SDK when appropriate. By default,
* the shutdown hook is registered.
*
* <p>Skipping the registration of the shutdown hook may cause unexpected behavior. This
* configuration is for SDK consumers that require control over the SDK lifecycle. In this case,
* alternatives must be provided by the SDK consumer to shut down the SDK.
*
* @param registerShutdownHook a boolean <code>true</code> will register the hook, otherwise
* <code>false</code> will skip registration.
*/
public AutoConfiguredOpenTelemetrySdkBuilder registerShutdownHook(boolean registerShutdownHook) {
this.registerShutdownHook = registerShutdownHook;
return this;
}
/**
* Sets whether the configured {@link OpenTelemetrySdk} should be set as the application's
* {@linkplain io.opentelemetry.api.GlobalOpenTelemetry global} instance.
@ -224,6 +246,21 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
LogEmitterProviderConfiguration.configureLogEmitterProvider(
resource, config, meterProvider);
if (registerShutdownHook) {
Runtime.getRuntime()
.addShutdownHook(
new Thread(
() -> {
List<CompletableResultCode> shutdown = new ArrayList<>();
shutdown.add(tracerProvider.shutdown());
if (meterProvider instanceof SdkMeterProvider) {
shutdown.add(((SdkMeterProvider) meterProvider).shutdown());
}
shutdown.add(logEmitterProvider.shutdown());
CompletableResultCode.ofAll(shutdown).join(10, TimeUnit.SECONDS);
}));
}
ContextPropagators propagators =
PropagatorConfiguration.configurePropagators(
config, serviceClassLoader, propagatorCustomizer);

View File

@ -31,9 +31,7 @@ final class LogEmitterProviderConfiguration {
configureLogProcessors(exportersByName).forEach(builder::addLogProcessor);
SdkLogEmitterProvider logEmitterProvider = builder.build();
Runtime.getRuntime().addShutdownHook(new Thread(logEmitterProvider::close));
return logEmitterProvider;
return builder.build();
}
// Visible for testing

View File

@ -51,12 +51,7 @@ final class MeterProviderConfiguration {
MetricExporterConfiguration.configureExporter(
exporterName, config, serviceClassLoader, meterProviderBuilder);
SdkMeterProvider meterProvider = meterProviderBuilder.build();
// Make sure metrics shut down when JVM shuts down.
Runtime.getRuntime().addShutdownHook(new Thread(meterProvider::close));
return meterProvider;
return meterProviderBuilder.build();
}
private MeterProviderConfiguration() {}

View File

@ -63,9 +63,7 @@ final class TracerProviderConfiguration {
configureSpanProcessors(config, exportersByName)
.forEach(tracerProviderBuilder::addSpanProcessor);
SdkTracerProvider tracerProvider = tracerProviderBuilder.build();
Runtime.getRuntime().addShutdownHook(new Thread(tracerProvider::close));
return tracerProvider;
return tracerProviderBuilder.build();
}
static List<SpanProcessor> configureSpanProcessors(