diff --git a/backend-java/src/test/java/com/nanri/aiimage/metrics/FileJobMetricsTest.java b/backend-java/src/test/java/com/nanri/aiimage/metrics/FileJobMetricsTest.java new file mode 100644 index 00000000..6d113541 --- /dev/null +++ b/backend-java/src/test/java/com/nanri/aiimage/metrics/FileJobMetricsTest.java @@ -0,0 +1,82 @@ +package com.nanri.aiimage.metrics; + +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.TimeUnit; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * task-185:file-job.* 指标契约(spec 11 §1,TaskResultFileJobWorker 接线面)。 + * pending/running/success/failed/retry 计数 + duration 耗时,分 moduleType/instanceId。 + */ +class FileJobMetricsTest { + + private final SimpleMeterRegistry registry = new SimpleMeterRegistry(); + private final TaskObservabilityMetrics metrics = new TaskObservabilityMetrics("server-110", registry); + + private double count(String state, String moduleType) { + io.micrometer.core.instrument.Counter c = registry.find("aiimage.file-job." + state) + .tag("moduleType", moduleType).counter(); + return c == null ? 0.0 : c.count(); + } + + @Test + void pendingCounted() { + metrics.fileJobState("similarasin", "pending"); + assertEquals(1.0, count("pending", "similarasin")); + } + + @Test + void runningCounted() { + metrics.fileJobState("similarasin", "running"); + assertEquals(1.0, count("running", "similarasin")); + } + + @Test + void successCounted() { + metrics.fileJobState("similarasin", "success"); + assertEquals(1.0, count("success", "similarasin")); + } + + @Test + void failedCounted() { + metrics.fileJobState("similarasin", "failed"); + assertEquals(1.0, count("failed", "similarasin")); + } + + @Test + void retryCounted() { + metrics.fileJobState("similarasin", "retry"); + assertEquals(1.0, count("retry", "similarasin")); + } + + @Test + void durationRecorded() { + metrics.fileJobDuration("similarasin", 2_000L); + assertEquals(1, registry.get("aiimage.file-job.duration").tag("moduleType", "similarasin").timer().count()); + assertEquals(2_000.0, + registry.get("aiimage.file-job.duration").tag("moduleType", "similarasin").timer() + .totalTime(TimeUnit.MILLISECONDS), 0.001); + } + + @Test + void splitByModuleAndInstance() { + metrics.fileJobState("similarasin", "success"); + metrics.fileJobState("publish", "success"); + assertEquals(1.0, count("success", "similarasin")); + assertEquals(1.0, count("success", "publish")); + assertEquals("server-110", + registry.get("aiimage.file-job.success").counter().getId().getTag("instanceId")); + } + + @Test + void fileJobNamesFrozen() { + metrics.fileJobState("similarasin", "success"); + metrics.fileJobDuration("similarasin", 10L); + assertTrue(registry.getMeters().stream().anyMatch(m -> m.getId().getName().equals("aiimage.file-job.success"))); + assertTrue(registry.getMeters().stream().anyMatch(m -> m.getId().getName().equals("aiimage.file-job.duration"))); + } +}