Skip to content

Commit e4d2523

Browse files
committed
Use BatchMetrics.METRICS_PREFIX where appropriate
1 parent 689037b commit e4d2523

File tree

7 files changed

+55
-87
lines changed

7 files changed

+55
-87
lines changed

spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.batch.core.job.parameters.JobParametersValidator;
3434
import org.springframework.batch.core.listener.JobExecutionListener;
3535
import org.springframework.batch.core.SpringBatchVersion;
36+
import org.springframework.batch.core.observability.BatchMetrics;
3637
import org.springframework.batch.core.observability.jfr.events.job.JobExecutionEvent;
3738
import org.springframework.batch.core.observability.micrometer.MicrometerMetrics;
3839
import org.springframework.batch.core.step.Step;
@@ -273,10 +274,12 @@ public final void execute(JobExecution execution) {
273274
JobExecutionEvent jobExecutionEvent = new JobExecutionEvent(execution.getJobInstance().getJobName(),
274275
execution.getJobInstance().getId(), execution.getId());
275276
jobExecutionEvent.begin();
276-
Observation observation = MicrometerMetrics.createObservation("spring.batch.job", this.observationRegistry)
277-
.highCardinalityKeyValue("spring.batch.job.instanceId", execution.getJobInstance().getId().toString())
278-
.highCardinalityKeyValue("spring.batch.job.executionId", execution.getId().toString())
279-
.lowCardinalityKeyValue("spring.batch.job.name", execution.getJobInstance().getJobName())
277+
Observation observation = MicrometerMetrics
278+
.createObservation(BatchMetrics.METRICS_PREFIX + "job", this.observationRegistry)
279+
.highCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "job.instanceId",
280+
execution.getJobInstance().getId().toString())
281+
.highCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "job.executionId", execution.getId().toString())
282+
.lowCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "job.name", execution.getJobInstance().getJobName())
280283
.start();
281284
try (Observation.Scope scope = observation.openScope()) {
282285

@@ -365,7 +368,8 @@ private void stopObservation(JobExecution execution, Observation observation) {
365368
if (!throwables.isEmpty()) {
366369
observation.error(mergedThrowables(throwables));
367370
}
368-
observation.lowCardinalityKeyValue("spring.batch.job.status", execution.getExitStatus().getExitCode());
371+
observation.lowCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "job.status",
372+
execution.getExitStatus().getExitCode());
369373
observation.stop();
370374
}
371375

spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,12 @@ public final void execute(StepExecution stepExecution)
208208
stepExecutionEvent.begin();
209209
stepExecution.setStartTime(LocalDateTime.now());
210210
stepExecution.setStatus(BatchStatus.STARTED);
211-
Observation observation = MicrometerMetrics.createObservation("spring.batch.step", this.observationRegistry)
212-
.highCardinalityKeyValue("spring.batch.step.executionId", stepExecution.getId().toString())
213-
.lowCardinalityKeyValue("spring.batch.step.name", stepExecution.getStepName())
214-
.lowCardinalityKeyValue("spring.batch.step.type", getClass().getName())
215-
.lowCardinalityKeyValue("spring.batch.step.job.name",
211+
Observation observation = MicrometerMetrics
212+
.createObservation(BatchMetrics.METRICS_PREFIX + "step", this.observationRegistry)
213+
.highCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "step.executionId", stepExecution.getId().toString())
214+
.lowCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "step.name", stepExecution.getStepName())
215+
.lowCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "step.type", getClass().getName())
216+
.lowCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "step.job.name",
216217
stepExecution.getJobExecution().getJobInstance().getJobName())
217218
.start();
218219
getJobRepository().update(stepExecution);
@@ -333,7 +334,8 @@ private void stopObservation(StepExecution stepExecution, Observation observatio
333334
if (!throwables.isEmpty()) {
334335
observation.error(mergedThrowables(throwables));
335336
}
336-
observation.lowCardinalityKeyValue("spring.batch.step.status", stepExecution.getExitStatus().getExitCode());
337+
observation.lowCardinalityKeyValue(BatchMetrics.METRICS_PREFIX + "step.status",
338+
stepExecution.getExitStatus().getExitCode());
337339
observation.stop();
338340
}
339341

spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@
2424
import java.util.List;
2525

2626
import io.micrometer.core.instrument.Metrics;
27-
import io.micrometer.core.instrument.Tag;
28-
import io.micrometer.core.instrument.Tags;
29-
import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler;
30-
import io.micrometer.core.tck.MeterRegistryAssert;
31-
import io.micrometer.observation.ObservationRegistry;
3227
import org.junit.jupiter.api.AfterEach;
3328
import org.junit.jupiter.api.BeforeEach;
3429
import org.junit.jupiter.api.Test;
@@ -102,11 +97,6 @@ void setUp() throws Exception {
10297
job = new SimpleJob();
10398
job.setJobRepository(jobRepository);
10499

105-
ObservationRegistry observationRegistry = ObservationRegistry.create();
106-
observationRegistry.observationConfig()
107-
.observationHandler(new DefaultMeterObservationHandler(Metrics.globalRegistry));
108-
job.setObservationRegistry(observationRegistry);
109-
110100
step1 = new StubStep("TestStep1", jobRepository);
111101
step1.setCallback(() -> list.add("default"));
112102
step2 = new StubStep("TestStep2", jobRepository);
@@ -198,11 +188,6 @@ void testRunNormally() {
198188

199189
assertEquals(1, step1.passedInJobContext.size());
200190
assertFalse(step2.passedInJobContext.isEmpty());
201-
202-
// Observability
203-
MeterRegistryAssert.assertThat(Metrics.globalRegistry)
204-
.hasTimerWithNameAndTags("spring.batch.job", Tags.of(Tag.of("error", "none"),
205-
Tag.of("spring.batch.job.name", "testJob"), Tag.of("spring.batch.job.status", "COMPLETED")));
206191
}
207192

208193
@AfterEach

spring-batch-core/src/test/java/org/springframework/batch/core/observability/BatchMetricsTests.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -151,48 +151,48 @@ void testBatchMetrics() throws Exception {
151151

152152
// Job metrics
153153

154-
assertDoesNotThrow(() -> meterRegistry.get("spring.batch.job.launch.count").timer(),
154+
assertDoesNotThrow(() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "job.launch.count").timer(),
155155
"There should be a meter of type TIMER named spring.batch.job.launch.count registered in the meter registry");
156-
assertEquals(1, meterRegistry.get("spring.batch.job.launch.count").timer().count());
156+
assertEquals(1, meterRegistry.get(BatchMetrics.METRICS_PREFIX + "job.launch.count").timer().count());
157157

158158
assertDoesNotThrow(
159-
() -> meterRegistry.get("spring.batch.job")
160-
.tag("spring.batch.job.name", "job")
161-
.tag("spring.batch.job.status", "COMPLETED")
159+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "job")
160+
.tag(BatchMetrics.METRICS_PREFIX + "job.name", "job")
161+
.tag(BatchMetrics.METRICS_PREFIX + "job.status", "COMPLETED")
162162
.timer(),
163163
"There should be a meter of type TIMER named spring.batch.job registered in the meter registry");
164164

165165
// Step metrics
166166

167167
assertDoesNotThrow(
168-
() -> meterRegistry.get("spring.batch.step")
169-
.tag("spring.batch.step.name", "step")
170-
.tag("spring.batch.step.job.name", "job")
171-
.tag("spring.batch.step.status", "COMPLETED")
168+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "step")
169+
.tag(BatchMetrics.METRICS_PREFIX + "step.name", "step")
170+
.tag(BatchMetrics.METRICS_PREFIX + "step.job.name", "job")
171+
.tag(BatchMetrics.METRICS_PREFIX + "step.status", "COMPLETED")
172172
.timer(),
173173
"There should be a meter of type TIMER named spring.batch.step registered in the meter registry");
174174

