task-183: task.duration 耗时指标契约(Timer,非负、分模块、名称冻结)+ 8 条测试

This commit is contained in:
2026-09-04 23:48:20 +08:00
parent 0863614e66
commit 0ec4fb3534
@@ -0,0 +1,77 @@
package com.nanri.aiimage.metrics;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* task-183task.duration 耗时记录契约(spec 11 §1)。
* 开始→终态耗时以 Timer 记录(未配置注册表时降级 debug 日志);非负;分 moduleType。
*/
class TaskDurationMetricsTest {
private final SimpleMeterRegistry registry = new SimpleMeterRegistry();
private final TaskObservabilityMetrics metrics = new TaskObservabilityMetrics("server-110", registry);
private io.micrometer.core.instrument.Timer timer(String moduleType) {
return registry.get("aiimage.task.duration").tag("moduleType", moduleType).timer();
}
@Test
void durationRecorded() {
metrics.taskDuration("similarasin", 1_234L);
assertEquals(1, timer("similarasin").count());
assertEquals(1_234.0, timer("similarasin").totalTime(java.util.concurrent.TimeUnit.MILLISECONDS), 0.001);
}
@Test
void durationAccumulates() {
metrics.taskDuration("similarasin", 100L);
metrics.taskDuration("similarasin", 200L);
assertEquals(2, timer("similarasin").count());
assertEquals(300.0, timer("similarasin").totalTime(java.util.concurrent.TimeUnit.MILLISECONDS), 0.001);
}
@Test
void shortTaskRecorded() {
metrics.taskDuration("similarasin", 1L);
assertTrue(timer("similarasin").count() >= 1);
}
@Test
void longTaskRecordedLarger() {
metrics.taskDuration("similarasin", 600_000L);
assertEquals(600_000.0, timer("similarasin").totalTime(java.util.concurrent.TimeUnit.MILLISECONDS), 0.001);
}
@Test
void durationNeverNegative() {
metrics.taskDuration("similarasin", -5L);
assertEquals(0.0, timer("similarasin").totalTime(java.util.concurrent.TimeUnit.MILLISECONDS), 0.001,
"负耗时按 0 处理,不应破坏指标");
}
@Test
void durationSplitByModule() {
metrics.taskDuration("similarasin", 100L);
metrics.taskDuration("publish", 50L);
assertEquals(1, timer("similarasin").count());
assertEquals(1, timer("publish").count());
}
@Test
void durationNameFrozen() {
metrics.taskDuration("similarasin", 10L);
assertTrue(registry.getMeters().stream()
.anyMatch(m -> m.getId().getName().equals("aiimage.task.duration")));
}
@Test
void durationCarriesInstanceLabel() {
metrics.taskDuration("similarasin", 10L);
assertEquals("server-110",
registry.get("aiimage.task.duration").timer().getId().getTag("instanceId"));
}
}