@@ -46,9 +46,9 @@ internal sealed class TelemetryApiService(
4646 var spanFilters = new List < TelemetryFilter > ( ) ;
4747 var searchTextFragments = ParseAndApplySearchFilters ( search , spanFilters , AddSpanFiltersFromQualifiers , key => ResolveSpanFieldKey ( key ) is not null ) ;
4848
49- // Get spans for all resource keys
49+ // Get spans for all resource keys (empty list means no filter / all resources)
5050 var allSpans = new List < OtlpSpan > ( ) ;
51- foreach ( var resourceKey in resourceKeys )
51+ foreach ( var resourceKey in resourceKeys . Count > 0 ? resourceKeys . Select ( k => ( ResourceKey ? ) k ) : [ null ] )
5252 {
5353 var result = telemetryRepository . GetSpans ( new GetSpansRequest
5454 {
@@ -103,9 +103,9 @@ internal sealed class TelemetryApiService(
103103 var traceFilters = new List < TelemetryFilter > ( ) ;
104104 var searchTextFragments = ParseAndApplySearchFilters ( search , traceFilters , AddSpanFiltersFromQualifiers , key => ResolveSpanFieldKey ( key ) is not null ) ;
105105
106- // Get traces for all resource keys
106+ // Get traces for all resource keys (empty list means no filter / all resources)
107107 var allTraces = new List < OtlpTrace > ( ) ;
108- foreach ( var resourceKey in resourceKeys )
108+ foreach ( var resourceKey in resourceKeys . Count > 0 ? resourceKeys . Select ( k => ( ResourceKey ? ) k ) : [ null ] )
109109 {
110110 var result = telemetryRepository . GetTraces ( new GetTracesRequest
111111 {
@@ -222,8 +222,9 @@ internal sealed class TelemetryApiService(
222222 var searchTextFragments = ParseAndApplySearchFilters ( search , filters , AddLogFiltersFromQualifiers , key => ResolveLogFieldKey ( key ) is not null ) ;
223223
224224 // Get logs for all resource keys
225+ // Get logs for all resource keys (empty list means no filter / all resources)
225226 var allLogs = new List < OtlpLogEntry > ( ) ;
226- foreach ( var resourceKey in resourceKeys )
227+ foreach ( var resourceKey in resourceKeys . Count > 0 ? resourceKeys . Select ( k => ( ResourceKey ? ) k ) : [ null ] )
227228 {
228229 var result = telemetryRepository . GetLogs ( new GetLogsContext
229230 {
@@ -278,7 +279,7 @@ public async IAsyncEnumerable<string> FollowSpansAsync(
278279 // Build the watch request with all filters pushed into the repository
279280 var watchRequest = new WatchSpansRequest
280281 {
281- ResourceKey = resourceKeys is { Count : 1 } ? resourceKeys [ 0 ] : null ,
282+ ResourceKey = resourceKeys is [ var singleKey ] ? singleKey : null ,
282283 Filters = spanFilters ,
283284 TraceId = traceId ,
284285 HasError = hasError ,
@@ -291,7 +292,7 @@ public async IAsyncEnumerable<string> FollowSpansAsync(
291292 // Multi-resource filtering: repository only supports single ResourceKey,
292293 // so for multi-resource queries we filter here.
293294 if ( resourceKeys is { Count : > 1 } &&
294- ! resourceKeys . Any ( k => k ? . EqualsCompositeName ( span . Source . ResourceKey . GetCompositeName ( ) ) == true ) )
295+ ! resourceKeys . Any ( k => k . EqualsCompositeName ( span . Source . ResourceKey . GetCompositeName ( ) ) ) )
295296 {
296297 continue ;
297298 }
@@ -348,7 +349,7 @@ public async IAsyncEnumerable<string> FollowLogsAsync(
348349 // Build the watch request with all filters pushed into the repository
349350 var watchRequest = new WatchLogsRequest
350351 {
351- ResourceKey = resourceKeys is { Count : 1 } ? resourceKeys [ 0 ] : null ,
352+ ResourceKey = resourceKeys is [ var singleKey ] ? singleKey : null ,
352353 Filters = filters ,
353354 TextFragments = searchTextFragments
354355 } ;
@@ -359,7 +360,7 @@ public async IAsyncEnumerable<string> FollowLogsAsync(
359360 // Multi-resource filtering: repository only supports single ResourceKey,
360361 // so for multi-resource queries we filter here.
361362 if ( resourceKeys is { Count : > 1 } &&
362- ! resourceKeys . Any ( k => k ? . EqualsCompositeName ( log . ResourceView . ResourceKey . GetCompositeName ( ) ) == true ) )
363+ ! resourceKeys . Any ( k => k . EqualsCompositeName ( log . ResourceView . ResourceKey . GetCompositeName ( ) ) ) )
363364 {
364365 continue ;
365366 }
@@ -551,8 +552,14 @@ private static void AddSpanFiltersFromQualifiers(SearchFilter parsedSearch, List
551552 /// to pick up data once the resource is first seen.
552553 /// Throws OperationCanceledException if cancellation is triggered before the resources appear.
553554 /// </summary>
554- private async Task < List < ResourceKey ? > > WaitForResourceKeysAsync ( string [ ] ? resourceNames , CancellationToken cancellationToken )
555+ private async Task < List < ResourceKey > > WaitForResourceKeysAsync ( string [ ] ? resourceNames , CancellationToken cancellationToken )
555556 {
557+ if ( resourceNames is null || resourceNames . Length == 0 )
558+ {
559+ // No filter - return immediately without allocating a channel or subscription.
560+ return [ ] ;
561+ }
562+
556563 // Subscribe before the first check so no notification can be missed between
557564 // GetResources() and the subscription registration.
558565 var signal = Channel . CreateBounded < bool > ( new BoundedChannelOptions ( 1 ) { FullMode = BoundedChannelFullMode . DropOldest } ) ;
@@ -577,24 +584,23 @@ private static void AddSpanFiltersFromQualifiers(SearchFilter parsedSearch, List
577584 /// <summary>
578585 /// Resolves resource names to ResourceKeys.
579586 /// Returns null if any specified resource is not found.
580- /// If no resources are specified, returns a list with a single null key (no filter ).
587+ /// Returns an empty list when no resource filter is specified (meaning all resources ).
581588 /// </summary>
582- private static List < ResourceKey ? > ? ResolveResourceKeys ( IReadOnlyList < OtlpResource > resources , string [ ] ? resourceNames )
589+ private static List < ResourceKey > ? ResolveResourceKeys ( IReadOnlyList < OtlpResource > resources , string [ ] ? resourceNames )
583590 {
584591 if ( resourceNames is null || resourceNames . Length == 0 )
585592 {
586- // No filter - return a list with null to indicate "all resources"
587- return [ null ] ;
593+ return [ ] ;
588594 }
589595
590- var keys = new List < ResourceKey ? > ( ) ;
596+ var keys = new List < ResourceKey > ( ) ;
591597 foreach ( var resourceName in resourceNames )
592598 {
593599 if ( ! AIHelpers . TryResolveResourceForTelemetry ( resources , resourceName , out _ , out var resourceKey ) )
594600 {
595601 return null ;
596602 }
597- keys . Add ( resourceKey ) ;
603+ keys . Add ( resourceKey ! . Value ) ;
598604 }
599605 return keys ;
600606 }
0 commit comments