Provide a way to register / skip the shutdown hook in AutoConfiguredOpenTelemetrySdkBuilder (#4072)
This commit is contained in:
parent
89a6ff24cb
commit
7b570f53ce
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue