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 47a6bbf39 fix(provider): parse long jstack thread names (#2191)
47a6bbf39 is described below

commit 47a6bbf39af2b8f97f28717801d039e3fa884a88
Author: yyqdbngt <[email protected]>
AuthorDate: Tue Aug 18 18:05:49 2026 +0800

    fix(provider): parse long jstack thread names (#2191)
    
    RocketMQ omits padding before TID when a thread name fills its jstack
    column, so diagnostics silently dropped long-named consumer threads.
    
    Parse the stable TID boundary without requiring whitespace.
    
    Signed-off-by: yyqdbngt <[email protected]>
---
 .../apache/RocketMQConsumerDiagnosticsProvider.java   |  2 +-
 .../RocketMQConsumerDiagnosticsProviderTest.java      | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProvider.java
 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProvider.java
index 6f094987a..a41ca8904 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProvider.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProvider.java
@@ -49,7 +49,7 @@ import java.util.regex.Pattern;
 public class RocketMQConsumerDiagnosticsProvider implements 
ConsumerDiagnosticsProvider {
 
     private static final Pattern THREAD_HEADER =
-            
Pattern.compile("^(?<name>.+?)\\s+TID:\\s+(?<id>\\d+)\\s+STATE:\\s+(?<state>\\S+)\\s*$");
+            
Pattern.compile("^(?<name>.+?)TID:\\s+(?<id>\\d+)\\s+STATE:\\s+(?<state>\\S+)\\s*$");
 
     private final RuntimeAdminClientResolver runtimeAdminClientResolver;
     private final MqAdminExtFactory adminFactory;
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProviderTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProviderTest.java
index 0b8a63712..287559829 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProviderTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQConsumerDiagnosticsProviderTest.java
@@ -98,6 +98,25 @@ class RocketMQConsumerDiagnosticsProviderTest {
         verify(adminFactory, never()).execute(anyString(), any(), any());
     }
 
+    @Test
+    void getConsumerStackShouldParseThreadNamesLongerThanJstackColumnWidth() 
throws Exception {
+        String threadName = 
"ConsumeMessageThreadWithANameLongerThanFortyCharacters";
+        ConsumerRunningInfo runningInfo = new ConsumerRunningInfo();
+        runningInfo.setJstack(String.format(
+                "%-40sTID: 42 STATE: 
RUNNABLE%n%-40scom.example.Listener.consume(Listener.java:10)%n",
+                threadName, threadName));
+        when(adminExt.getConsumerRunningInfo("cg-orders", "client-1", 
true)).thenReturn(runningInfo);
+
+        ConsumerStackTraceVO result = provider.getConsumerStack("instance-a", 
"cg-orders", "client-1");
+
+        assertThat(result.getThreadCount()).isEqualTo(1);
+        
assertThat(result.getThreads().get(0).getThreadName()).isEqualTo(threadName);
+        assertThat(result.getThreads().get(0).getThreadId()).isEqualTo(42);
+        
assertThat(result.getThreads().get(0).getState()).isEqualTo("RUNNABLE");
+        assertThat(result.getThreads().get(0).getStackTrace())
+                
.containsExactly("com.example.Listener.consume(Listener.java:10)");
+    }
+
     @Test
     void getConsumerStackShouldUseDefaultNameServerWhenInstanceIsBlank() 
throws Exception {
         ConsumerRunningInfo runningInfo = new ConsumerRunningInfo();

Reply via email to