From 56eba06508b44b136a398b018fc0e33655618f51 Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Wed, 12 Nov 2025 12:16:14 +0100 Subject: [PATCH 1/3] Add SearchUsecase result logs --- .../Search/SearchUsecase.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs b/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs index 2c81517f6..c090336b7 100644 --- a/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs +++ b/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs @@ -2,17 +2,14 @@ // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information +using Microsoft.Extensions.Logging; + namespace Elastic.Documentation.Api.Core.Search; -public class SearchUsecase(ISearchGateway searchGateway) +public class SearchUsecase(ISearchGateway searchGateway, Logger logger) { public async Task Search(SearchRequest request, Cancel ctx = default) { - - // var validationResult = validator.Validate(request); - // if (!validationResult.IsValid) - // throw new ArgumentException(validationResult.Message); - var (totalHits, results) = await searchGateway.SearchAsync( request.Query, request.PageNumber, @@ -20,14 +17,22 @@ public async Task Search(SearchRequest request, Cancel ctx = def ctx ); - - return new SearchResponse + var response = new SearchResponse { Results = results, TotalResults = totalHits, PageNumber = request.PageNumber, PageSize = request.PageSize, }; + + logger.LogInformation("Search completed: {search.result.page_size} results for query '{search.query.text}' (Page {search.result.page_number}): {search.result.urls}", + response.PageSize, + request.Query, + response.PageNumber, + response.Results.Select(result => result.Url) + ); + + return response; } } From bc8b1d3f497043e05966a5923d1c4f7ac415717b Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Wed, 12 Nov 2025 12:30:44 +0100 Subject: [PATCH 2/3] Update src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs Co-authored-by: Martijn Laarman --- src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs b/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs index c090336b7..1f561aefc 100644 --- a/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs +++ b/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs @@ -6,7 +6,7 @@ namespace Elastic.Documentation.Api.Core.Search; -public class SearchUsecase(ISearchGateway searchGateway, Logger logger) +public class SearchUsecase(ISearchGateway searchGateway, ILogger logger) { public async Task Search(SearchRequest request, Cancel ctx = default) { From b7f23e131361a5ca5cdd81c5ef8dfd27ebe49e5c Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Wed, 12 Nov 2025 13:33:54 +0100 Subject: [PATCH 3/3] Use LogProperties --- Directory.Packages.props | 1 + .../Elastic.Documentation.Api.Core.csproj | 1 + .../Search/SearchUsecase.cs | 16 +++++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index b08adf805..d763730cd 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -26,6 +26,7 @@ + diff --git a/src/api/Elastic.Documentation.Api.Core/Elastic.Documentation.Api.Core.csproj b/src/api/Elastic.Documentation.Api.Core/Elastic.Documentation.Api.Core.csproj index a4ad652a2..e9392cb10 100644 --- a/src/api/Elastic.Documentation.Api.Core/Elastic.Documentation.Api.Core.csproj +++ b/src/api/Elastic.Documentation.Api.Core/Elastic.Documentation.Api.Core.csproj @@ -10,6 +10,7 @@ + diff --git a/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs b/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs index 1f561aefc..49b23cb9f 100644 --- a/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs +++ b/src/api/Elastic.Documentation.Api.Core/Search/SearchUsecase.cs @@ -6,7 +6,7 @@ namespace Elastic.Documentation.Api.Core.Search; -public class SearchUsecase(ISearchGateway searchGateway, ILogger logger) +public partial class SearchUsecase(ISearchGateway searchGateway, ILogger logger) { public async Task Search(SearchRequest request, Cancel ctx = default) { @@ -25,15 +25,21 @@ public async Task Search(SearchRequest request, Cancel ctx = def PageSize = request.PageSize, }; - logger.LogInformation("Search completed: {search.result.page_size} results for query '{search.query.text}' (Page {search.result.page_number}): {search.result.urls}", + LogSearchResults( + logger, response.PageSize, - request.Query, response.PageNumber, - response.Results.Select(result => result.Url) - ); + request.Query, + new SearchResultsLogProperties(results.Select(i => i.Url).ToArray()) + ); return response; } + + [LoggerMessage(Level = LogLevel.Information, Message = "Search completed with {PageSize} (page {PageNumber}) results for query '{SearchQuery}'")] + private static partial void LogSearchResults(ILogger logger, int pageSize, int pageNumber, string searchQuery, [LogProperties] SearchResultsLogProperties result); + + private sealed record SearchResultsLogProperties(string[] Urls); } public record SearchRequest