W4k.AspNetCore.Correlator
1.1.0
See the version list below for details.
dotnet add package W4k.AspNetCore.Correlator --version 1.1.0
NuGet\Install-Package W4k.AspNetCore.Correlator -Version 1.1.0
<PackageReference Include="W4k.AspNetCore.Correlator" Version="1.1.0" />
paket add W4k.AspNetCore.Correlator --version 1.1.0
#r "nuget: W4k.AspNetCore.Correlator, 1.1.0"
// Install W4k.AspNetCore.Correlator as a Cake Addin #addin nuget:?package=W4k.AspNetCore.Correlator&version=1.1.0 // Install W4k.AspNetCore.Correlator as a Cake Tool #tool nuget:?package=W4k.AspNetCore.Correlator&version=1.1.0
W4k.AspNetCore.Correlator
Correlator helps you with handling correlation ID (known also as request ID): reading, generating new one and forwarding to subsequent requests.
Correlation ID is sent within HTTP headers. If header is not set,
Correlator will happily generate new one for you (ASP.NET itself generates
TraceIdentifier
- and it is still possible to stick with its value).
Apart of accepting or generating correlation ID, it is also possible to emit correlation ID back to caller within HTTP response headers.
To forward correlation ID to subsequent request, it is necessary to use designated HTTP message handler, see examples below.
W3: Trace Context
Please be aware that Trace Context is not supported, Correlator helps you with older systems using non-standard headers. See links below for more alternatives.
Basic usage
Correlator consists of two components. Middleware which reads (generates if missing) correlation ID, and HTTP message handler which adds your correlation to outbound requests.
Following examples demonstrate how to wire everything up.
Startup class
Register components and add CorrelatorMiddleware
to application pipeline:
public class MyLittleStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddCorrelator();
// other stuff
// ...
}
public void Configure(IApplicationBuilder app)
{
// register as first middleware
app.UseCorrelator();
// other stuff
// ...
app.UseMvc();
}
}
Forwarding correlation ID
Add CorrelatorHttpMessageHandler
to HTTP client's message handler pipeline like this:
services
.AddHttpClient()
.WithCorrelation();
Accessing correlation ID within application
Correlation ID of current request is always available from HttpContext.TraceIdentifier
.
Even if you disable generating of correlation ID, ASP.NET itself already sets its value.
To be able to access HttpContext
from your component, you need to inject IHttpContextAccessor
.
using Microsoft.AspNetCore.Http;
public class MyLittleService
{
private readonly IHttpContextAccessor _contextAccessor;
public MyLittleService(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
}
public async Task DoMagicalStuff()
{
HttpContext context = _contextAccessor.HttpContext;
string correlationId = context?.TraceIdentifier;
// We found a Correlation ID, of Candy Mountain. Candy Mountain, Charlie.
// ...
}
}
Configuration
By default, correlator behaves following way:
- Headers used for accepting correlation ID are:
Request-Id
,X-Correlation-Id
andX-Request-Id
- If correlation ID header is missing or has empty value, new correlation ID is generated in form of GUID
- Correlation ID is forwarded to subsequent requests using
CorrelatorHttpMessageHandler
(asX-Correlation-ID
) - Correlation ID is not set to HTTP response headers
To adjust setting, use AddCorrelator
overload:
services.AddCorrelator(
correlatorOptions =>
{
// disable correlation ID factory, stick with ASP.NET value
correlatorOptions.Factory = null;
// read only custom header
correlatorOptions.ReadFrom.Clear();
correlatorOptions.ReadFrom.Add("X-CID");
// include correlation ID in response
correlatorOptions.Emit = PropagationSettings.PropagateAs("X-RID");
// forward via message handler, using same header name ("X-CID")
correlatorOptions.Forward = PropagationSettings.KeepIncomingHeaderName;
});
Correlation ID factory (Factory
)
Property CorrelatorOptions.Factory
, of type Func<CorrelationId>
.
If set to null
then generating of correlation ID is disabled and ASP.NET value is used instead.
For more details look up for HttpContext.TraceIdentifier
.
// default
correlatorOptions.Factory = () => CorrelationId.NewCorrelationId();
// custom (don't even try this, this is just demonstration)
correlatorOptions.Factory = () => CorrelationId.FromString("hello world!").Value;
// disable (stick with ASP.NET TraceIdentifier)
correlatorOptions.Factory = null;
Read from headers (ReadFrom
)
Property CorrelatorOptions.ReadFrom
, of type ICollection<string>
.
Note that order matters - first header satisfying match is returned.
// add to defaults
correlatorOptions.Add("X-Yet-Another-Request-ID");
// read only from given header
correlatorOptions.Clear();
correlatorOptions.Add("X-This-Is-Only-Possible-Correlation-ID-Now");
Correlation ID propagation (Emit
, Forward
)
There are two directions to propagate correlation ID:
CorrelatorOptions.Emit
: Include correlation ID of request in response headersCorrelatorOptions.Forward
: Forward correlation ID to subsequent requests usingCorrelatorHttpMessageHandler
No propagation
Correlation ID is not set.
// don't expose correlation ID in HTTP response
correlatorOptions.Emit = PropagationSettings.NoPropagation;
// don't forward correlation ID to subsequent requests
correlatorOptions.Forward = PropagationSettings.NoPropagation;
Use incoming header name
Correlation ID is propagated with same header name as it was read from.
// if correlation was taken from 'X-My-Custom-Correlation-Id', it is exposed with same header
correlatorOptions.Emit = PropagationSettings.KeepIncomingHeaderName;
correlatorOptions.Forward = PropagationSettings.KeepIncomingHeaderName;
Predefined header name
Correlation ID is propagated with predefined header name.
// if correlation was read from 'X-My-Custom-Correlation-Id', it is exposed as 'X-Correlation-Id'
correlatorOptions.Emit = PropagationSettings.PropagateAs("X-Correlation-Id");
correlatorOptions.Forward = PropagationSettings.PropagateAs("X-Correlation-Id");
Alternative packages
- CorrelationId by Steve Gordon.
- Correlate by Martijn Bodeman.
Advanced tracing
This package is designed to solve simple scenario with reading and writing correlation ID from/to HTTP headers. If you are looking for more advanced tracing, consider checking: OpenTracing / Zipkin / Jaeger.
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 (>= 2.1.0 && < 2.3.0)
- Microsoft.AspNetCore.Http.Abstractions (>= 2.1.0 && < 2.3.0)
- Microsoft.Extensions.Http (>= 2.1.0 && < 2.3.0)
- Microsoft.Extensions.Options (>= 2.1.0 && < 2.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
3.3.0 | 32 | 11/23/2024 |
3.2.0 | 429 | 1/15/2024 |
3.1.0 | 244 | 11/27/2023 |
3.0.0 | 121 | 11/18/2023 |
2.3.0 | 225 | 8/28/2023 |
2.2.2 | 1,818 | 7/25/2022 |
2.2.1 | 9,799 | 9/8/2020 |
2.2.0 | 456 | 9/6/2020 |
2.2.0-preview2 | 364 | 9/5/2020 |
2.2.0-preview1 | 360 | 9/4/2020 |
2.1.1 | 462 | 9/4/2020 |
2.0.1 | 449 | 8/31/2020 |
2.0.1-beta | 409 | 8/30/2020 |
2.0.0-beta | 292 | 8/27/2020 |
1.1.0 | 7,202 | 9/26/2019 |
1.0.1 | 1,994 | 6/27/2019 |
1.0.0 | 1,358 | 10/22/2018 |
0.2.0-alpha | 585 | 9/28/2018 |
0.1.0-alpha | 589 | 9/27/2018 |