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