Skip to content

Commit a370c5d

Browse files
Merge pull request #700 from leancodepl/more-tracing
Improve tracing across CQRS elements
2 parents 77527f3 + 01fe825 commit a370c5d

7 files changed

Lines changed: 40 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
but this project DOES NOT adhere to [Semantic Versioning](http://semver.org/).
77

8-
## 8.1 (Unreleased)
8+
## 8.1
99
* `LeanCode.Kratos` has switched from official (and at the time outdated) client package `Ory.Kratos.Client` to our own `LeanCode.Kratos.Client` that is maintained at https://github.com/leancodepl/dotnet-kratos-client and with this the usage has changed:
10-
* Underlying JSON (de)serializer is now STJ instead of JSON.NET
11-
* Values returned from client's API calls are now wrapped in response objects that provide additional info
12-
* Models were rebuilt, adding support for NRT and wrapping optional properties in `Option<T>` (importantly, the latter can change how identity metadata should be read)
13-
* The client comes with its own DI registration extensions, changing how it should be added to DI container
10+
* Underlying JSON (de)serializer is now STJ instead of JSON.NET
11+
* Values returned from client's API calls are now wrapped in response objects that provide additional info
12+
* Models were rebuilt, adding support for NRT and wrapping optional properties in `Option<T>` (importantly, the latter can change how identity metadata should be read)
13+
* The client comes with its own DI registration extensions, changing how it should be added to DI container
14+
* Better tracing across CQRS executions
1415

1516
## 8.0
1617

src/CQRS/LeanCode.CQRS.AspNetCore/Local/MiddlewareBasedLocalExecutor.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using LeanCode.OpenTelemetry;
66
using Microsoft.AspNetCore.Builder;
77
using Microsoft.AspNetCore.Http;
8-
using Microsoft.AspNetCore.Mvc.Infrastructure;
98
using Microsoft.Extensions.DependencyInjection;
109

1110
namespace LeanCode.CQRS.AspNetCore.Local;
@@ -41,8 +40,10 @@ CancellationToken cancellationToken
4140
{
4241
var metadata = objectSource.MetadataFor(obj.GetType());
4342

44-
using var activity = LeanCodeActivitySource.ActivitySource.StartActivity("pipeline.action.local");
45-
activity?.AddTag("object", metadata.ObjectType.FullName);
43+
using var activity = LeanCodeActivitySource.StartExecution("Local", metadata.ObjectType.FullName);
44+
activity?.AddTag("object.kind", metadata.ObjectKind.ToString());
45+
activity?.AddTag("object.type", metadata.ObjectType.FullName);
46+
activity?.AddTag("object.handler", metadata.HandlerType.FullName);
4647

4748
await using var scope = serviceProvider.CreateAsyncScope();
4849

src/CQRS/LeanCode.CQRS.AspNetCore/Middleware/CQRSExceptionTranslationMiddleware.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using LeanCode.Contracts;
33
using LeanCode.Contracts.Validation;
44
using LeanCode.CQRS.Execution;
5+
using LeanCode.OpenTelemetry;
56
using Microsoft.AspNetCore.Http;
67
using Serilog;
78

@@ -35,6 +36,9 @@ public async Task InvokeAsync(HttpContext httpContext)
3536
}
3637
catch (CommandExecutionInvalidException ex)
3738
{
39+
using var activity = LeanCodeActivitySource.StartMiddleware("ExceptionTranslation");
40+
activity?.SetTag("error.code", ex.ErrorCode);
41+
3842
var result = WrapInCommandResult(ex);
3943
logger.Warning("Command {@Command} is not valid with result {@Result}", cqrsPayload.Payload, result);
4044
var executionResult = ExecutionResult.WithPayload(result, StatusCodes.Status422UnprocessableEntity);

src/CQRS/LeanCode.CQRS.AspNetCore/Middleware/CQRSSecurityMiddleware.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using LeanCode.Contracts.Security;
22
using LeanCode.CQRS.Execution;
33
using LeanCode.CQRS.Security;
4+
using LeanCode.OpenTelemetry;
45
using Microsoft.AspNetCore.Http;
56
using Serilog;
67

@@ -41,12 +42,12 @@ public async Task InvokeAsync(HttpContext context)
4142
foreach (var customAuthorizerDefinition in customAuthorizers)
4243
{
4344
var authorizerType = customAuthorizerDefinition.Authorizer;
44-
var customAuthorizer = context.RequestServices.GetService(authorizerType) as IHttpContextCustomAuthorizer;
45+
using var activity = LeanCodeActivitySource.StartMiddleware("Security", authorizerType.FullName);
46+
activity?.SetTag("authorizer.type", authorizerType.FullName);
4547

46-
if (customAuthorizer is null)
47-
{
48-
throw new CustomAuthorizerNotFoundException(authorizerType);
49-
}
48+
var customAuthorizer =
49+
context.RequestServices.GetService(authorizerType) as IHttpContextCustomAuthorizer
50+
?? throw new CustomAuthorizerNotFoundException(authorizerType);
5051

5152
var authorized = await customAuthorizer.CheckIfAuthorizedAsync(
5253
context,
@@ -56,6 +57,7 @@ public async Task InvokeAsync(HttpContext context)
5657

5758
if (!authorized)
5859
{
60+
activity?.SetTag("authorizer.authorized", false);
5961
logger.Warning(
6062
"User is not authorized for {@Object}, authorizer {AuthorizerType} did not pass",
6163
payload.Payload,
@@ -66,6 +68,10 @@ public async Task InvokeAsync(HttpContext context)
6668
metrics.CQRSFailure(CQRSMetrics.AuthorizationFailure);
6769
return;
6870
}
71+
else
72+
{
73+
activity?.SetTag("authorizer.authorized", true);
74+
}
6975
}
7076

7177
await next(context);

src/CQRS/LeanCode.CQRS.AspNetCore/Middleware/CQRSTracingMiddleware.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ public async Task InvokeAsync(HttpContext httpContext)
1818
{
1919
var cqrsMetadata = httpContext.GetCQRSObjectMetadata();
2020

21-
using var activity = LeanCodeActivitySource.Start(
22-
$"{cqrsMetadata.ObjectKind}Handler {cqrsMetadata.HandlerType.FullName}"
21+
using var activity = LeanCodeActivitySource.StartExecution(
22+
cqrsMetadata.ObjectKind.ToString(),
23+
cqrsMetadata.HandlerType.FullName
2324
);
2425
activity?.AddTag("object.kind", cqrsMetadata.ObjectKind.ToString());
2526
activity?.AddTag("object.type", cqrsMetadata.ObjectType.FullName);

src/CQRS/LeanCode.CQRS.AspNetCore/Middleware/CQRSValidationMiddleware.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using LeanCode.Contracts;
22
using LeanCode.CQRS.Execution;
33
using LeanCode.CQRS.Validation;
4+
using LeanCode.OpenTelemetry;
45
using Microsoft.AspNetCore.Http;
56

67
namespace LeanCode.CQRS.AspNetCore.Middleware;
@@ -32,7 +33,11 @@ public async Task InvokeAsync(HttpContext httpContext, ICommandValidatorResolver
3233

3334
if (validator is not null)
3435
{
36+
using var activity = LeanCodeActivitySource.StartMiddleware("Validation");
37+
activity?.SetTag("validation.validator", validator.GetType().FullName);
38+
3539
var result = await validator.ValidateAsync(httpContext, (ICommand)payload.Payload);
40+
activity?.SetTag("validation.valid", result.IsValid);
3641

3742
if (!result.IsValid)
3843
{

src/Infrastructure/LeanCode.OpenTelemetry/ActivitySource.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,11 @@ public static class LeanCodeActivitySource
77
public static readonly ActivitySource ActivitySource = new("LeanCode.CoreLibrary");
88

99
public static Activity? Start(string name) => ActivitySource.StartActivity(name);
10+
11+
public static Activity? StartExecution(string type, string? objectType) => Start($"{type} - {objectType}");
12+
13+
public static Activity? StartMiddleware(string middlewareName) => Start($"middleware - {middlewareName}");
14+
15+
public static Activity? StartMiddleware(string middlewareName, string? objectName) =>
16+
Start($"middleware - {middlewareName} - {objectName}");
1017
}

0 commit comments

Comments
 (0)