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);

Reply via email to