@@ -451,6 +451,17 @@ function buildMetricFilterExpression(name: string, value: string | undefined) {
451451 return `${ trimmedName } ="${ escapeMetricFilterValue ( trimmedValue ) } "` ;
452452}
453453
454+ function buildLogAttributeFilterExpression ( name : string , value : string | undefined ) {
455+ const trimmedName = name . trim ( ) ;
456+ const trimmedValue = value ?. trim ( ) ;
457+ if ( ! / ^ [ A - Z a - z 0 - 9 _ . : - ] + $ / . test ( trimmedName ) || ! trimmedValue || trimmedValue === '-' ) return undefined ;
458+ return `${ trimmedName } ="${ escapeMetricFilterValue ( trimmedValue ) } "` ;
459+ }
460+
461+ function mergeTraceLogAttributeFilters ( currentFilter : string | null | undefined , nextFilter : string | undefined ) {
462+ return [ currentFilter ?. trim ( ) , nextFilter ?. trim ( ) ] . filter ( Boolean ) . join ( ' and ' ) || undefined ;
463+ }
464+
454465function buildTraceMetricsResourceFilter ( detail : TraceDetail | null , selectedSpan : TraceSpanNode | null ) {
455466 const expressions = [
456467 buildMetricFilterExpression ( 'k8s.namespace.name' , readTraceSignalAttribute (
@@ -488,6 +499,19 @@ function buildTraceMetricsResourceFilter(detail: TraceDetail | null, selectedSpa
488499 . join ( ' and ' ) ;
489500}
490501
502+ function buildTraceLogsOperationAttributeFilter (
503+ detail : TraceDetail | null ,
504+ selectedSpan : TraceSpanNode | null ,
505+ operationName : string | undefined ,
506+ traceId : string | undefined ,
507+ spanId : string | undefined
508+ ) {
509+ if ( traceId || spanId ) return undefined ;
510+ const httpRoute = readTraceSignalAttribute ( detail , selectedSpan , 'http.route' , 'http_route' ) ;
511+ if ( httpRoute ) return buildLogAttributeFilterExpression ( 'http.route' , httpRoute ) ;
512+ return buildLogAttributeFilterExpression ( 'span.name' , firstText ( selectedSpan ?. spanName , detail ?. rootSpanName , operationName ) ) ;
513+ }
514+
491515function durationNanosToWholeMillis ( value ?: number | null ) {
492516 if ( value == null || ! Number . isFinite ( value ) || value < 0 ) return undefined ;
493517 const millis = value / 1_000_000 ;
@@ -895,6 +919,15 @@ export function buildTraceHandoffLinks(
895919 if ( traceId ) logsParams . set ( 'traceId' , traceId ) ;
896920 if ( spanId ) logsParams . set ( 'spanId' , spanId ) ;
897921 appendSignalRouteContext ( logsParams , logsContext ) ;
922+ const logOperationAttributeFilter = buildTraceLogsOperationAttributeFilter (
923+ detail ,
924+ selectedSpan ,
925+ operationName ,
926+ traceId ,
927+ spanId
928+ ) ;
929+ const mergedLogAttributeFilter = mergeTraceLogAttributeFilters ( logsParams . get ( 'attributeFilter' ) , logOperationAttributeFilter ) ;
930+ if ( mergedLogAttributeFilter ) logsParams . set ( 'attributeFilter' , mergedLogAttributeFilter ) ;
898931
899932 const metricsParams = new URLSearchParams ( ) ;
900933 if ( traceId ) metricsParams . set ( 'traceId' , traceId ) ;
0 commit comments