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

zqr10159 pushed a commit to branch 2.0.0
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/2.0.0 by this push:
     new 061385a6a3 Align trace route group drilldown
061385a6a3 is described below

commit 061385a6a37864356a1daa90b1b3f74d3e2225bc
Author: Logic <[email protected]>
AuthorDate: Tue Jun 9 18:27:44 2026 +0800

    Align trace route group drilldown
---
 web-next/lib/signal-dashboards.test.ts | 43 ++++++++++++++++++++++++++++++++++
 web-next/lib/signal-dashboards.ts      |  9 ++++++-
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/web-next/lib/signal-dashboards.test.ts 
b/web-next/lib/signal-dashboards.test.ts
index 3faeff5d7a..4e92b21bb9 100644
--- a/web-next/lib/signal-dashboards.test.ts
+++ b/web-next/lib/signal-dashboards.test.ts
@@ -3399,6 +3399,49 @@ describe('signal dashboards API client', () => {
     
expect(renderer.rows[0]?.relatedHandoffHref).not.toContain('resourceFilter=operation');
   });
 
+  it('maps trace http route groups to operation drilldown without creating 
route entities', async () => {
+    const [plan] = buildSignalDashboardExecutionPlans({
+      dashboardKey: 'signals-overview',
+      title: 'Signals overview',
+      description: 'Signals',
+      tags: 'traces',
+      layout: '[]',
+      widgets: JSON.stringify([
+        {
+          id: 'traces-routes',
+          signal: 'traces',
+          title: 'Routes',
+          visualization: 'list',
+          route: 
'/trace/manage?serviceName=checkout&serviceNamespace=payments&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&spanScope=all&groupBy=http.route&groupLimit=8'
+        }
+      ])
+    });
+
+    const result = await executeSignalDashboardPanelPlan(plan, async url => {
+      
expect(url).toBe('/traces/stats/group-by?serviceName=checkout&spanScope=all&entityId=4200&entityType=service&serviceNamespace=payments&environment=prod&groupBy=http.route&limit=8');
+      return {
+        groupBy: 'http.route',
+        groups: [{
+          value: 'POST /checkout',
+          traceCount: 7,
+          errorTraceCount: 1,
+          latencyP95Ms: 180
+        }]
+      };
+    });
+    const renderer = buildSignalDashboardPanelRuntimeRenderDescriptor(plan, 
result);
+
+    expect(renderer.rows[0]).toEqual(expect.objectContaining({
+      key: 'traces-routes:group:0',
+      title: 'POST /checkout',
+      copy: '7 traces · 1 errors',
+      meta: 'http.route · p95 180ms',
+      relatedSignal: 'traces',
+      relatedHandoffHref: 
'/trace/manage?serviceName=checkout&spanScope=all&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&serviceNamespace=payments&source=otlp&collector=collector-a&template=spring-boot&view=list&operationName=POST+%2Fcheckout'
+    }));
+    
expect(renderer.rows[0]?.relatedHandoffHref).not.toContain('resourceFilter=http.route');
+  });
+
   it('renders backend-compatible trace group payload variants', async () => {
     const [plan] = buildSignalDashboardExecutionPlans({
       dashboardKey: 'signals-overview',
diff --git a/web-next/lib/signal-dashboards.ts 
b/web-next/lib/signal-dashboards.ts
index 1dd6c6f853..28ef5a52f6 100644
--- a/web-next/lib/signal-dashboards.ts
+++ b/web-next/lib/signal-dashboards.ts
@@ -2601,7 +2601,14 @@ function buildTraceGroupResourceExpression(groupBy: 
string, value: string) {
   if (normalizedGroupBy === 'service.name' || normalizedGroupBy === 
'service_name') {
     return { kind: 'service' as const, value: normalizedValue };
   }
-  if (normalizedGroupBy === 'operation' || normalizedGroupBy === 
'operation.name' || normalizedGroupBy === 'span.name') {
+  if (
+    normalizedGroupBy === 'operation' ||
+    normalizedGroupBy === 'operation.name' ||
+    normalizedGroupBy === 'span.name' ||
+    normalizedGroupBy === 'http.route' ||
+    normalizedGroupBy === 'route' ||
+    normalizedGroupBy === 'attribute:http.route'
+  ) {
     return { kind: 'operation' as const, value: normalizedValue };
   }
   if (normalizedGroupBy === 'status') {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to