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"))); } }