task-185: file-job.* 指标契约(pending/running/success/failed/retry/duration,分模块/实例)+ 8 条测试

This commit is contained in:
2026-09-04 23:48:21 +08:00
parent 17cfd6902b
commit e365fc84f8
@@ -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-185file-job.* 指标契约(spec 11 §1TaskResultFileJobWorker 接线面)。
* 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")));
}
}