Skip to content

Commit c802dac

Browse files
committed
Ensure tenant correlation runs first and tags activities
1 parent 2f63fc9 commit c802dac

File tree

5 files changed

+21
-25
lines changed

5 files changed

+21
-25
lines changed

docs/extensions/multitenancy-core.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@ builder.Services.AddMediatR(cfg =>
107107

108108
The pipeline includes:
109109

110+
- `TenantCorrelationBehavior` (adds tenant ID to logs and activity baggage)
110111
- `TenantValidationBehavior` (optional validation against cache or store)
111112
- `TenantEnforcementBehavior` (enforces resolution and lifecycle)
112-
- `TenantCorrelationBehavior` (adds tenant ID to logs and activity baggage)
113113

114114
## Tenant requirements
115115

src/CleanArchitecture.Extensions.Multitenancy.AspNetCore/Middleware/TenantResolutionMiddleware.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,10 @@ public async Task InvokeAsync(HttpContext httpContext)
7474

7575
private IDisposable? BeginLoggingScope(string? tenantId)
7676
{
77-
if (!_options.AddTenantToLogScope)
78-
{
79-
return null;
80-
}
81-
8277
var scopeKey = string.IsNullOrWhiteSpace(_options.LogScopeKey)
8378
? "tenant_id"
8479
: _options.LogScopeKey;
8580

86-
var scope = _logger.BeginScope(new Dictionary<string, object?> { [scopeKey] = tenantId });
87-
8881
if (_options.AddTenantToActivity)
8982
{
9083
var activity = Activity.Current;
@@ -95,6 +88,11 @@ public async Task InvokeAsync(HttpContext httpContext)
9588
}
9689
}
9790

98-
return scope;
91+
if (!_options.AddTenantToLogScope)
92+
{
93+
return null;
94+
}
95+
96+
return _logger.BeginScope(new Dictionary<string, object?> { [scopeKey] = tenantId });
9997
}
10098
}

src/CleanArchitecture.Extensions.Multitenancy/Behaviors/TenantCorrelationBehavior.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,22 @@ public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TRe
3535
{
3636
cancellationToken.ThrowIfCancellationRequested();
3737

38-
if (!_options.AddTenantToLogScope)
39-
{
40-
return await next().ConfigureAwait(false);
41-
}
42-
4338
var tenantId = _currentTenant.TenantId;
4439
var scopeKey = string.IsNullOrWhiteSpace(_options.LogScopeKey) ? "tenant_id" : _options.LogScopeKey;
40+
var activity = Activity.Current;
4541

46-
using (_logger.BeginScope(new Dictionary<string, object?> { [scopeKey] = tenantId }))
42+
if (_options.AddTenantToActivity && activity is not null)
4743
{
48-
var activity = Activity.Current;
49-
if (_options.AddTenantToActivity && activity is not null)
50-
{
51-
activity.SetBaggage(scopeKey, tenantId ?? string.Empty);
52-
activity.SetTag(scopeKey, tenantId);
53-
}
44+
activity.SetBaggage(scopeKey, tenantId ?? string.Empty);
45+
activity.SetTag(scopeKey, tenantId);
46+
}
5447

48+
if (!_options.AddTenantToLogScope)
49+
{
5550
return await next().ConfigureAwait(false);
5651
}
52+
53+
using var scope = _logger.BeginScope(new Dictionary<string, object?> { [scopeKey] = tenantId });
54+
return await next().ConfigureAwait(false);
5755
}
5856
}

src/CleanArchitecture.Extensions.Multitenancy/DependencyInjectionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ public static MediatRServiceConfiguration AddCleanArchitectureMultitenancyPipeli
5959
{
6060
ArgumentNullException.ThrowIfNull(configuration);
6161

62+
configuration.AddOpenBehavior(typeof(TenantCorrelationBehavior<,>));
6263
configuration.AddOpenBehavior(typeof(TenantValidationBehavior<,>));
6364
configuration.AddOpenBehavior(typeof(TenantEnforcementBehavior<,>));
64-
configuration.AddOpenBehavior(typeof(TenantCorrelationBehavior<,>));
6565
return configuration;
6666
}
6767
}

tests/CleanArchitecture.Extensions.Multitenancy.Tests/TenantBehaviorTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ private sealed record DefaultRequest : IRequest<string>;
197197
public class TenantCorrelationBehaviorTests
198198
{
199199
[Fact]
200-
public async Task Handle_skips_scope_when_disabled()
200+
public async Task Handle_sets_activity_when_log_scope_disabled()
201201
{
202202
var currentTenant = new CurrentTenantAccessor
203203
{
@@ -217,8 +217,8 @@ public async Task Handle_skips_scope_when_disabled()
217217

218218
await behavior.Handle(new DefaultRequest(), _ => Task.FromResult("ok"), CancellationToken.None);
219219

220-
Assert.Null(activity.GetBaggageItem("tenant_id"));
221-
Assert.Null(activity.GetTagItem("tenant_id"));
220+
Assert.Equal("tenant-1", activity.GetBaggageItem("tenant_id"));
221+
Assert.Equal("tenant-1", activity.GetTagItem("tenant_id"));
222222
activity.Stop();
223223
}
224224

0 commit comments

Comments
 (0)