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