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