175175
assertDoesNotThrow(
176-
() -> meterRegistry.get("spring.batch.item.read")
177-
.tag("spring.batch.item.read.job.name", "job")
178-
.tag("spring.batch.item.read.step.name", "step")
179-
.tag("spring.batch.item.read.status", "SUCCESS")
176+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + ".item.read")
177+
.tag(BatchMetrics.METRICS_PREFIX + ".item.read.job.name", "job")
178+
.tag(BatchMetrics.METRICS_PREFIX + ".item.read.step.name", "step")
179+
.tag(BatchMetrics.METRICS_PREFIX + ".item.read.status", "SUCCESS")
180180
.timer(),
181181
"There should be a meter of type TIMER named spring.batch.item.read registered in the meter registry");
182182

183183
assertDoesNotThrow(
184-
() -> meterRegistry.get("spring.batch.item.process")
185-
.tag("spring.batch.item.process.job.name", "job")
186-
.tag("spring.batch.item.process.step.name", "step")
187-
.tag("spring.batch.item.process.status", "SUCCESS")
184+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "item.process")
185+
.tag(BatchMetrics.METRICS_PREFIX + "item.process.job.name", "job")
186+
.tag(BatchMetrics.METRICS_PREFIX + "item.process.step.name", "step")
187+
.tag(BatchMetrics.METRICS_PREFIX + "item.process.status", "SUCCESS")
188188
.timer(),
189189
"There should be a meter of type TIMER named spring.batch.item.process registered in the meter registry");
190190

191191
assertDoesNotThrow(
192-
() -> meterRegistry.get("spring.batch.chunk.write")
193-
.tag("spring.batch.chunk.write.job.name", "job")
194-
.tag("spring.batch.chunk.write.step.name", "step")
195-
.tag("spring.batch.chunk.write.status", "SUCCESS")
192+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "chunk.write")
193+
.tag(BatchMetrics.METRICS_PREFIX + "chunk.write.job.name", "job")
194+
.tag(BatchMetrics.METRICS_PREFIX + "chunk.write.step.name", "step")
195+
.tag(BatchMetrics.METRICS_PREFIX + "chunk.write.status", "SUCCESS")
196196
.timer(),
197197
"There should be a meter of type TIMER named spring.batch.chunk.write registered in the meter registry");
198198

spring-batch-core/src/test/java/org/springframework/batch/core/observability/ObservabilitySampleStepTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,13 @@ public SampleTestRunnerConsumer yourCode() {
9696
// and
9797
SpansAssert.assertThat(bb.getFinishedSpans())
9898
.haveSameTraceId()
99-
.hasASpanWithName("spring.batch.job")
100-
.hasASpanWithName("spring.batch.step");
99+
.hasASpanWithName(BatchMetrics.METRICS_PREFIX + "job")
100+
.hasASpanWithName(BatchMetrics.METRICS_PREFIX + "step");
101101

102102
// and
103103
MeterRegistryAssert.assertThat(meterRegistry)
104-
.hasMeterWithName("spring.batch.job")
105-
.hasMeterWithName("spring.batch.step");
104+
.hasMeterWithName(BatchMetrics.METRICS_PREFIX + "job")
105+
.hasMeterWithName(BatchMetrics.METRICS_PREFIX + "step");
106106
};
107107
}
108108

spring-batch-core/src/test/java/org/springframework/batch/core/step/NonAbstractStepTests.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,6 @@
1818
import java.util.ArrayList;
1919
import java.util.List;
2020

21-
import io.micrometer.core.instrument.Metrics;
22-
import io.micrometer.core.instrument.Tag;
23-
import io.micrometer.core.instrument.Tags;
24-
import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler;
25-
import io.micrometer.core.tck.MeterRegistryAssert;
26-
import io.micrometer.observation.ObservationRegistry;
27-
import org.junit.jupiter.api.AfterEach;
2821
import org.junit.jupiter.api.BeforeEach;
2922
import org.junit.jupiter.api.Test;
3023

