task-191: 双实例指标区分回归契约(instanceId 分桶不串、未配置归 unknown、跨实例可聚合、名集合一致)+ 8 条测试
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
package com.nanri.aiimage.metrics;
|
||||
|
||||
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/**
|
||||
* task-191:双实例指标区分回归契约(spec 11 §1:instanceId 区分 server-110/server-121)。
|
||||
* 同一 registry 下两实例同模块指标按 instanceId 分桶、不串;未配置 instanceId 归 unknown;
|
||||
* 指标名集合稳定一致。
|
||||
*/
|
||||
class DualInstanceMetricTest {
|
||||
|
||||
private final SimpleMeterRegistry registry = new SimpleMeterRegistry();
|
||||
|
||||
@Test
|
||||
void instance110LabelApplied() {
|
||||
new TaskObservabilityMetrics("server-110", registry).taskCreated("similarasin");
|
||||
assertEquals("server-110",
|
||||
registry.get("aiimage.task.created").counter().getId().getTag("instanceId"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void instance121LabelApplied() {
|
||||
new TaskObservabilityMetrics("server-121", registry).taskCreated("similarasin");
|
||||
assertEquals("server-121",
|
||||
registry.get("aiimage.task.created").counter().getId().getTag("instanceId"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void twoInstancesDoNotCrossCount() {
|
||||
TaskObservabilityMetrics a = new TaskObservabilityMetrics("server-110", registry);
|
||||
TaskObservabilityMetrics b = new TaskObservabilityMetrics("server-121", registry);
|
||||
a.taskCreated("similarasin");
|
||||
b.taskCreated("similarasin");
|
||||
b.taskCreated("similarasin");
|
||||
assertEquals(1.0, registry.get("aiimage.task.created").tag("moduleType", "similarasin")
|
||||
.tag("instanceId", "server-110").counter().count());
|
||||
assertEquals(2.0, registry.get("aiimage.task.created").tag("moduleType", "similarasin")
|
||||
.tag("instanceId", "server-121").counter().count());
|
||||
}
|
||||
|
||||
@Test
|
||||
void unconfiguredInstanceFallsBackToUnknown() {
|
||||
new TaskObservabilityMetrics(null, registry).taskCreated("brand");
|
||||
assertEquals("unknown",
|
||||
registry.get("aiimage.task.created").counter().getId().getTag("instanceId"));
|
||||
new TaskObservabilityMetrics(" ", registry).taskCreated("brand");
|
||||
}
|
||||
|
||||
@Test
|
||||
void metricsAggregatableAcrossInstances() {
|
||||
TaskObservabilityMetrics a = new TaskObservabilityMetrics("server-110", registry);
|
||||
TaskObservabilityMetrics b = new TaskObservabilityMetrics("server-121", registry);
|
||||
a.taskTerminal("similarasin", "success");
|
||||
b.taskTerminal("similarasin", "success");
|
||||
// 聚合:跨 instanceId 各 meter 求和,双实例总数应为 2
|
||||
double total = registry.find("aiimage.task.success").tag("moduleType", "similarasin").counters().stream()
|
||||
.mapToDouble(io.micrometer.core.instrument.Counter::count).sum();
|
||||
assertEquals(2.0, total, "同模块跨实例指标可聚合");
|
||||
}
|
||||
|
||||
@Test
|
||||
void instanceLabelStableAcrossCalls() {
|
||||
TaskObservabilityMetrics a = new TaskObservabilityMetrics("server-110", registry);
|
||||
a.taskCreated("publish");
|
||||
a.taskCreated("publish");
|
||||
assertEquals(1, registry.find("aiimage.task.created").tag("moduleType", "publish")
|
||||
.tag("instanceId", "server-110").counters().size(), "同实例同模块应为同一 meter");
|
||||
assertEquals(2.0, registry.get("aiimage.task.created").tag("moduleType", "publish")
|
||||
.tag("instanceId", "server-110").counter().count());
|
||||
}
|
||||
|
||||
@Test
|
||||
void instanceIdGetterReturnsConfiguredValue() {
|
||||
assertEquals("server-121", new TaskObservabilityMetrics("server-121", null).instanceId());
|
||||
assertNotEquals("", new TaskObservabilityMetrics("server-121", null).instanceId());
|
||||
}
|
||||
|
||||
@Test
|
||||
void metricNameSetIdenticalAcrossInstances() {
|
||||
TaskObservabilityMetrics a = new TaskObservabilityMetrics("server-110", registry);
|
||||
TaskObservabilityMetrics b = new TaskObservabilityMetrics("server-121", registry);
|
||||
a.taskCreated("x");
|
||||
b.taskCreated("x");
|
||||
java.util.Set<String> names = registry.getMeters().stream()
|
||||
.map(m -> m.getId().getName()).collect(Collectors.toSet());
|
||||
assertTrue(names.contains("aiimage.task.created"));
|
||||
assertEquals(1, names.size(), "仅指标名集合应一致(标签不同不算漂移)");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user