diff --git a/pom.xml b/pom.xml
index de5cbf478..a29cf7cd8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,7 +54,7 @@
6.0.0-M3
1.3.2
6.0.0-M2
- 2.0.0-M3
+ 2.0.0-SNAPSHOT
2.13.2
@@ -79,7 +79,7 @@
5.8.2
- 1.0.0-M3
+ 1.0.0-SNAPSHOT
4.13.2
2.2
3.22.0
diff --git a/spring-batch-core/pom.xml b/spring-batch-core/pom.xml
index 325beea95..d7e292766 100644
--- a/spring-batch-core/pom.xml
+++ b/spring-batch-core/pom.xml
@@ -60,6 +60,11 @@
micrometer-core
${micrometer.version}
+
+ io.micrometer
+ micrometer-observation
+ ${micrometer.version}
+
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java
index 73d898dbc..4496d7542 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java
@@ -23,9 +23,10 @@ import java.util.stream.Collectors;
import io.micrometer.core.instrument.LongTaskTimer;
import io.micrometer.core.instrument.Tag;
-import io.micrometer.core.instrument.observation.Observation;
+import io.micrometer.observation.Observation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
@@ -41,10 +42,10 @@ import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.launch.NoSuchJobException;
import org.springframework.batch.core.launch.support.ExitCodeMapper;
import org.springframework.batch.core.listener.CompositeJobExecutionListener;
-import org.springframework.batch.core.observability.BatchMetrics;
import org.springframework.batch.core.observability.BatchJobContext;
import org.springframework.batch.core.observability.BatchJobObservation;
import org.springframework.batch.core.observability.BatchJobTagsProvider;
+import org.springframework.batch.core.observability.BatchMetrics;
import org.springframework.batch.core.observability.DefaultBatchJobTagsProvider;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobContext.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobContext.java
index d6bac647b..46a1c4473 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobContext.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobContext.java
@@ -16,7 +16,7 @@
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.observation.Observation;
+import io.micrometer.observation.Observation;
import org.springframework.batch.core.JobExecution;
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobObservation.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobObservation.java
index 58fd7d7cc..9948dcf3b 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobObservation.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobObservation.java
@@ -16,8 +16,8 @@
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.docs.DocumentedObservation;
-import io.micrometer.core.instrument.docs.TagKey;
+import io.micrometer.observation.docs.DocumentedObservation;
+import io.micrometer.observation.docs.TagKey;
/**
* Observation created around a Job execution.
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobTagsProvider.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobTagsProvider.java
index 0d07b40da..6fc67cbb3 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobTagsProvider.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchJobTagsProvider.java
@@ -16,7 +16,7 @@
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.observation.Observation;
+import io.micrometer.observation.Observation;
/**
* {@link Observation.TagsProvider} for {@link BatchJobContext}.
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchMetrics.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchMetrics.java
index 489083ae4..a5508ca54 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchMetrics.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchMetrics.java
@@ -24,8 +24,9 @@ import io.micrometer.core.instrument.LongTaskTimer;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Timer;
-import io.micrometer.core.instrument.observation.Observation;
import io.micrometer.core.instrument.observation.TimerObservationHandler;
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationRegistry;
import org.springframework.lang.Nullable;
@@ -52,7 +53,19 @@ public final class BatchMetrics {
public static final String STATUS_FAILURE = "FAILURE";
- private BatchMetrics() {}
+ /**
+ * Global {@link ObservationRegistry}. A {@link TimerObservationHandler} is attached
+ * to create a {@link Timer} for every finished {@link Observation}.
+ */
+ public static final ObservationRegistry observationRegistry;
+
+ static {
+ observationRegistry = ObservationRegistry.create();
+ observationRegistry.observationConfig().observationHandler(new TimerObservationHandler(Metrics.globalRegistry));
+ }
+
+ private BatchMetrics() {
+ }
/**
* Create a {@link Timer}.
@@ -81,7 +94,7 @@ public final class BatchMetrics {
* @since 5.0
*/
public static Observation createObservation(String name, Observation.Context context) {
- return Observation.createNotStarted(name, context, Metrics.globalRegistry);
+ return Observation.createNotStarted(name, context, observationRegistry);
}
/**
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepContext.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepContext.java
index dcda251b7..4439580a4 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepContext.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepContext.java
@@ -16,7 +16,7 @@
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.observation.Observation;
+import io.micrometer.observation.Observation;
import org.springframework.batch.core.StepExecution;
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepObservation.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepObservation.java
index 5baa4ec09..236a122f0 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepObservation.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepObservation.java
@@ -16,8 +16,8 @@
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.docs.DocumentedObservation;
-import io.micrometer.core.instrument.docs.TagKey;
+import io.micrometer.observation.docs.DocumentedObservation;
+import io.micrometer.observation.docs.TagKey;
/**
* Observation created around a step execution.
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepTagsProvider.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepTagsProvider.java
index 09d4606ee..81440e9bc 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepTagsProvider.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/BatchStepTagsProvider.java
@@ -16,7 +16,7 @@
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.observation.Observation;
+import io.micrometer.observation.Observation;
/**
* {@link Observation.TagsProvider} for {@link BatchStepContext}.
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchJobTagsProvider.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchJobTagsProvider.java
index 56c05e66f..a0b186b96 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchJobTagsProvider.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchJobTagsProvider.java
@@ -15,7 +15,7 @@
*/
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.Tags;
+import io.micrometer.observation.Tags;
import org.springframework.batch.core.JobExecution;
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchStepTagsProvider.java b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchStepTagsProvider.java
index 85c194339..ac3af0f7d 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchStepTagsProvider.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/observability/DefaultBatchStepTagsProvider.java
@@ -15,7 +15,7 @@
*/
package org.springframework.batch.core.observability;
-import io.micrometer.core.instrument.Tags;
+import io.micrometer.observation.Tags;
import org.springframework.batch.core.StepExecution;
diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java
index 1f63d0536..29405d53b 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java
@@ -20,9 +20,10 @@ import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
-import io.micrometer.core.instrument.observation.Observation;
+import io.micrometer.observation.Observation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobInterruptedException;
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java
index 66687f8d4..08939045e 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java
@@ -16,14 +16,6 @@
package org.springframework.batch.core.job;
-import static org.mockito.Mockito.mock;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -61,6 +53,14 @@ import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
/**
* Tests for DefaultJobLifecycle.
*
@@ -208,7 +208,6 @@ public class SimpleJobTests {
@Test
public void testRunNormally() throws Exception {
- Metrics.globalRegistry.withTimerObservationHandler();
step1.setStartLimit(5);
step2.setStartLimit(5);
job.execute(jobExecution);
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/observability/BatchMetricsTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/observability/BatchMetricsTests.java
index 9a505c3f5..4256cfe11 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/observability/BatchMetricsTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/observability/BatchMetricsTests.java
@@ -27,7 +27,6 @@ import javax.sql.DataSource;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.Metrics;
-import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.batch.core.ExitStatus;
@@ -39,7 +38,6 @@ import org.springframework.batch.core.configuration.annotation.EnableBatchProces
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
-import org.springframework.batch.core.observability.BatchMetrics;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.ApplicationContext;
@@ -61,11 +59,6 @@ public class BatchMetricsTests {
private static final int EXPECTED_SPRING_BATCH_METRICS = 10;
- @BeforeClass
- public static void setup() {
- Metrics.globalRegistry.withTimerObservationHandler();
- }
-
@Test
public void testCalculateDuration() {
LocalDateTime startTime = LocalDateTime.now();
diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/NonAbstractStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/NonAbstractStepTests.java
index 25bb6c7fc..450cd3826 100644
--- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/NonAbstractStepTests.java
+++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/NonAbstractStepTests.java
@@ -15,11 +15,6 @@
*/
package org.springframework.batch.core.step;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
import java.util.ArrayList;
import java.util.List;
@@ -30,6 +25,7 @@ import io.micrometer.core.tck.MeterRegistryAssert;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
@@ -42,6 +38,11 @@ import org.springframework.batch.item.ExecutionContext;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
/**
* Tests for {@link AbstractStep}.
*/
@@ -185,7 +186,6 @@ public class NonAbstractStepTests {
*/
@Test
public void testExecute() throws Exception {
- Metrics.globalRegistry.withTimerObservationHandler();
tested.setStepExecutionListeners(new StepExecutionListener[] { listener1, listener2 });
tested.execute(execution);
diff --git a/spring-batch-test/src/test/java/org/springframework/batch/test/observability/ObservabilitySampleStepTests.java b/spring-batch-test/src/test/java/org/springframework/batch/test/observability/ObservabilitySampleStepTests.java
index dcc5e9cda..02a46c3e1 100644
--- a/spring-batch-test/src/test/java/org/springframework/batch/test/observability/ObservabilitySampleStepTests.java
+++ b/spring-batch-test/src/test/java/org/springframework/batch/test/observability/ObservabilitySampleStepTests.java
@@ -15,7 +15,6 @@
*/
package org.springframework.batch.test.observability;
-import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.tck.MeterRegistryAssert;
import io.micrometer.tracing.test.SampleTestRunner;
@@ -25,6 +24,7 @@ import org.junit.jupiter.api.Assertions;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
+import org.springframework.batch.core.observability.BatchMetrics;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.batch.test.SpringBatchTestJUnit5Tests;
import org.springframework.batch.test.context.SpringBatchTest;
@@ -40,16 +40,13 @@ public class ObservabilitySampleStepTests extends SampleTestRunner {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
- private static MeterRegistry registry = Metrics.globalRegistry.withTimerObservationHandler();
-
- @Override
- protected MeterRegistry getMeterRegistry() {
- return registry;
+ ObservabilitySampleStepTests() {
+ super(SampleRunnerConfig.builder().build(), BatchMetrics.observationRegistry, Metrics.globalRegistry);
}
@AfterEach
void clean() {
- registry.clear();
+ Metrics.globalRegistry.clear();
}
@Override