Skip to content

Commit ef810f9

Browse files
author
Mike Turbe
committed
Use ConditionalOnThreading and replace Java 21 specific virtual thread check
1 parent eaa74f9 commit ef810f9

File tree

5 files changed

+25
-24
lines changed

5 files changed

+25
-24
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfiguration.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,12 @@
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3131
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3232
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
33+
import org.springframework.boot.autoconfigure.condition.ConditionalOnThreading;
34+
import org.springframework.boot.autoconfigure.thread.Threading;
3335
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3436
import org.springframework.context.annotation.Bean;
3537
import org.springframework.core.env.Environment;
38+
import org.springframework.core.task.VirtualThreadTaskExecutor;
3639

3740
/**
3841
* {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to OTLP.
@@ -72,13 +75,19 @@ OtlpConfig otlpConfig(OpenTelemetryProperties openTelemetryProperties,
7275

7376
@Bean
7477
@ConditionalOnMissingBean
75-
public OtlpMeterRegistry otlpMeterRegistry(OtlpConfig otlpConfig, Clock clock) {
76-
if (this.properties.isVirtualThreadsEnabled()) {
77-
return new OtlpMeterRegistry(otlpConfig, clock, Thread.ofVirtual().factory());
78-
}
78+
@ConditionalOnThreading(Threading.PLATFORM)
79+
public OtlpMeterRegistry otlpMeterRegistryPlatformThreads(OtlpConfig otlpConfig, Clock clock) {
7980
return new OtlpMeterRegistry(otlpConfig, clock);
8081
}
8182

83+
@Bean
84+
@ConditionalOnMissingBean
85+
@ConditionalOnThreading(Threading.VIRTUAL)
86+
public OtlpMeterRegistry otlpMeterRegistryVirtualThreads(OtlpConfig otlpConfig, Clock clock) {
87+
VirtualThreadTaskExecutor taskExecutor = new VirtualThreadTaskExecutor("otlp-meter-registry");
88+
return new OtlpMeterRegistry(otlpConfig, clock, taskExecutor.getVirtualThreadFactory());
89+
}
90+
8291
/**
8392
* Adapts {@link OtlpProperties} to {@link OtlpMetricsConnectionDetails}.
8493
*/

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpProperties.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,4 @@ public void setBaseTimeUnit(TimeUnit baseTimeUnit) {
151151
this.baseTimeUnit = baseTimeUnit;
152152
}
153153

154-
public boolean isVirtualThreadsEnabled() {
155-
return this.virtualThreadsEnabled;
156-
}
157-
158-
public void setVirtualThreadsEnabled(boolean virtualThreadsEnabled) {
159-
this.virtualThreadsEnabled = virtualThreadsEnabled;
160-
}
161-
162154
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpMetricsExportAutoConfigurationTests.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import io.micrometer.registry.otlp.OtlpConfig;
2323
import io.micrometer.registry.otlp.OtlpMeterRegistry;
2424
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.api.condition.EnabledForJreRange;
26+
import org.junit.jupiter.api.condition.JRE;
2527

2628
import org.springframework.boot.actuate.autoconfigure.metrics.export.otlp.OtlpMetricsExportAutoConfiguration.PropertiesOtlpMetricsConnectionDetails;
2729
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -83,8 +85,6 @@ void allowsCustomConfigToBeUsed() {
8385
void allowsPlatformThreadsToBeUsed() {
8486
this.contextRunner.withUserConfiguration(BaseConfiguration.class).run((context) -> {
8587
assertThat(context).hasSingleBean(OtlpMeterRegistry.class);
86-
OtlpProperties properties = context.getBean(OtlpProperties.class);
87-
assertThat(properties.isVirtualThreadsEnabled()).isFalse();
8888
OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class);
8989
assertThat(registry).extracting("scheduledExecutorService")
9090
.satisfies((executor) -> ScheduledExecutorServiceAssert.assertThat((ScheduledExecutorService) executor)
@@ -93,13 +93,12 @@ void allowsPlatformThreadsToBeUsed() {
9393
}
9494

9595
@Test
96+
@EnabledForJreRange(min = JRE.JAVA_21)
9697
void allowsVirtualThreadsToBeUsed() {
9798
this.contextRunner.withUserConfiguration(BaseConfiguration.class)
98-
.withPropertyValues("management.otlp.metrics.export.virtualThreadsEnabled=true")
99+
.withPropertyValues("spring.threads.virtual.enabled=true")
99100
.run((context) -> {
100101
assertThat(context).hasSingleBean(OtlpMeterRegistry.class);
101-
OtlpProperties properties = context.getBean(OtlpProperties.class);
102-
assertThat(properties.isVirtualThreadsEnabled()).isTrue();
103102
OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class);
104103
assertThat(registry).extracting("scheduledExecutorService")
105104
.satisfies(

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/otlp/OtlpPropertiesTests.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,4 @@ void defaultValuesAreConsistent() {
4343
assertThat(properties.getBaseTimeUnit()).isSameAs(config.baseTimeUnit());
4444
}
4545

46-
@Test
47-
void virtualThreadsDisabledByDefault() {
48-
OtlpProperties properties = new OtlpProperties();
49-
assertThat(properties.isVirtualThreadsEnabled()).isFalse();
50-
}
51-
5246
}

spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/assertj/ScheduledExecutorServiceAssert.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,14 @@ public ScheduledExecutorServiceAssert usesVirtualThreads() {
6565

6666
private boolean producesVirtualThreads() {
6767
try {
68-
return this.actual.schedule(() -> Thread.currentThread().isVirtual(), 0, TimeUnit.SECONDS).get();
68+
return this.actual.schedule(() -> {
69+
// https://openjdk.org/jeps/444
70+
// jep 444 specifies that virtual threads will belong to
71+
// a special thread group given the name "VirtualThreads"
72+
ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
73+
String threadGroupName = (threadGroup != null) ? threadGroup.getName() : "";
74+
return threadGroupName.equalsIgnoreCase("VirtualThreads");
75+
}, 0, TimeUnit.SECONDS).get();
6976
}
7077
catch (InterruptedException | ExecutionException ex) {
7178
throw new AssertionError(ex);

0 commit comments

Comments
 (0)