Skip to content

Commit 78f8142

Browse files
committed
use spring shutdown hook
1 parent a95a41a commit 78f8142

File tree

4 files changed

+46
-15
lines changed

4 files changed

+46
-15
lines changed

instrumentation/runtime-telemetry/runtime-telemetry-java17/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java17/RuntimeMetricsBuilder.java

+18-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Arrays;
1313
import java.util.EnumMap;
1414
import java.util.List;
15+
import java.util.function.Consumer;
1516
import javax.annotation.Nullable;
1617

1718
/** Builder for {@link RuntimeMetrics}. */
@@ -23,6 +24,10 @@ public final class RuntimeMetricsBuilder {
2324

2425
private boolean disableJmx = false;
2526
private boolean enableExperimentalJmxTelemetry = false;
27+
private Consumer<Runnable> shutdownHook =
28+
runnable -> {
29+
Runtime.getRuntime().addShutdownHook(new Thread(runnable));
30+
};
2631

2732
RuntimeMetricsBuilder(OpenTelemetry openTelemetry) {
2833
this.openTelemetry = openTelemetry;
@@ -82,6 +87,13 @@ public RuntimeMetricsBuilder enableExperimentalJmxTelemetry() {
8287
return this;
8388
}
8489

90+
/** Set a custom shutdown hook for the {@link RuntimeMetrics}. */
91+
@CanIgnoreReturnValue
92+
public RuntimeMetricsBuilder setShutdownHook(Consumer<Runnable> shutdownHook) {
93+
this.shutdownHook = shutdownHook;
94+
return this;
95+
}
96+
8597
public void startFromInstrumentationConfig(InstrumentationConfig config) {
8698
/*
8799
By default, don't use any JFR metrics. May change this once semantic conventions are updated.
@@ -106,16 +118,17 @@ public void startFromInstrumentationConfig(InstrumentationConfig config) {
106118
this.enableExperimentalJmxTelemetry();
107119
}
108120

109-
RuntimeMetrics finalJfrTelemetry = this.build();
110-
Thread cleanupTelemetry = new Thread(finalJfrTelemetry::close);
111-
Runtime.getRuntime().addShutdownHook(cleanupTelemetry);
121+
RuntimeMetrics runtimeMetrics = this.build();
122+
shutdownHook.accept(runtimeMetrics::close);
112123
}
113124

114125
/** Build and start an {@link RuntimeMetrics} with the config from this builder. */
115126
public RuntimeMetrics build() {
116127
List<AutoCloseable> observables =
117-
JmxRuntimeMetricsFactory.buildObservables(
118-
openTelemetry, disableJmx, enableExperimentalJmxTelemetry);
128+
disableJmx
129+
? List.of()
130+
: JmxRuntimeMetricsFactory.buildObservables(
131+
openTelemetry, enableExperimentalJmxTelemetry);
119132
RuntimeMetrics.JfrRuntimeMetrics jfrRuntimeMetrics = buildJfrMetrics();
120133
return new RuntimeMetrics(openTelemetry, observables, jfrRuntimeMetrics);
121134
}

instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/RuntimeMetricsBuilder.java

+15-5
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@
1010
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
1111
import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.JmxRuntimeMetricsFactory;
1212
import java.util.List;
13+
import java.util.function.Consumer;
1314

1415
/** Builder for {@link RuntimeMetrics}. */
1516
public final class RuntimeMetricsBuilder {
1617

1718
private final OpenTelemetry openTelemetry;
1819

1920
private boolean enableExperimentalJmxTelemetry = false;
21+
private Consumer<Runnable> shutdownHook =
22+
runnable -> {
23+
Runtime.getRuntime().addShutdownHook(new Thread(runnable));
24+
};
2025

2126
RuntimeMetricsBuilder(OpenTelemetry openTelemetry) {
2227
this.openTelemetry = openTelemetry;
@@ -32,11 +37,17 @@ public RuntimeMetricsBuilder enableExperimentalJmxTelemetry() {
3237
/** Build and start an {@link RuntimeMetrics} with the config from this builder. */
3338
public RuntimeMetrics build() {
3439
List<AutoCloseable> observables =
35-
JmxRuntimeMetricsFactory.buildObservables(
36-
openTelemetry, false, enableExperimentalJmxTelemetry);
40+
JmxRuntimeMetricsFactory.buildObservables(openTelemetry, enableExperimentalJmxTelemetry);
3741
return new RuntimeMetrics(observables);
3842
}
3943

44+
/** Set a custom shutdown hook for the {@link RuntimeMetrics}. */
45+
@CanIgnoreReturnValue
46+
public RuntimeMetricsBuilder setShutdownHook(Consumer<Runnable> shutdownHook) {
47+
this.shutdownHook = shutdownHook;
48+
return this;
49+
}
50+
4051
public void startFromInstrumentationConfig(InstrumentationConfig config) {
4152
/*
4253
By default, don't use any JFR metrics. May change this once semantic conventions are updated.
@@ -53,8 +64,7 @@ public void startFromInstrumentationConfig(InstrumentationConfig config) {
5364
this.enableExperimentalJmxTelemetry();
5465
}
5566

56-
RuntimeMetrics finalJfrTelemetry = this.build();
57-
Thread cleanupTelemetry = new Thread(finalJfrTelemetry::close);
58-
Runtime.getRuntime().addShutdownHook(cleanupTelemetry);
67+
RuntimeMetrics runtimeMetrics = this.build();
68+
shutdownHook.accept(runtimeMetrics::close);
5969
}
6070
}

instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/JmxRuntimeMetricsFactory.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import io.opentelemetry.instrumentation.runtimemetrics.java8.MemoryPools;
1313
import io.opentelemetry.instrumentation.runtimemetrics.java8.Threads;
1414
import java.util.ArrayList;
15-
import java.util.Collections;
1615
import java.util.List;
1716

1817
/**
@@ -22,10 +21,7 @@
2221
public class JmxRuntimeMetricsFactory {
2322
@SuppressWarnings("CatchingUnchecked")
2423
public static List<AutoCloseable> buildObservables(
25-
OpenTelemetry openTelemetry, boolean disableJmx, boolean enableExperimentalJmxTelemetry) {
26-
if (disableJmx) {
27-
return Collections.emptyList();
28-
}
24+
OpenTelemetry openTelemetry, boolean enableExperimentalJmxTelemetry) {
2925
try {
3026
// Set up metrics gathered by JMX
3127
List<AutoCloseable> observables = new ArrayList<>();

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/instrumentation/runtimemetrics/RuntimeMetricsAutoConfiguration.java

+12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.ConditionalOnEnabledInstrumentation;
1010
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.ConfigPropertiesBridge;
1111
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
12+
import javax.annotation.PreDestroy;
1213
import org.slf4j.Logger;
1314
import org.slf4j.LoggerFactory;
1415
import org.springframework.boot.context.event.ApplicationReadyEvent;
@@ -29,6 +30,15 @@ public class RuntimeMetricsAutoConfiguration {
2930
private static final Logger logger =
3031
LoggerFactory.getLogger(RuntimeMetricsAutoConfiguration.class);
3132

33+
private Runnable shutdownHook;
34+
35+
@PreDestroy
36+
public void stopMetrics() {
37+
if (shutdownHook != null) {
38+
shutdownHook.run();
39+
}
40+
}
41+
3242
@EventListener
3343
public void handleApplicationReadyEvent(ApplicationReadyEvent event) {
3444
ConfigurableApplicationContext applicationContext = event.getApplicationContext();
@@ -39,10 +49,12 @@ public void handleApplicationReadyEvent(ApplicationReadyEvent event) {
3949
if (Double.parseDouble(System.getProperty("java.specification.version")) >= 17) {
4050
logger.debug("Use runtime metrics instrumentation for Java 17+");
4151
io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics.builder(openTelemetry)
52+
.setShutdownHook(runnable -> shutdownHook = runnable)
4253
.startFromInstrumentationConfig(config);
4354
} else {
4455
logger.debug("Use runtime metrics instrumentation for Java 8");
4556
io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics.builder(openTelemetry)
57+
.setShutdownHook(runnable -> shutdownHook = runnable)
4658
.startFromInstrumentationConfig(config);
4759
}
4860
}

0 commit comments

Comments
 (0)