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 4283a1c29f Preserve environment context in signal handoffs
4283a1c29f is described below

commit 4283a1c29f36cb1fb111ad2340e3e72a08921504
Author: Logic <[email protected]>
AuthorDate: Tue Jun 9 19:06:51 2026 +0800

    Preserve environment context in signal handoffs
---
 web-next/lib/signal-dashboards.test.ts | 28 ++++++++++----
 web-next/lib/signal-dashboards.ts      | 70 ++++++++++++++++++++++++++++------
 2 files changed, 79 insertions(+), 19 deletions(-)

diff --git a/web-next/lib/signal-dashboards.test.ts 
b/web-next/lib/signal-dashboards.test.ts
index 6b85963243..24bd7d55a9 100644
--- a/web-next/lib/signal-dashboards.test.ts
+++ b/web-next/lib/signal-dashboards.test.ts
@@ -1845,6 +1845,7 @@ describe('signal dashboards API client', () => {
           resource: {
             'service.name': 'checkout',
             'service.namespace': 'payments',
+            'deployment.environment.name': 'prod',
             'hertzbeat.entity_id': '4200',
             'hertzbeat.entity_type': 'service',
             'hertzbeat.entity_name': 'Checkout API',
@@ -1867,6 +1868,7 @@ describe('signal dashboards API client', () => {
           resourceAttributes: {
             'service.name': 'checkout',
             'service.namespace': 'payments',
+            'deployment.environment.name': 'prod',
             'hertzbeat.entity_id': '4200',
             'hertzbeat.entity_type': 'service',
             'hertzbeat.entity_name': 'Checkout API',
@@ -1907,6 +1909,7 @@ describe('signal dashboards API client', () => {
                 __name__: 'signoz_db_latency_count',
                 'service.name': 'checkout',
                 'service.namespace': 'payments',
+                'deployment.environment.name': 'prod',
                 'hertzbeat.entity_id': '4200',
                 'hertzbeat.entity_type': 'service',
                 'hertzbeat.entity_name': 'Checkout API',
@@ -1976,11 +1979,12 @@ describe('signal dashboards API client', () => {
           breakoutAttributes: expect.arrayContaining([
             expect.objectContaining({ name: 'resource:service.name', value: 
'checkout' }),
             expect.objectContaining({ name: 'resource:service.namespace', 
value: 'payments' }),
+            expect.objectContaining({ name: 
'resource:deployment.environment.name', value: 'prod' }),
             expect.objectContaining({ name: 'resource:hertzbeat.entity_name', 
value: 'Checkout API' }),
             expect.objectContaining({ name: 'resource:hertzbeat.source', 
value: 'otlp' })
           ]),
           relatedSignal: 'traces',
-          relatedHandoffHref: 
'/trace/manage?traceId=trace-1&view=trace&spanId=span-log&serviceName=checkout&serviceNamespace=payments&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
+          relatedHandoffHref: 
'/trace/manage?traceId=trace-1&view=trace&spanId=span-log&serviceName=checkout&serviceNamespace=payments&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
         }),
         expect.objectContaining({
           panelId: 'trace-panel',
@@ -1995,11 +1999,12 @@ describe('signal dashboards API client', () => {
           breakoutAttributes: expect.arrayContaining([
             expect.objectContaining({ name: 'resource:service.name', value: 
'checkout' }),
             expect.objectContaining({ name: 'resource:service.namespace', 
value: 'payments' }),
+            expect.objectContaining({ name: 
'resource:deployment.environment.name', value: 'prod' }),
             expect.objectContaining({ name: 'resource:hertzbeat.entity_name', 
value: 'Checkout API' }),
             expect.objectContaining({ name: 'resource:hertzbeat.source', 
value: 'otlp' })
           ]),
           relatedSignal: 'logs',
-          relatedHandoffHref: 
'/log/manage?traceId=trace-1&view=list&spanId=span-root&serviceName=checkout&serviceNamespace=payments&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
+          relatedHandoffHref: 
'/log/manage?traceId=trace-1&view=list&spanId=span-root&serviceName=checkout&serviceNamespace=payments&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
         }),
         expect.objectContaining({
           panelId: 'trace-panel',
@@ -2014,11 +2019,12 @@ describe('signal dashboards API client', () => {
           breakoutAttributes: expect.arrayContaining([
             expect.objectContaining({ name: 'resource:service.name', value: 
'checkout' }),
             expect.objectContaining({ name: 'resource:service.namespace', 
value: 'payments' }),
+            expect.objectContaining({ name: 
'resource:deployment.environment.name', value: 'prod' }),
             expect.objectContaining({ name: 'resource:hertzbeat.entity_name', 
value: 'Checkout API' }),
             expect.objectContaining({ name: 'resource:hertzbeat.source', 
value: 'otlp' })
           ]),
           relatedSignal: 'logs',
-          relatedHandoffHref: 
'/log/manage?traceId=trace-1&view=list&spanId=span-root&serviceName=checkout&serviceNamespace=payments&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
+          relatedHandoffHref: 
'/log/manage?traceId=trace-1&view=list&spanId=span-root&serviceName=checkout&serviceNamespace=payments&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
         }),
         expect.objectContaining({ panelId: 'metrics-panel', signal: 'metrics', 
source: 'metrics-point', label: 'cpu.usage', value: '0.5' }),
         expect.objectContaining({
@@ -2031,7 +2037,7 @@ describe('signal dashboards API client', () => {
           serviceNamespace: 'payments',
           resourceFilter: 'db.system=postgresql',
           relatedSignal: 'traces',
-          relatedHandoffHref: 
'/trace/manage?view=list&spanScope=all&serviceName=checkout&serviceNamespace=payments&resourceFilter=db.system%3Dpostgresql&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
+          relatedHandoffHref: 
'/trace/manage?view=list&spanScope=all&serviceName=checkout&serviceNamespace=payments&resourceFilter=db.system%3Dpostgresql&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000'
         }),
         expect.objectContaining({
           panelId: 'external-metrics-panel',
@@ -2062,6 +2068,7 @@ describe('signal dashboards API client', () => {
     expect(buildSignalDashboardRuntimeEvidenceFilters([
       { name: 'service.name', type: 'query', value: '' },
       { name: 'service.namespace', type: 'query', value: '' },
+      { name: 'deployment.environment.name', type: 'query', value: '' },
       { name: 'hertzbeat.entity_id', type: 'textbox', value: '' },
       { name: 'hertzbeat.entity_name', type: 'query', value: '' },
       { name: 'hertzbeat.source', type: 'dynamic', value: '' },
@@ -2072,6 +2079,7 @@ describe('signal dashboards API client', () => {
     ], syncTooltip.rows[0])).toEqual([
       expect.objectContaining({ variableName: 'service.name', value: 
'checkout', source: 'service' }),
       expect.objectContaining({ variableName: 'service.namespace', value: 
'payments', source: 'serviceNamespace' }),
+      expect.objectContaining({ variableName: 'deployment.environment.name', 
value: 'prod', source: 'environment' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_id', value: 
'4200', source: 'entityId' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_name', value: 
'Checkout API', source: 'entityName' }),
       expect.objectContaining({ variableName: 'hertzbeat.source', value: 
'otlp', source: 'signalSource' }),
@@ -2089,6 +2097,7 @@ describe('signal dashboards API client', () => {
     expect(buildSignalDashboardRuntimeEvidenceFilters([
       { name: 'service.name', type: 'query', value: '' },
       { name: 'service.namespace', type: 'query', value: '' },
+      { name: 'deployment.environment.name', type: 'query', value: '' },
       { name: 'hertzbeat.entity_id', type: 'textbox', value: '' },
       { name: 'hertzbeat.entity_name', type: 'query', value: '' },
       { name: 'hertzbeat.source', type: 'dynamic', value: '' },
@@ -2097,6 +2106,7 @@ describe('signal dashboards API client', () => {
     ], syncTooltip.rows[4])).toEqual([
       expect.objectContaining({ variableName: 'service.name', value: 
'checkout', source: 'service' }),
       expect.objectContaining({ variableName: 'service.namespace', value: 
'payments', source: 'serviceNamespace' }),
+      expect.objectContaining({ variableName: 'deployment.environment.name', 
value: 'prod', source: 'environment' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_id', value: 
'4200', source: 'entityId' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_name', value: 
'Checkout API', source: 'entityName' }),
       expect.objectContaining({ variableName: 'hertzbeat.source', value: 
'otlp', source: 'signalSource' }),
@@ -2106,6 +2116,7 @@ describe('signal dashboards API client', () => {
     expect(buildSignalDashboardRuntimeEvidenceFilterSuggestions([], 
syncTooltip.rows[0])).toEqual([
       expect.objectContaining({ variableName: 'service.name', value: 
'checkout', source: 'service', variableType: 'query' }),
       expect.objectContaining({ variableName: 'service.namespace', value: 
'payments', source: 'serviceNamespace', variableType: 'query' }),
+      expect.objectContaining({ variableName: 'deployment.environment.name', 
value: 'prod', source: 'environment', variableType: 'query' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_id', value: 
'4200', source: 'entityId', variableType: 'textbox' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_name', value: 
'Checkout API', source: 'entityName', variableType: 'query' }),
       expect.objectContaining({ variableName: 'hertzbeat.source', value: 
'otlp', source: 'signalSource', variableType: 'dynamic' }),
@@ -2117,6 +2128,7 @@ describe('signal dashboards API client', () => {
     expect(buildSignalDashboardRuntimeEvidenceFilterSuggestions([
       { name: 'service.name', type: 'query', value: '' },
       { name: 'service.namespace', type: 'query', value: '' },
+      { name: 'deployment.environment.name', type: 'query', value: '' },
       { name: 'hertzbeat.entity_id', type: 'textbox', value: '' },
       { name: 'hertzbeat.entity_name', type: 'query', value: '' },
       { name: 'hertzbeat.source', type: 'dynamic', value: '' },
@@ -2129,6 +2141,7 @@ describe('signal dashboards API client', () => {
     expect(buildSignalDashboardRuntimeEvidenceFilterSuggestions([], 
syncTooltip.rows[4])).toEqual([
       expect.objectContaining({ variableName: 'service.name', value: 
'checkout', source: 'service', variableType: 'query' }),
       expect.objectContaining({ variableName: 'service.namespace', value: 
'payments', source: 'serviceNamespace', variableType: 'query' }),
+      expect.objectContaining({ variableName: 'deployment.environment.name', 
value: 'prod', source: 'environment', variableType: 'query' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_id', value: 
'4200', source: 'entityId', variableType: 'textbox' }),
       expect.objectContaining({ variableName: 'hertzbeat.entity_name', value: 
'Checkout API', source: 'entityName', variableType: 'query' }),
       expect.objectContaining({ variableName: 'hertzbeat.source', value: 
'otlp', source: 'signalSource', variableType: 'dynamic' }),
@@ -2138,6 +2151,7 @@ describe('signal dashboards API client', () => {
     expect(syncTooltip.rows[4].breakoutAttributes).toEqual([
       expect.objectContaining({ name: 'service.name', value: 'checkout' }),
       expect.objectContaining({ name: 'service.namespace', value: 'payments' 
}),
+      expect.objectContaining({ name: 'deployment.environment.name', value: 
'prod' }),
       expect.objectContaining({ name: 'hertzbeat.entity_id', value: '4200' }),
       expect.objectContaining({ name: 'hertzbeat.entity_type', value: 
'service' }),
       expect.objectContaining({ name: 'hertzbeat.entity_name', value: 
'Checkout API' }),
@@ -2158,15 +2172,15 @@ describe('signal dashboards API client', () => {
     
expect(buildSignalDashboardRuntimeEvidenceSourceHandoff('/log/manage?view=table',
 syncTooltip.rows[0], {
       timeRange: { start: '1000', end: '3000' },
       returnTo: '/dashboard?start=1000&end=3000'
-    
})).toBe('/log/manage?view=table&traceId=trace-1&spanId=span-log&serviceName=checkout&serviceNamespace=payments&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000');
+    
})).toBe('/log/manage?view=table&traceId=trace-1&spanId=span-log&serviceName=checkout&serviceNamespace=payments&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000');
     
expect(buildSignalDashboardRuntimeEvidenceSourceHandoff('/trace/manage?view=list',
 syncTooltip.rows[4], {
       timeRange: { start: '1000', end: '3000' },
       returnTo: '/dashboard?start=1000&end=3000'
-    
})).toBe('/trace/manage?view=list&serviceName=checkout&serviceNamespace=payments&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000');
+    
})).toBe('/trace/manage?view=list&serviceName=checkout&serviceNamespace=payments&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000');
     
expect(buildSignalDashboardRuntimeEvidenceSourceHandoff('/trace/manage?serviceName=payments',
 syncTooltip.rows[2], {
       timeRange: { start: '1000', end: '3000' },
       returnTo: '/dashboard?start=1000&end=3000'
-    
})).toBe('/trace/manage?serviceName=payments&traceId=trace-1&spanId=span-root&serviceNamespace=payments&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000');
+    
})).toBe('/trace/manage?serviceName=payments&traceId=trace-1&spanId=span-root&serviceNamespace=payments&environment=prod&entityId=4200&entityType=service&entityName=Checkout+API&source=otlp&collector=collector-a&template=spring-boot&returnTo=%2Fdashboard%3Fstart%3D1000%26end%3D3000&start=1000&end=3000');
     
expect(buildSignalDashboardRuntimeEvidenceSourceHandoff('/ingestion/otlp/metrics?query=cpu.usage',
 syncTooltip.rows[3], {
       timeRange: { start: '1000', end: '3000' },
       returnTo: '/dashboard?start=1000&end=3000'
diff --git a/web-next/lib/signal-dashboards.ts 
b/web-next/lib/signal-dashboards.ts
index 09388d4cbe..7ccc790c06 100644
--- a/web-next/lib/signal-dashboards.ts
+++ b/web-next/lib/signal-dashboards.ts
@@ -307,6 +307,7 @@ export type SignalDashboardRuntimeMetricsTooltip = {
 export type SignalDashboardRuntimeEvidenceFilterSource =
   | 'service'
   | 'serviceNamespace'
+  | 'environment'
   | 'traceId'
   | 'spanId'
   | 'entityId'
@@ -3331,12 +3332,54 @@ function syncTooltipIdentifier(value: string | 
undefined) {
   return trimmed;
 }
 
+function syncTooltipBreakoutValue(attributes: 
SignalDashboardRuntimeBreakoutAttribute[] | undefined, names: string[]) {
+  const normalizedNames = new Set(names.flatMap(name => {
+    const normalizedName = normalizeBreakoutAttributeName(name);
+    return normalizedName
+      ? [normalizedName, `resource:${normalizedName}`, 
`attribute:${normalizedName}`]
+      : [];
+  }));
+  return syncTooltipIdentifier(attributes
+    ?.find(attribute => 
normalizedNames.has(normalizeBreakoutAttributeName(attribute.name)))
+    ?.value);
+}
+
+function syncTooltipRelatedContextFromBreakoutAttributes(attributes: 
SignalDashboardRuntimeBreakoutAttribute[] | undefined) {
+  return {
+    environment: syncTooltipBreakoutValue(attributes, 
['deployment.environment.name', 'environment']),
+    entityId: syncTooltipBreakoutValue(attributes, ['hertzbeat.entity_id', 
'hertzbeat.entity.id', 'entity.id', 'entity_id']),
+    entityType: syncTooltipBreakoutValue(attributes, ['hertzbeat.entity_type', 
'hertzbeat.entity.type', 'entity.type', 'entity_type']),
+    entityName: syncTooltipBreakoutValue(attributes, ['hertzbeat.entity_name', 
'hertzbeat.entity.name', 'entity.name', 'entity_name']),
+    signalSource: syncTooltipBreakoutValue(attributes, ['hertzbeat.source', 
'source', 'signal.source']),
+    collector: syncTooltipBreakoutValue(attributes, ['hertzbeat.collector', 
'collector']),
+    template: syncTooltipBreakoutValue(attributes, ['hertzbeat.template', 
'template'])
+  };
+}
+
+function applySyncTooltipRelatedContext(params: URLSearchParams, context: 
ReturnType<typeof syncTooltipRelatedContextFromBreakoutAttributes>) {
+  if (context.environment) params.set('environment', context.environment);
+  if (context.entityId) params.set('entityId', context.entityId);
+  if (context.entityType) params.set('entityType', context.entityType);
+  if (context.entityName) params.set('entityName', context.entityName);
+  if (context.signalSource) params.set('source', context.signalSource);
+  if (context.collector) params.set('collector', context.collector);
+  if (context.template) params.set('template', context.template);
+}
+
 function syncTooltipRelatedHandoff(
   signal: string,
   traceId: string,
   spanId: string,
   options: SignalDashboardRuntimeSyncTooltipOptions = {},
-  context: { serviceName?: string; serviceNamespace?: string } = {}
+  context: { serviceName?: string; serviceNamespace?: string } & 
ReturnType<typeof syncTooltipRelatedContextFromBreakoutAttributes> = {
+    environment: '',
+    entityId: '',
+    entityType: '',
+    entityName: '',
+    signalSource: '',
+    collector: '',
+    template: ''
+  }
 ) {
   const nextTraceId = syncTooltipIdentifier(traceId);
   if (!nextTraceId) return {};
@@ -3351,6 +3394,7 @@ function syncTooltipRelatedHandoff(
     if (nextSpanId) params.set('spanId', nextSpanId);
     if (serviceName) params.set('serviceName', serviceName);
     if (serviceNamespace) params.set('serviceNamespace', serviceNamespace);
+    applySyncTooltipRelatedContext(params, context);
     return {
       traceId: nextTraceId,
       ...(nextSpanId ? { spanId: nextSpanId } : {}),
@@ -3368,6 +3412,7 @@ function syncTooltipRelatedHandoff(
     if (nextSpanId) params.set('spanId', nextSpanId);
     if (serviceName) params.set('serviceName', serviceName);
     if (serviceNamespace) params.set('serviceNamespace', serviceNamespace);
+    applySyncTooltipRelatedContext(params, context);
     return {
       traceId: nextTraceId,
       ...(nextSpanId ? { spanId: nextSpanId } : {}),
@@ -3499,6 +3544,7 @@ function syncTooltipMetricRelatedHandoff(
 
 const SERVICE_VARIABLE_NAMES = new Set(['service.name', 'servicename', 
'service']);
 const SERVICE_NAMESPACE_VARIABLE_NAMES = new Set(['service.namespace', 
'servicenamespace', 'service_namespace']);
+const ENVIRONMENT_VARIABLE_NAMES = new Set(['deployment.environment.name', 
'deployment_environment_name', 'environment']);
 const TRACE_ID_VARIABLE_NAMES = new Set(['traceid', 'trace.id', 'trace_id']);
 const SPAN_ID_VARIABLE_NAMES = new Set(['spanid', 'span.id', 'span_id']);
 const ENTITY_ID_VARIABLE_NAMES = new Set(['hertzbeat.entity_id', 
'hertzbeat.entity.id', 'entityid', 'entity.id', 'entity_id']);
@@ -3512,6 +3558,7 @@ function evidenceFilterSourceForVariableName(name: 
string): SignalDashboardRunti
   const normalizedName = 
normalizeSignalDashboardVariableName(name).toLowerCase();
   if (SERVICE_VARIABLE_NAMES.has(normalizedName)) return 'service';
   if (SERVICE_NAMESPACE_VARIABLE_NAMES.has(normalizedName)) return 
'serviceNamespace';
+  if (ENVIRONMENT_VARIABLE_NAMES.has(normalizedName)) return 'environment';
   if (TRACE_ID_VARIABLE_NAMES.has(normalizedName)) return 'traceId';
   if (SPAN_ID_VARIABLE_NAMES.has(normalizedName)) return 'spanId';
   if (ENTITY_ID_VARIABLE_NAMES.has(normalizedName)) return 'entityId';
@@ -3524,21 +3571,14 @@ function evidenceFilterSourceForVariableName(name: 
string): SignalDashboardRunti
 }
 
 function breakoutValue(row: SignalDashboardRuntimeSyncTooltipRow, names: 
string[]) {
-  const normalizedNames = new Set(names.flatMap(name => {
-    const normalizedName = normalizeBreakoutAttributeName(name);
-    return normalizedName
-      ? [normalizedName, `resource:${normalizedName}`, 
`attribute:${normalizedName}`]
-      : [];
-  }));
-  return syncTooltipIdentifier(row.breakoutAttributes
-    ?.find(attribute => 
normalizedNames.has(normalizeBreakoutAttributeName(attribute.name)))
-    ?.value);
+  return syncTooltipBreakoutValue(row.breakoutAttributes, names);
 }
 
 function evidenceFilterValues(row: SignalDashboardRuntimeSyncTooltipRow): 
Record<SignalDashboardRuntimeEvidenceFilterSource, string> {
   return {
     service: row.signal === 'metrics' ? syncTooltipIdentifier(row.serviceName) 
: row.signal === 'logs' || row.signal === 'traces' ? 
syncTooltipIdentifier(row.label) : '',
     serviceNamespace: syncTooltipIdentifier(row.serviceNamespace),
+    environment: breakoutValue(row, ['deployment.environment.name', 
'environment']),
     traceId: syncTooltipIdentifier(row.traceId),
     spanId: syncTooltipIdentifier(row.spanId),
     entityId: breakoutValue(row, ['hertzbeat.entity_id', 
'hertzbeat.entity.id', 'entity.id', 'entity_id']),
@@ -3568,6 +3608,9 @@ export function 
buildSignalDashboardRuntimeEvidenceSourceHandoff(
     if (valuesBySource.serviceNamespace && 
!url.searchParams.get('serviceNamespace')) {
       url.searchParams.set('serviceNamespace', 
valuesBySource.serviceNamespace);
     }
+    if (valuesBySource.environment && !url.searchParams.get('environment')) {
+      url.searchParams.set('environment', valuesBySource.environment);
+    }
     if (valuesBySource.entityId && !url.searchParams.get('entityId')) {
       url.searchParams.set('entityId', valuesBySource.entityId);
     }
@@ -3626,6 +3669,7 @@ export function 
buildSignalDashboardRuntimeEvidenceFilterSuggestions(
   const suggestions: { source: SignalDashboardRuntimeEvidenceFilterSource; 
variableName: string; variableType: SignalDashboardVariableType }[] = [
     { source: 'service', variableName: 'service.name', variableType: 'query' },
     { source: 'serviceNamespace', variableName: 'service.namespace', 
variableType: 'query' },
+    { source: 'environment', variableName: 'deployment.environment.name', 
variableType: 'query' },
     { source: 'entityId', variableName: 'hertzbeat.entity_id', variableType: 
'textbox' },
     { source: 'entityName', variableName: 'hertzbeat.entity_name', 
variableType: 'query' },
     { source: 'signalSource', variableName: 'hertzbeat.source', variableType: 
'dynamic' },
@@ -3694,7 +3738,8 @@ export function buildSignalDashboardRuntimeSyncTooltip(
         breakoutAttributes: row.breakoutAttributes,
         ...syncTooltipRelatedHandoff(renderer.signal, row.traceId, row.spanId, 
options, {
           serviceName: row.service,
-          serviceNamespace: row.serviceNamespace
+          serviceNamespace: row.serviceNamespace,
+          
...syncTooltipRelatedContextFromBreakoutAttributes(row.breakoutAttributes)
         })
       }));
     const waterfallRows = renderer.traceWaterfallRows
@@ -3712,7 +3757,8 @@ export function buildSignalDashboardRuntimeSyncTooltip(
         breakoutAttributes: row.breakoutAttributes,
         ...syncTooltipRelatedHandoff(renderer.signal, row.traceId, row.spanId, 
options, {
           serviceName: row.service,
-          serviceNamespace: row.serviceNamespace
+          serviceNamespace: row.serviceNamespace,
+          
...syncTooltipRelatedContextFromBreakoutAttributes(row.breakoutAttributes)
         })
       }));
     return [...metricRows, ...tableRows, ...waterfallRows];


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

Reply via email to