From e365fc84f8d7d193d8a95792519b230123072181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Fri, 4 Sep 2026 23:48:21 +0800 Subject: [PATCH] =?UTF-8?q?task-185:=20file-job.*=20=E6=8C=87=E6=A0=87?= =?UTF-8?q?=E5=A5=91=E7=BA=A6=EF=BC=88pending/running/success/failed/retry?= =?UTF-8?q?/duration=EF=BC=8C=E5=88=86=E6=A8=A1=E5=9D=97/=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=EF=BC=89+=208=20=E6=9D=A1=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiimage/metrics/FileJobMetricsTest.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 backend-java/src/test/java/com/nanri/aiimage/metrics/FileJobMetricsTest.java 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"))); + } +}