From 03f5b827e27878160b1b4b0f0a9353cb8fcfc5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Fri, 4 Sep 2026 23:48:21 +0800 Subject: [PATCH] =?UTF-8?q?task-186:=20=E4=B8=8A=E4=BC=A0=E8=80=97?= =?UTF-8?q?=E6=97=B6/=E5=A4=A7=E5=B0=8F/=E6=88=90=E5=8A=9F=E7=8E=87?= =?UTF-8?q?=E6=8C=87=E6=A0=87=E5=A5=91=E7=BA=A6=EF=BC=88upload.duration/si?= =?UTF-8?q?ze/result=EF=BC=89+=208=20=E6=9D=A1=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiimage/metrics/UploadMetricsTest.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 backend-java/src/test/java/com/nanri/aiimage/metrics/UploadMetricsTest.java diff --git a/backend-java/src/test/java/com/nanri/aiimage/metrics/UploadMetricsTest.java b/backend-java/src/test/java/com/nanri/aiimage/metrics/UploadMetricsTest.java new file mode 100644 index 00000000..05feb5d2 --- /dev/null +++ b/backend-java/src/test/java/com/nanri/aiimage/metrics/UploadMetricsTest.java @@ -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-186:上传耗时/大小/成功率指标契约(spec 11 §1,模块 file 上传接线面)。 + * aiimage.upload.duration Timer + aiimage.upload.size summary + aiimage.upload.result(.success/failure)。 + */ +class UploadMetricsTest { + + private final SimpleMeterRegistry registry = new SimpleMeterRegistry(); + private final TaskObservabilityMetrics metrics = new TaskObservabilityMetrics("server-110", registry); + + @Test + void uploadDurationRecorded() { + metrics.upload("collectdata", 10_000L, 350L, true); + assertEquals(1, registry.get("aiimage.upload.duration").tag("moduleType", "collectdata").timer().count()); + assertEquals(350.0, registry.get("aiimage.upload.duration").tag("moduleType", "collectdata").timer() + .totalTime(TimeUnit.MILLISECONDS), 0.001); + } + + @Test + void uploadSizeRecorded() { + metrics.upload("collectdata", 1024L, 100L, true); + assertEquals(1024.0, + registry.get("aiimage.upload.size").tag("moduleType", "collectdata").summary().totalAmount(), 0.001); + } + + @Test + void uploadSuccessResultCounted() { + metrics.upload("collectdata", 1L, 1L, true); + assertEquals(1.0, registry.get("aiimage.upload.result.success").tag("moduleType", "collectdata").counter().count()); + } + + @Test + void uploadFailureResultCounted() { + metrics.upload("collectdata", 1L, 1L, false); + assertEquals(1.0, registry.get("aiimage.upload.result.failure").tag("moduleType", "collectdata").counter().count()); + assertEquals(0.0, registry.find("aiimage.upload.result.success").tag("moduleType", "collectdata").counter() == null + ? 0.0 + : registry.find("aiimage.upload.result.success").tag("moduleType", "collectdata").counter().count()); + } + + @Test + void uploadSplitByModule() { + metrics.upload("similarasin", 10L, 10L, true); + metrics.upload("publish", 20L, 20L, true); + assertEquals(1, registry.get("aiimage.upload.duration").tag("moduleType", "similarasin").timer().count()); + assertEquals(1, registry.get("aiimage.upload.duration").tag("moduleType", "publish").timer().count()); + } + + @Test + void largeUploadRecorded() { + metrics.upload("shopdatacrawl", 500_000_000L, 30_000L, true); + assertEquals(500_000_000.0, + registry.get("aiimage.upload.size").tag("moduleType", "shopdatacrawl").summary().totalAmount(), 0.001); + } + + @Test + void uploadNamesFrozen() { + metrics.upload("similarasin", 1L, 1L, true); + assertTrue(registry.getMeters().stream() + .anyMatch(m -> m.getId().getName().equals("aiimage.upload.duration"))); + assertTrue(registry.getMeters().stream() + .anyMatch(m -> m.getId().getName().equals("aiimage.upload.size"))); + assertTrue(registry.getMeters().stream() + .anyMatch(m -> m.getId().getName().equals("aiimage.upload.result.success"))); + } + + @Test + void uploadNoMonitoringStackFallbackNoError() { + TaskObservabilityMetrics without = new TaskObservabilityMetrics("server-121", null); + without.upload("similarasin", 1L, 1L, true); + assertEquals("server-121", without.instanceId()); + } +}