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 1dbb2bedb fix(apache): report a Node.js client language instead of 
dropping it (#4846)
1dbb2bedb is described below

commit 1dbb2bedb6b3ece13853ebc257dcf1b30958af4d
Author: Wang1rrr <[email protected]>
AuthorDate: Thu Sep 24 10:45:58 2026 +0800

    fix(apache): report a Node.js client language instead of dropping it (#4846)
    
    `RocketMQClientProvider.mapLanguage` is the only mapping from the broker's 
`LanguageCode` to Studio's `ClientLanguage` and covered seven of the eight 
members, so a broker-reported `LanguageCode.NODE_JS` (which rocketmq-remoting 
5.5.0 does emit) fell through to null. A Node.js client therefore rendered as 
an empty tag, was unfilterable, was bucketed under a literal null in the 
distribution panel, exported an empty CSV cell and raised a false 
UNKNOWN_LANGUAGE finding against a healthy f [...]
---
 .../provider/apache/RocketMQClientProvider.java    |  4 ++++
 .../apache/RocketMQClientProviderTest.java         | 26 ++++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProvider.java
 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProvider.java
index 9978ee2a5..f89a84401 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProvider.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProvider.java
@@ -455,7 +455,11 @@ public class RocketMQClientProvider implements 
ClientProvider {
                 return ClientLanguage.CSharp;
             case PHP:
                 return ClientLanguage.PHP;
+            case NODE_JS:
+                return ClientLanguage.NodeJS;
             default:
+                // LanguageCode values with no ClientLanguage counterpart 
(RUBY, HTTP, OMS, OTHER,
+                // DELPHI, ERLANG) stay unmapped; the client diagnostics 
report them as unknown.
                 return null;
         }
     }
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProviderTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProviderTest.java
index 2bf3a429b..a6ac4bff6 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProviderTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClientProviderTest.java
@@ -32,6 +32,7 @@ import 
org.apache.rocketmq.studio.cluster.client.ClientConnectionVO;
 import org.apache.rocketmq.studio.cluster.client.ProducerConnectionScanResult;
 import org.apache.rocketmq.studio.cluster.broker.MqAdminExtFactory;
 import org.apache.rocketmq.studio.cluster.broker.RuntimeAdminClientResolver;
+import org.apache.rocketmq.studio.common.domain.enums.ClientLanguage;
 import org.apache.rocketmq.studio.common.exception.BusinessException;
 import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
 import org.junit.jupiter.api.BeforeEach;
@@ -45,6 +46,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.IntStream;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -115,6 +117,30 @@ class RocketMQClientProviderTest {
                 
.isEqualTo(org.apache.rocketmq.common.MQVersion.getVersionDesc(500));
     }
 
+    @Test
+    void connectionScanShouldReportEveryStudioClientLanguageTest() throws 
Exception {
+        Map<String, String> clusters = new HashMap<>();
+        clusters.put("10.0.0.11:10911", "cluster-a");
+        
when(adminExt.examineBrokerClusterInfo()).thenReturn(clusterInfo(clusters));
+        List<LanguageCode> languageCodes = List.of(
+                LanguageCode.JAVA, LanguageCode.GO, LanguageCode.PYTHON, 
LanguageCode.RUST,
+                LanguageCode.CPP, LanguageCode.DOTNET, LanguageCode.PHP, 
LanguageCode.NODE_JS);
+        List<ProducerInfo> producers = IntStream.range(0, languageCodes.size())
+                .mapToObj(index -> new ProducerInfo("client-" + index, 
"10.0.0.2" + index + ":49152",
+                        languageCodes.get(index), 500, 1000L))
+                .toList();
+        Map<String, List<ProducerInfo>> data = new HashMap<>();
+        data.put("pg-language", producers);
+        when(adminExt.getAllProducerInfo("10.0.0.11:10911")).thenReturn(new 
ProducerTableInfo(data));
+
+        List<ClientConnectionVO> connections = 
provider.findConnectionsAt("10.0.1.31:9876", null, "Producer");
+
+        assertThat(connections).hasSize(languageCodes.size());
+        assertThat(connections)
+                .extracting(ClientConnectionVO::getLanguage)
+                .containsExactlyInAnyOrder(ClientLanguage.values());
+    }
+
     @Test
     void producerScanTreatsMissingBrokerMetadataAsEmpty() throws Exception {
         ClusterInfo clusterInfo = new ClusterInfo();

Reply via email to