Skip to content

Commit 11311db

Browse files
committed
Register task executor metrics when using lazy init
Fixes gh-37832
1 parent 1acb02d commit 11311db

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/task/TaskExecutorMetricsAutoConfiguration.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2022 the original author or authors.
2+
* Copyright 2012-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
2525
import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics;
2626

2727
import org.springframework.beans.factory.annotation.Autowired;
28+
import org.springframework.boot.LazyInitializationExcludeFilter;
2829
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
2930
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
3031
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -33,6 +34,7 @@
3334
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3435
import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
3536
import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
37+
import org.springframework.context.annotation.Bean;
3638
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
3739
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
3840

@@ -63,6 +65,11 @@ else if (executor instanceof ThreadPoolTaskScheduler) {
6365
});
6466
}
6567

68+
@Bean
69+
static LazyInitializationExcludeFilter eagerTaskExecutorMetrics() {
70+
return LazyInitializationExcludeFilter.forBeanTypes(TaskExecutorMetricsAutoConfiguration.class);
71+
}
72+
6673
private void monitor(MeterRegistry registry, ThreadPoolExecutor threadPoolExecutor, String name) {
6774
if (threadPoolExecutor != null) {
6875
new ExecutorServiceMetrics(threadPoolExecutor, name, Collections.emptyList()).bindTo(registry);

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/task/TaskExecutorMetricsAutoConfigurationTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.micrometer.core.instrument.search.MeterNotFoundException;
2525
import org.junit.jupiter.api.Test;
2626

27+
import org.springframework.boot.LazyInitializationBeanFactoryPostProcessor;
2728
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
2829
import org.springframework.boot.autoconfigure.AutoConfigurations;
2930
import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
@@ -64,6 +65,21 @@ void taskExecutorUsingAutoConfigurationIsInstrumented() {
6465
});
6566
}
6667

68+
@Test
69+
void taskExecutorIsInstrumentedWhenUsingLazyInitialization() {
70+
this.contextRunner.withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class))
71+
.withBean(LazyInitializationBeanFactoryPostProcessor.class)
72+
.run((context) -> {
73+
MeterRegistry registry = context.getBean(MeterRegistry.class);
74+
Collection<FunctionCounter> meters = registry.get("executor.completed").functionCounters();
75+
assertThat(meters).singleElement()
76+
.satisfies(
77+
(meter) -> assertThat(meter.getId().getTag("name")).isEqualTo("applicationTaskExecutor"));
78+
assertThatExceptionOfType(MeterNotFoundException.class)
79+
.isThrownBy(() -> registry.get("executor").timer());
80+
});
81+
}
82+
6783
@Test
6884
void taskExecutorsWithCustomNamesAreInstrumented() {
6985
this.contextRunner.withBean("firstTaskExecutor", Executor.class, ThreadPoolTaskExecutor::new)

0 commit comments

Comments
 (0)