Skip to content

Commit 4e4e550

Browse files
committed
extract metrics providers
1 parent 7c68b99 commit 4e4e550

File tree

6 files changed

+98
-10
lines changed

6 files changed

+98
-10
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics;
2+
3+
import io.opentelemetry.api.OpenTelemetry;
4+
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
5+
import io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import java.util.function.Consumer;
9+
10+
/**
11+
* Configures runtime metrics collection for Java 17+.
12+
*
13+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
14+
* at any time.
15+
*/
16+
public class Java17RuntimeMetricsProvider implements RuntimeMetricsProvider {
17+
private static final Logger logger = LoggerFactory.getLogger(Java17RuntimeMetricsProvider.class);
18+
19+
@Override
20+
public int minJavaVersion() {
21+
return 17;
22+
}
23+
24+
@Override
25+
public void start(
26+
OpenTelemetry openTelemetry, Consumer<Runnable> shutdownHook, InstrumentationConfig config) {
27+
logger.debug("Use runtime metrics instrumentation for Java 17+");
28+
RuntimeMetrics.builder(openTelemetry)
29+
.setShutdownHook(shutdownHook)
30+
.startFromInstrumentationConfig(config);
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics;
2+
3+
import io.opentelemetry.api.OpenTelemetry;
4+
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
5+
import io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics;
6+
import java.util.function.Consumer;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
/**
11+
* Configures runtime metrics collection for Java 8.
12+
*
13+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
14+
* at any time.
15+
*/
16+
public class Java8RuntimeMetricsProvider implements RuntimeMetricsProvider {
17+
private static final Logger logger = LoggerFactory.getLogger(Java8RuntimeMetricsProvider.class);
18+
19+
@Override
20+
public int minJavaVersion() {
21+
return 1;
22+
}
23+
24+
@Override
25+
public void start(
26+
OpenTelemetry openTelemetry, Consumer<Runnable> shutdownHook, InstrumentationConfig config) {
27+
logger.debug("Use runtime metrics instrumentation for Java 8");
28+
RuntimeMetrics.builder(openTelemetry)
29+
.setShutdownHook(shutdownHook)
30+
.startFromInstrumentationConfig(config);
31+
}
32+
}

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

+12-9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
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 java.util.Comparator;
13+
import java.util.Optional;
1214
import javax.annotation.PreDestroy;
1315
import org.slf4j.Logger;
1416
import org.slf4j.LoggerFactory;
@@ -46,16 +48,17 @@ public void handleApplicationReadyEvent(ApplicationReadyEvent event) {
4648
ConfigPropertiesBridge config =
4749
new ConfigPropertiesBridge(applicationContext.getBean(ConfigProperties.class));
4850

49-
if (Double.parseDouble(System.getProperty("java.specification.version")) >= 17) {
50-
logger.debug("Use runtime metrics instrumentation for Java 17+");
51-
io.opentelemetry.instrumentation.runtimemetrics.java17.RuntimeMetrics.builder(openTelemetry)
52-
.setShutdownHook(runnable -> shutdownHook = runnable)
53-
.startFromInstrumentationConfig(config);
51+
double version = Double.parseDouble(System.getProperty("java.specification.version"));
52+
Optional<RuntimeMetricsProvider> metricsProvider =
53+
applicationContext.getBeanProvider(RuntimeMetricsProvider.class).stream()
54+
.sorted(Comparator.comparing(RuntimeMetricsProvider::minJavaVersion).reversed())
55+
.filter(provider -> provider.minJavaVersion() <= version)
56+
.findFirst();
57+
58+
if (metricsProvider.isPresent()) {
59+
metricsProvider.get().start(openTelemetry, runnable -> shutdownHook = runnable, config);
5460
} else {
55-
logger.debug("Use runtime metrics instrumentation for Java 8");
56-
io.opentelemetry.instrumentation.runtimemetrics.java8.RuntimeMetrics.builder(openTelemetry)
57-
.setShutdownHook(runnable -> shutdownHook = runnable)
58-
.startFromInstrumentationConfig(config);
61+
logger.debug("No runtime metrics instrumentation available for Java {}", version);
5962
}
6063
}
6164
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics;
2+
3+
import io.opentelemetry.api.OpenTelemetry;
4+
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
5+
import java.util.function.Consumer;
6+
7+
/**
8+
* Configures runtime metrics collection.
9+
*
10+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
11+
* at any time.
12+
*/
13+
public interface RuntimeMetricsProvider {
14+
int minJavaVersion();
15+
16+
void start(OpenTelemetry openTelemetry, Consumer<Runnable> shutdownHook, InstrumentationConfig config);
17+
}

instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.w
1111
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webflux.SpringWebfluxInstrumentationAutoConfiguration,\
1212
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc.SpringWebMvc5InstrumentationAutoConfiguration,\
1313
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.scheduling.SpringSchedulingInstrumentationAutoConfiguration,\
14-
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration
14+
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration,\
15+
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider,\
16+
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider
1517

1618
org.springframework.context.ApplicationListener=\
1719
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.logging.LogbackAppenderApplicationListener

instrumentation/spring/spring-boot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

+2
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.w
1212
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.webmvc.SpringWebMvc6InstrumentationAutoConfiguration
1313
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.scheduling.SpringSchedulingInstrumentationAutoConfiguration
1414
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.RuntimeMetricsAutoConfiguration
15+
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java8RuntimeMetricsProvider
16+
io.opentelemetry.instrumentation.spring.autoconfigure.internal.instrumentation.runtimemetrics.Java17RuntimeMetricsProvider

0 commit comments

Comments
 (0)