This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new b569ce871e fix(admin): sample instance state history once per check
cycle (#7451)
b569ce871e is described below
commit b569ce871e9c56078a40d95978a91d2582aaebb3
Author: Sean-Walker0 <[email protected]>
AuthorDate: Thu Oct 8 14:36:01 2026 +0800
fix(admin): sample instance state history once per check cycle (#7451)
doCheck() called collectStateData() inside the per-instance loop, so
one scheduled cycle appended N history points for N tracked instances,
and the early points captured intermediate state while later instances
were still being updated. The visual API therefore rendered duplicated
samples and a faster-than-real timeline whenever more than one instance
was tracked.
Update all instance states first, then append a single aggregated
sample per scheduled cycle. Regression test asserts one doCheck run
with two instances appends exactly one history sample (red on the
previous code, which appended two).
Fixes #6497
Co-authored-by: Sean-Walker0
<[email protected]>
---
.../shenyu/admin/service/impl/InstanceCheckService.java | 3 ++-
.../admin/service/impl/InstanceCheckServiceTest.java | 17 +++++++++++++++++
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/InstanceCheckService.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/InstanceCheckService.java
index f6b1c92c18..9b6fbb8ccb 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/InstanceCheckService.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/InstanceCheckService.java
@@ -166,8 +166,9 @@ public class InstanceCheckService {
instance.setInstanceState(InstanceStatusEnum.DELETED.getCode());
}
}
- collectStateData();
});
+ // sample the aggregated state once per scheduled cycle, after all
instances are updated
+ collectStateData();
}
public void syncDB() {
diff --git
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/InstanceCheckServiceTest.java
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/InstanceCheckServiceTest.java
index 2499602b46..18f924c256 100644
---
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/InstanceCheckServiceTest.java
+++
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/InstanceCheckServiceTest.java
@@ -33,6 +33,7 @@ import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import java.sql.Timestamp;
+import java.util.Arrays;
import java.util.Collections;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -192,6 +193,22 @@ public final class InstanceCheckServiceTest {
assertDoesNotThrow(() ->
ReflectionTestUtils.invokeMethod(instanceCheckService, "doCheck"));
}
+ @Test
+ void testDoCheckAppendsOneHistorySamplePerCycle() {
+ InstanceInfoVO first = buildVO("10.0.0.1", "8080", "http", "ns");
+ InstanceInfoVO second = buildVO("10.0.0.2", "8080", "http", "ns");
+ when(instanceInfoService.list()).thenReturn(Arrays.asList(first,
second));
+ instanceCheckService.fetchInstanceData();
+
+ ReflectionTestUtils.invokeMethod(instanceCheckService, "doCheck");
+
+ long sampledPoints =
instanceCheckService.getInstanceDataVisual("ns").getLineData().stream()
+ .flatMap(line -> line.getData().stream())
+ .filter(value -> value > 0)
+ .count();
+ assertEquals(1, sampledPoints, "one scheduled check must append
exactly one history sample");
+ }
+
private InstanceInfoVO buildVO(final String ip, final String port, final
String type, final String ns) {
InstanceInfoVO v = new InstanceInfoVO();
v.setInstanceIp(ip);