@@ -191,11 +184,6 @@ protected void doExecute(StepExecution stepExecution) throws Exception {
191184
void testExecute() throws Exception {
192185
tested.setStepExecutionListeners(new StepExecutionListener[] { listener1, listener2 });
193186

194-
ObservationRegistry observationRegistry = ObservationRegistry.create();
195-
observationRegistry.observationConfig()
196-
.observationHandler(new DefaultMeterObservationHandler(Metrics.globalRegistry));
197-
tested.setObservationRegistry(observationRegistry);
198-
199187
tested.execute(execution);
200188

201189
int i = 0;
@@ -214,18 +202,6 @@ void testExecute() throws Exception {
214202
"Execution context modifications made by listener should be persisted");
215203
assertTrue(repository.saved.containsKey("afterStep"),
216204
"Execution context modifications made by listener should be persisted");
217-
218-
// Observability
219-
MeterRegistryAssert.assertThat(Metrics.globalRegistry)
220-
.hasTimerWithNameAndTags("spring.batch.step",
221-
Tags.of(Tag.of("error", "none"), Tag.of("spring.batch.step.job.name", "jobName"),
222-
Tag.of("spring.batch.step.name", "eventTrackingStep"),
223-
Tag.of("spring.batch.step.status", "COMPLETED")));
224-
}
225-
226-
@AfterEach
227-
void cleanup() {
228-
Metrics.globalRegistry.clear();
229205
}
230206

231207
@Test

spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ChunkOrientedStepObservabilityIntegrationTests.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.batch.core.job.builder.JobBuilder;
3333
import org.springframework.batch.core.job.parameters.JobParameters;
3434
import org.springframework.batch.core.launch.JobOperator;
35+
import org.springframework.batch.core.observability.BatchMetrics;
3536
import org.springframework.batch.core.repository.JobRepository;
3637
import org.springframework.batch.core.step.Step;
3738
import org.springframework.batch.core.step.builder.ChunkOrientedStepBuilder;
@@ -85,24 +86,24 @@ void testChunkOrientedStepMetricsWihProgrammaticApproach() throws Exception {
8586
private static void assertMetrics(SimpleMeterRegistry meterRegistry) {
8687
Assertions.assertEquals(12, meterRegistry.getMeters().size());
8788
assertDoesNotThrow(
88-
() -> meterRegistry.get("spring.batch.item.read")
89-
.tag("spring.batch.item.read.job.name", "job")
90-
.tag("spring.batch.item.read.step.name", "step")
91-
.tag("spring.batch.item.read.status", "SUCCESS")
89+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "item.read")
90+
.tag(BatchMetrics.METRICS_PREFIX + "item.read.job.name", "job")
91+
.tag(BatchMetrics.METRICS_PREFIX + "item.read.step.name", "step")
92+
.tag(BatchMetrics.METRICS_PREFIX + "item.read.status", "SUCCESS")
9293
.timer(),
9394
"There should be a meter of type TIMER named spring.batch.item.read registered in the meter registry");
9495
assertDoesNotThrow(
95-
() -> meterRegistry.get("spring.batch.item.process")
96-
.tag("spring.batch.item.process.job.name", "job")
97-
.tag("spring.batch.item.process.step.name", "step")
98-
.tag("spring.batch.item.process.status", "SUCCESS")
96+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "item.process")
97+
.tag(BatchMetrics.METRICS_PREFIX + "item.process.job.name", "job")
98+
.tag(BatchMetrics.METRICS_PREFIX + "item.process.step.name", "step")
99+
.tag(BatchMetrics.METRICS_PREFIX + "item.process.status", "SUCCESS")
99100
.timer(),
100101
"There should be a meter of type TIMER named spring.batch.item.process registered in the meter registry");
101102
assertDoesNotThrow(
102-
() -> meterRegistry.get("spring.batch.chunk.write")
103-
.tag("spring.batch.chunk.write.job.name", "job")
104-
.tag("spring.batch.chunk.write.step.name", "step")
105-
.tag("spring.batch.chunk.write.status", "SUCCESS")
103+
() -> meterRegistry.get(BatchMetrics.METRICS_PREFIX + "chunk.write")
104+
.tag(BatchMetrics.METRICS_PREFIX + "chunk.write.job.name", "job")
105+
.tag(BatchMetrics.METRICS_PREFIX + "chunk.write.step.name", "step")
106+
.tag(BatchMetrics.METRICS_PREFIX + "chunk.write.status", "SUCCESS")
106107
.timer(),
107108
"There should be a meter of type TIMER named spring.batch.chunk.write registered in the meter registry");
108109
}

0 commit comments

Comments
 (0)