feat: add tracing enrichment and prometheus exporter

This commit is contained in:
msumshk
2025-12-02 22:29:38 +08:00
parent 0d2ad0aecb
commit 2121432d5d
13 changed files with 163 additions and 41 deletions

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
@@ -14,23 +15,43 @@ namespace TakeoutSaaS.Shared.Web.Middleware;
public sealed class CorrelationIdMiddleware(RequestDelegate next, ILogger<CorrelationIdMiddleware> logger, IIdGenerator idGenerator)
{
private const string TraceHeader = "X-Trace-Id";
private const string SpanHeader = "X-Span-Id";
private const string RequestHeader = "X-Request-Id";
public async Task InvokeAsync(HttpContext context)
{
var traceId = ResolveTraceId(context);
var ownsActivity = Activity.Current is null;
var activity = Activity.Current ?? new Activity("TakeoutSaaS.Request");
if (activity.Id is null)
{
activity.SetIdFormat(ActivityIdFormat.W3C);
activity.Start();
}
var traceId = activity.TraceId.ToString();
var spanId = activity.SpanId.ToString();
if (string.IsNullOrWhiteSpace(traceId))
{
traceId = ResolveTraceId(context);
}
context.TraceIdentifier = traceId;
TraceContext.TraceId = traceId;
TraceContext.SpanId = spanId;
context.Response.OnStarting(() =>
{
context.Response.Headers[TraceHeader] = traceId;
context.Response.Headers[SpanHeader] = spanId;
return Task.CompletedTask;
});
using (logger.BeginScope(new Dictionary<string, object>
{
["TraceId"] = traceId
["TraceId"] = traceId,
["SpanId"] = spanId
}))
{
try
@@ -40,6 +61,10 @@ public sealed class CorrelationIdMiddleware(RequestDelegate next, ILogger<Correl
finally
{
TraceContext.Clear();
if (ownsActivity)
{
activity.Stop();
}
}
}
}