Crip.Extensions.Correlation
1.1.1
dotnet add package Crip.Extensions.Correlation --version 1.1.1
NuGet\Install-Package Crip.Extensions.Correlation -Version 1.1.1
<PackageReference Include="Crip.Extensions.Correlation" Version="1.1.1" />
paket add Crip.Extensions.Correlation --version 1.1.1
#r "nuget: Crip.Extensions.Correlation, 1.1.1"
// Install Crip.Extensions.Correlation as a Cake Addin #addin nuget:?package=Crip.Extensions.Correlation&version=1.1.1 // Install Crip.Extensions.Correlation as a Cake Tool #tool nuget:?package=Crip.Extensions.Correlation&version=1.1.1
CRIP AspNetCore Correlation
The correlation ID is distributed tracing mechanism meant to be used to help Admin trace what was happening at the time of an error/request. It is only valuable as an interactive tool to help the Admin track down your error. An Admin uses the correlation ID as "breadcrumbs" to retrace a requests or processes in the Logging System to find what leads up to and causes a problem.
Installation
Install Crip.Extensions.Correlation NuGet package, or GitHub package
Setup
Configure services:
services.AddHttpContextAccessor(); // package requires that HTTP context accessor is available
services.AddCorrelation();
Configure pipeline:
// Add middlewares as early as possible
app.UseCorrelation();
// or
app.UseMiddleware<CorrelationIdMiddleware>();
app.UseMiddleware<CorrelationIdLoggingMiddleware>();
HTTP client correlation
Correlation makes sense only when entire system is using same Correlation ID. To do so, you can use "traced" HTTP client witch will automatically add header to all outgoing requests.
services.AddTracedHttpClient<TClient, TImplementation>(((provider, client) =>
{
var config = provider.GetRequiredService<IOptions<TClientOptions>>().Value;
client.BaseAddress = new Uri(config.BaseUrl);
}));
Correlation outside of ASP.NET request context
To simplify managing correlation contexts, the ICorrelationManager
can be used. It takes care of the logic to create
the context properly. This is especially useful when running background tasks, console apps, Windows services, etc.
which need to interact with external services. Think of message broker handlers, scheduled task runners, etc.
public class MyBackgroundService : BackgroundService
{
private readonly ILogger<MyBackgroundService> _logger;
private readonly ICorrelationManager _correlation;
private readonly ITestControllerClient _client;
public MyBackgroundService(
ILogger<MyBackgroundService> logger,
ICorrelationManager correlation,
ITestControllerClient client)
{
_logger = logger;
_correlation = correlation;
_client = client;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogDebug("Background task before use"); // No correlation context logged
await _correlation.Use("some-test-correlation-001", async () =>
{
_logger.LogDebug("Background task after set");
var result = await _client.Test();
_logger.LogDebug("response: {@Result}", result);
});
_logger.LogDebug("Background task after use");
}
}
Customization
You can customize correlation by providing custom options:
services.Configure<CorrelationIdOptions>(options =>
{
options.Cookie = "X-Correlation-Id"; // name of the cookie key to use as correlation identifier
options.Header = "X-Correlation-Id"; // name of the HTTP request/response header
options.PropertyName = "CorrelationId"; // name of the loggable property
options.IncludeInResponse = true; // include correlation identifier header in responses
});
Alternatives for more advanced Distributed Tracing
Please consider that .NET Core 3.1 and up now has built-in support for W3C TraceContext (blog) and that there are other distributed tracing libraries with more functionality:
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.AspNetCore.Http.Abstractions (>= 2.2.0)
- Microsoft.Extensions.Http (>= 6.0.0)
- Microsoft.Extensions.Logging (>= 6.0.0)
- Microsoft.Extensions.Options (>= 6.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.