This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new fe45841b8 fix(aliyun): map trace statuses to the steps vocabulary 
(#4914)
fe45841b8 is described below

commit fe45841b845eabde9e530181807b672836ca1db9
Author: Wang1rrr <[email protected]>
AuthorDate: Sat Sep 26 18:44:10 2026 +0800

    fix(aliyun): map trace statuses to the steps vocabulary (#4914)
    
    Translate Aliyun GetTrace vendor statuses (SUCCESS / SEND_OK / 
CONSUME_FAILED /
    PRODUCING) into the wait / process / finish / error vocabulary that the
    frontend AntD Steps component accepts, instead of leaking raw values that
    render failed stages as if they were still pending.
---
 .../studio/provider/alibaba/AliyunConverters.java  | 30 +++++++++++++++++++---
 .../provider/alibaba/AliyunConvertersTest.java     | 10 ++++++++
 .../alibaba/AliyunInstanceProviderTest.java        |  7 +++--
 3 files changed, 42 insertions(+), 5 deletions(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
 
b/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
index 0ccf5e2c7..a6195e721 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConverters.java
@@ -262,7 +262,7 @@ final class AliyunConverters {
                 nodes.add(TraceNodeVO.builder()
                         .title("Producer")
                         .timestamp(parseTimeMillis(record.getProduceTime()))
-                        .status(record.getProduceStatus())
+                        .status(toTraceStatus(record.getProduceStatus()))
                         .costTime(record.getProduceDuration() == null ? 0L : 
record.getProduceDuration())
                         .description(joinParts(", ", record.getClientHost(), 
record.getMessageSource()))
                         .build());
@@ -276,6 +276,10 @@ final class AliyunConverters {
                 nodes.add(TraceNodeVO.builder()
                         .title("Broker " + operation.getOperateType())
                         .timestamp(parseTimeMillis(operation.getOperateTime()))
+                        // GetTrace reports no status for broker operations 
(only operateTime and
+                        // operateType), so normalise the absent value to the 
Steps default instead
+                        // of leaving TraceNodeVO.status null, which the 
frontend cannot render.
+                        .status(toTraceStatus(null))
                         .build());
             }
         }
@@ -288,7 +292,7 @@ final class AliyunConverters {
                     String status = consumerInfo.getConsumeStatus();
                     nodes.add(TraceNodeVO.builder()
                             .title("Consumer " + 
consumerInfo.getConsumerGroupId())
-                            .status(status)
+                            .status(toTraceStatus(status))
                             .build());
                     consumerStatuses.add(consumerStatus(
                             consumerInfo.getConsumerGroupId(), status, 0L));
@@ -303,7 +307,7 @@ final class AliyunConverters {
                     nodes.add(TraceNodeVO.builder()
                             .title("Consumer " + 
consumerInfo.getConsumerGroupId())
                             .timestamp(consumeTime)
-                            .status(record.getConsumeStatus())
+                            .status(toTraceStatus(record.getConsumeStatus()))
                             .description(joinParts(", ", 
record.getClientHost(), record.getUserName()))
                             .build());
                     consumerStatuses.add(consumerStatus(
@@ -341,6 +345,26 @@ final class AliyunConverters {
                 .build();
     }
 
+    static String toTraceStatus(String rawStatus) {
+        // The trace Steps component accepts only wait / process / finish / 
error. Cloud
+        // providers return vendor vocabulary (SUCCESS / SEND_OK / 
CONSUME_FAILED / PRODUCING),
+        // so translate instead of leaking it into the API response.
+        if (rawStatus == null || rawStatus.isBlank()) {
+            return "wait";
+        }
+        String status = rawStatus.toUpperCase(Locale.ROOT);
+        if (status.contains("SUCCESS") || status.contains("OK")) {
+            return "finish";
+        }
+        if (status.contains("FAIL")) {
+            return "error";
+        }
+        if (status.contains("ING")) {
+            return "process";
+        }
+        return "wait";
+    }
+
     static java.time.LocalDateTime parseDateTime(String value) {
         if (value == null || value.isBlank()) {
             return null;
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
index de1bf8f72..148624940 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunConvertersTest.java
@@ -113,6 +113,16 @@ class AliyunConvertersTest {
         
assertThat(AliyunConverters.toSubscriptionEntry(subscription(null)).getConsistency()).isNull();
     }
 
+    @Test
+    void toTraceStatusShouldMapVendorVocabularyToStepsStatusTest() {
+        
assertThat(AliyunConverters.toTraceStatus("SUCCESS")).isEqualTo("finish");
+        
assertThat(AliyunConverters.toTraceStatus("SEND_OK")).isEqualTo("finish");
+        
assertThat(AliyunConverters.toTraceStatus("CONSUME_FAILED")).isEqualTo("error");
+        
assertThat(AliyunConverters.toTraceStatus("PRODUCING")).isEqualTo("process");
+        
assertThat(AliyunConverters.toTraceStatus("UNKNOWN")).isEqualTo("wait");
+        assertThat(AliyunConverters.toTraceStatus(null)).isEqualTo("wait");
+    }
+
     private static ListConsumerGroupSubscriptionsResponseBody.Data 
subscription(Boolean consistency) {
         return ListConsumerGroupSubscriptionsResponseBody.Data.builder()
                 .topicName("orders")
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunInstanceProviderTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunInstanceProviderTest.java
index 875512d48..ca032ebd1 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunInstanceProviderTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/provider/alibaba/AliyunInstanceProviderTest.java
@@ -823,14 +823,17 @@ class AliyunInstanceProviderTest {
         assertThat(trace.getNodes()).hasSize(3);
         TraceNodeVO producer = trace.getNodes().get(0);
         assertThat(producer.getTitle()).isEqualTo("Producer");
-        assertThat(producer.getStatus()).isEqualTo("SEND_OK");
+        assertThat(producer.getStatus()).isEqualTo("finish");
         assertThat(producer.getCostTime()).isEqualTo(12L);
         assertThat(producer.getTimestamp())
                 .isEqualTo(AliyunConverters.parseTimeMillis("2023-03-22 
12:17:08"));
         assertThat(trace.getNodes().get(1).getTitle()).isEqualTo("Broker 
store");
+        // GetTrace carries no status for broker operations; the node must 
still stay inside the
+        // wait / process / finish / error vocabulary instead of reporting 
null.
+        assertThat(trace.getNodes().get(1).getStatus()).isEqualTo("wait");
         TraceNodeVO consumer = trace.getNodes().get(2);
         assertThat(consumer.getTitle()).isEqualTo("Consumer GID_test");
-        assertThat(consumer.getStatus()).isEqualTo("CONSUME_OK");
+        assertThat(consumer.getStatus()).isEqualTo("finish");
         assertThat(trace.getConsumerStatus()).singleElement().satisfies(status 
-> {
             assertThat(status.getGroup()).isEqualTo("GID_test");
             assertThat(status.getDeliveryStatus().name()).isEqualTo("success");

Reply via email to