From 88f1e11d956d737c160884e91d4c18df4f3f7873 Mon Sep 17 00:00:00 2001 From: ahmettugur Date: Wed, 24 Jan 2024 19:12:37 +0300 Subject: [PATCH] Added OpenTelemetryTraceId, and Request Response middleware --- .../Common.Logging/Common.Logging.csproj | 2 +- .../Common.OpenTelemetry.csproj | 19 ++++---- .../OpenTelemetryTraceIdMiddleware.cs | 19 ++++++++ .../RequestAndResponseActivityMiddleware.cs | 44 +++++++++++++++++++ ...malApiCleanArchitecture.LogConsumer.csproj | 6 +-- ...malApiCleanArchitecture.Application.csproj | 4 +- ...ApiCleanArchitecture.Infrastructure.csproj | 4 +- ...malApiCleanArchitecture.Persistence.csproj | 6 +-- .../Extensions/WebApplicationExtensions.cs | 4 +- ...malApiCleanArchitecture.GrpcService.csproj | 6 +-- .../Extensions/WebApplicationExtensions.cs | 6 ++- ...imalApiCleanArchitecture.MinimalApi.csproj | 12 ++--- ...nArchitecture.Application.UnitTests.csproj | 6 +-- ...chitecture.Infrastructure.UnitTests.csproj | 6 +-- ...anArchitecture.Persistence.UnitTest.csproj | 6 +-- 15 files changed, 110 insertions(+), 40 deletions(-) create mode 100644 src/BuildingBlocks/Common.OpenTelemetry/Middlewares/OpenTelemetryTraceIdMiddleware.cs create mode 100644 src/BuildingBlocks/Common.OpenTelemetry/Middlewares/RequestAndResponseActivityMiddleware.cs diff --git a/src/BuildingBlocks/Common.Logging/Common.Logging.csproj b/src/BuildingBlocks/Common.Logging/Common.Logging.csproj index 903860b..594c007 100644 --- a/src/BuildingBlocks/Common.Logging/Common.Logging.csproj +++ b/src/BuildingBlocks/Common.Logging/Common.Logging.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/BuildingBlocks/Common.OpenTelemetry/Common.OpenTelemetry.csproj b/src/BuildingBlocks/Common.OpenTelemetry/Common.OpenTelemetry.csproj index 3132668..c8a6bd2 100644 --- a/src/BuildingBlocks/Common.OpenTelemetry/Common.OpenTelemetry.csproj +++ b/src/BuildingBlocks/Common.OpenTelemetry/Common.OpenTelemetry.csproj @@ -5,18 +5,21 @@ enable enable - - - - + + + + + + + - - - + + + - + diff --git a/src/BuildingBlocks/Common.OpenTelemetry/Middlewares/OpenTelemetryTraceIdMiddleware.cs b/src/BuildingBlocks/Common.OpenTelemetry/Middlewares/OpenTelemetryTraceIdMiddleware.cs new file mode 100644 index 0000000..d8baa6d --- /dev/null +++ b/src/BuildingBlocks/Common.OpenTelemetry/Middlewares/OpenTelemetryTraceIdMiddleware.cs @@ -0,0 +1,19 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Common.OpenTelemetry.Middlewares; + +public class OpenTelemetryTraceIdMiddleware(RequestDelegate next) +{ + public async Task InvokeAsync(HttpContext context) + { + var logger = context.RequestServices.GetRequiredService>(); + var traceId = Activity.Current?.TraceId.ToString(); + using (logger.BeginScope("{@OpenTelemetryTraceId}", traceId)) + { + await next(context); + } + } +} \ No newline at end of file diff --git a/src/BuildingBlocks/Common.OpenTelemetry/Middlewares/RequestAndResponseActivityMiddleware.cs b/src/BuildingBlocks/Common.OpenTelemetry/Middlewares/RequestAndResponseActivityMiddleware.cs new file mode 100644 index 0000000..512326b --- /dev/null +++ b/src/BuildingBlocks/Common.OpenTelemetry/Middlewares/RequestAndResponseActivityMiddleware.cs @@ -0,0 +1,44 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Http; +using Microsoft.IO; + +namespace Common.OpenTelemetry.Middlewares; + +public class RequestAndResponseActivityMiddleware(RequestDelegate next) +{ + private readonly RecyclableMemoryStreamManager _recyclableMemoryStreamManager = new(); + + public async Task InvokeAsync(HttpContext context) + { + await AddRequestBodyContentToActivityTags(context); + await AddResponseBodyContentToActivityTags(context); + } + + private async Task AddRequestBodyContentToActivityTags(HttpContext context) + { + context.Request.EnableBuffering(); + var requestBodyStreamReader = new StreamReader(context.Request.Body); + var requestBodyContent = await requestBodyStreamReader.ReadToEndAsync(); + + Activity.Current?.SetTag("http.request.body", requestBodyContent); + context.Request.Body.Position = 0; + } + private async Task AddResponseBodyContentToActivityTags(HttpContext context) + { + var originalResponse = context.Response.Body; + await using var responseBodyMemoryStream = _recyclableMemoryStreamManager.GetStream(); + context.Response.Body = responseBodyMemoryStream; + + await next(context); + + responseBodyMemoryStream.Position = 0; + + var responseBodyStreamReader = new StreamReader(responseBodyMemoryStream); + var responseBodyContent = await responseBodyStreamReader.ReadToEndAsync(); + Activity.Current?.SetTag("http.response.body", responseBodyContent); + + responseBodyMemoryStream.Position = 0; + + await responseBodyMemoryStream.CopyToAsync(originalResponse); + } +} \ No newline at end of file diff --git a/src/Consumers/MinimalApiCleanArchitecture.LogConsumer/MinimalApiCleanArchitecture.LogConsumer.csproj b/src/Consumers/MinimalApiCleanArchitecture.LogConsumer/MinimalApiCleanArchitecture.LogConsumer.csproj index 5cee725..a141153 100644 --- a/src/Consumers/MinimalApiCleanArchitecture.LogConsumer/MinimalApiCleanArchitecture.LogConsumer.csproj +++ b/src/Consumers/MinimalApiCleanArchitecture.LogConsumer/MinimalApiCleanArchitecture.LogConsumer.csproj @@ -21,12 +21,12 @@ - + - + - + diff --git a/src/Core/MinimalApiCleanArchitecture.Application/MinimalApiCleanArchitecture.Application.csproj b/src/Core/MinimalApiCleanArchitecture.Application/MinimalApiCleanArchitecture.Application.csproj index 4eff2c4..a126328 100644 --- a/src/Core/MinimalApiCleanArchitecture.Application/MinimalApiCleanArchitecture.Application.csproj +++ b/src/Core/MinimalApiCleanArchitecture.Application/MinimalApiCleanArchitecture.Application.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/Infrastructure/MinimalApiCleanArchitecture.Infrastructure/MinimalApiCleanArchitecture.Infrastructure.csproj b/src/Infrastructure/MinimalApiCleanArchitecture.Infrastructure/MinimalApiCleanArchitecture.Infrastructure.csproj index b0a19a6..7d7f113 100644 --- a/src/Infrastructure/MinimalApiCleanArchitecture.Infrastructure/MinimalApiCleanArchitecture.Infrastructure.csproj +++ b/src/Infrastructure/MinimalApiCleanArchitecture.Infrastructure/MinimalApiCleanArchitecture.Infrastructure.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/src/Infrastructure/MinimalApiCleanArchitecture.Persistence/MinimalApiCleanArchitecture.Persistence.csproj b/src/Infrastructure/MinimalApiCleanArchitecture.Persistence/MinimalApiCleanArchitecture.Persistence.csproj index 17b33d6..b97092c 100644 --- a/src/Infrastructure/MinimalApiCleanArchitecture.Persistence/MinimalApiCleanArchitecture.Persistence.csproj +++ b/src/Infrastructure/MinimalApiCleanArchitecture.Persistence/MinimalApiCleanArchitecture.Persistence.csproj @@ -7,9 +7,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Presentation/MinimalApiCleanArchitecture.GrpcService/Extensions/WebApplicationExtensions.cs b/src/Presentation/MinimalApiCleanArchitecture.GrpcService/Extensions/WebApplicationExtensions.cs index 482d9b4..9531e23 100644 --- a/src/Presentation/MinimalApiCleanArchitecture.GrpcService/Extensions/WebApplicationExtensions.cs +++ b/src/Presentation/MinimalApiCleanArchitecture.GrpcService/Extensions/WebApplicationExtensions.cs @@ -1,4 +1,5 @@ -using Consul; +using Common.OpenTelemetry.Middlewares; +using Consul; using Microsoft.EntityFrameworkCore; using MinimalApiCleanArchitecture.GrpcService.Services; using MinimalApiCleanArchitecture.Persistence; @@ -9,6 +10,7 @@ public static class WebApplicationExtensions { public static WebApplication ConfigureApplication(this WebApplication app) { + app.UseMiddleware(); app.MapGrpcService(); app.MapGet("/", () => diff --git a/src/Presentation/MinimalApiCleanArchitecture.GrpcService/MinimalApiCleanArchitecture.GrpcService.csproj b/src/Presentation/MinimalApiCleanArchitecture.GrpcService/MinimalApiCleanArchitecture.GrpcService.csproj index d7367f3..e693b6a 100644 --- a/src/Presentation/MinimalApiCleanArchitecture.GrpcService/MinimalApiCleanArchitecture.GrpcService.csproj +++ b/src/Presentation/MinimalApiCleanArchitecture.GrpcService/MinimalApiCleanArchitecture.GrpcService.csproj @@ -18,9 +18,9 @@ - - - + + + diff --git a/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/Extensions/WebApplicationExtensions.cs b/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/Extensions/WebApplicationExtensions.cs index 595442b..2d4bd02 100644 --- a/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/Extensions/WebApplicationExtensions.cs +++ b/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/Extensions/WebApplicationExtensions.cs @@ -1,4 +1,5 @@ -using Consul; +using Common.OpenTelemetry.Middlewares; +using Consul; using MinimalApiCleanArchitecture.Persistence; namespace MinimalApiCleanArchitecture.MinimalApi.Extensions; @@ -10,7 +11,8 @@ public static WebApplication ConfigureApplication(this WebApplication app) app.UseSwagger(); app.UseSwaggerUI(); app.UseHttpsRedirection(); - + app.UseMiddleware(); + app.UseMiddleware(); //Db Migration MigrateDatabase(app); app.RegisterWithConsul(); diff --git a/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/MinimalApiCleanArchitecture.MinimalApi.csproj b/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/MinimalApiCleanArchitecture.MinimalApi.csproj index f2219e5..a3a20a6 100644 --- a/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/MinimalApiCleanArchitecture.MinimalApi.csproj +++ b/src/Presentation/MinimalApiCleanArchitecture.MinimalApi/MinimalApiCleanArchitecture.MinimalApi.csproj @@ -15,19 +15,19 @@ - + - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + diff --git a/tests/Core/MinimalApiCleanArchitecture.Application.UnitTests/MinimalApiCleanArchitecture.Application.UnitTests.csproj b/tests/Core/MinimalApiCleanArchitecture.Application.UnitTests/MinimalApiCleanArchitecture.Application.UnitTests.csproj index 9a6abc5..c0a7f69 100644 --- a/tests/Core/MinimalApiCleanArchitecture.Application.UnitTests/MinimalApiCleanArchitecture.Application.UnitTests.csproj +++ b/tests/Core/MinimalApiCleanArchitecture.Application.UnitTests/MinimalApiCleanArchitecture.Application.UnitTests.csproj @@ -13,9 +13,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/tests/Infrastructure/MinimalApiCleanArchitecture.Infrastructure.UnitTests/MinimalApiCleanArchitecture.Infrastructure.UnitTests.csproj b/tests/Infrastructure/MinimalApiCleanArchitecture.Infrastructure.UnitTests/MinimalApiCleanArchitecture.Infrastructure.UnitTests.csproj index 9d6ab6e..608df26 100644 --- a/tests/Infrastructure/MinimalApiCleanArchitecture.Infrastructure.UnitTests/MinimalApiCleanArchitecture.Infrastructure.UnitTests.csproj +++ b/tests/Infrastructure/MinimalApiCleanArchitecture.Infrastructure.UnitTests/MinimalApiCleanArchitecture.Infrastructure.UnitTests.csproj @@ -13,9 +13,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/tests/Infrastructure/MinimalApiCleanArchitecture.Persistence.UnitTest/MinimalApiCleanArchitecture.Persistence.UnitTest.csproj b/tests/Infrastructure/MinimalApiCleanArchitecture.Persistence.UnitTest/MinimalApiCleanArchitecture.Persistence.UnitTest.csproj index 2ea8f56..5fd938f 100644 --- a/tests/Infrastructure/MinimalApiCleanArchitecture.Persistence.UnitTest/MinimalApiCleanArchitecture.Persistence.UnitTest.csproj +++ b/tests/Infrastructure/MinimalApiCleanArchitecture.Persistence.UnitTest/MinimalApiCleanArchitecture.Persistence.UnitTest.csproj @@ -13,9 +13,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all