task-181: task.created/running 指标埋点(TaskObservabilityMetrics recorder:created 计数 + running gauge + moduleType/instanceId 标签,名称冻结)+ 8 条测试
- 标准指标名 aiimage.task.created/running(spec11 §1);moduleType/instanceId null 归 unknown;running 不为负 - Micrometer 可选:无注册表降级 debug 日志不抛错;recorder 为唯一接线面,各业务状态流转按 spec 待监控栈就绪后挂载 - 仅新增类与测试,不接调用点,零生产行为变化
This commit is contained in:
+92
@@ -0,0 +1,92 @@
|
||||
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-181:task.created/running 指标埋点契约(spec 11 §1)。
|
||||
*
|
||||
* aiimage.task.created 计数与 aiimage.task.running gauge,带 moduleType/instanceId 标签;
|
||||
* 无监控栈(registry=null) 时降级 debug 日志不抛错。运行计数不为负;指标名冻结。
|
||||
*/
|
||||
class TaskObservabilityLifecycleMetricsTest {
|
||||
|
||||
private final SimpleMeterRegistry registry = new SimpleMeterRegistry();
|
||||
private final TaskObservabilityMetrics metrics = new TaskObservabilityMetrics("server-110", registry);
|
||||
|
||||
@Test
|
||||
void createdIncrementedPerModule() {
|
||||
metrics.taskCreated("similarasin");
|
||||
metrics.taskCreated("similarasin");
|
||||
metrics.taskCreated("publish");
|
||||
assertEquals(2.0, counter("aiimage.task.created", "similarasin").count());
|
||||
assertEquals(1.0, counter("aiimage.task.created", "publish").count());
|
||||
}
|
||||
|
||||
@Test
|
||||
void runningGaugeReflectsDelta() {
|
||||
metrics.taskRunningDelta("similarasin", 3);
|
||||
metrics.taskRunningDelta("similarasin", 1);
|
||||
assertEquals(4.0, gauge("aiimage.task.running", "similarasin").value());
|
||||
}
|
||||
|
||||
@Test
|
||||
void runningGaugeNeverNegative() {
|
||||
metrics.taskRunningDelta("similarasin", -5);
|
||||
assertEquals(0.0, gauge("aiimage.task.running", "similarasin").value(), "运行计数不应为负");
|
||||
}
|
||||
|
||||
@Test
|
||||
void moduleLabelAttached() {
|
||||
metrics.taskCreated("shopdatacrawl");
|
||||
assertEquals("shopdatacrawl",
|
||||
registry.get("aiimage.task.created").counter().getId().getTag("moduleType"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void instanceLabelAttached() {
|
||||
metrics.taskCreated("brand");
|
||||
assertEquals("server-110",
|
||||
registry.get("aiimage.task.created").counter().getId().getTag("instanceId"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void counterAccumulatesAcrossCalls() {
|
||||
for (int i = 0; i < 5; i++) {
|
||||
metrics.taskCreated("ziniao");
|
||||
}
|
||||
assertEquals(5.0, counter("aiimage.task.created", "ziniao").count());
|
||||
}
|
||||
|
||||
@Test
|
||||
void metricNamesFrozen() {
|
||||
metrics.taskCreated("withdraw");
|
||||
metrics.taskRunningDelta("withdraw", 1);
|
||||
boolean hasCreated = registry.getMeters().stream()
|
||||
.anyMatch(m -> m.getId().getName().equals("aiimage.task.created"));
|
||||
boolean hasRunning = registry.getMeters().stream()
|
||||
.anyMatch(m -> m.getId().getName().equals("aiimage.task.running"));
|
||||
assertTrue(hasCreated, "应存在 aiimage.task.created");
|
||||
assertTrue(hasRunning, "应存在 aiimage.task.running");
|
||||
}
|
||||
|
||||
@Test
|
||||
void registryOptionalLogsFallbackWithoutError() {
|
||||
// 无监控栈(registry=null):调用不抛错,事件降级 debug 日志
|
||||
TaskObservabilityMetrics withoutRegistry = new TaskObservabilityMetrics("server-121", null);
|
||||
withoutRegistry.taskCreated("similarasin");
|
||||
withoutRegistry.taskRunningDelta("similarasin", 2);
|
||||
assertEquals("server-121", withoutRegistry.instanceId());
|
||||
}
|
||||
|
||||
private io.micrometer.core.instrument.Counter counter(String name, String moduleType) {
|
||||
return registry.get(name).tag("moduleType", moduleType).counter();
|
||||
}
|
||||
|
||||
private io.micrometer.core.instrument.Gauge gauge(String name, String moduleType) {
|
||||
return registry.get(name).tag("moduleType", moduleType).gauge();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user