66 lines
2.1 KiB
C#
66 lines
2.1 KiB
C#
namespace LiteCharms.Features.Mediator;
|
|
|
|
public sealed class TelemetryPipelineBehavior<TRequest, TResponse> :
|
|
IPipelineBehavior<TRequest, TResponse?>
|
|
where TRequest : IRequest<TResponse>
|
|
where TResponse : ResultBase, new()
|
|
{
|
|
public async ValueTask<TResponse?> Handle(TRequest message, MessageHandlerDelegate<TRequest, TResponse?> next, CancellationToken cancellationToken)
|
|
{
|
|
var requestName = typeof(TRequest).Name;
|
|
|
|
using var activity = MediatorTelemetry.Source.StartActivity(requestName);
|
|
|
|
activity?.SetTag("mediator.request_type", typeof(TRequest).FullName);
|
|
|
|
var stopWatch = Stopwatch.StartNew();
|
|
var status = "Success";
|
|
|
|
try
|
|
{
|
|
TResponse? response = await next(message, cancellationToken);
|
|
|
|
if (response is null)
|
|
{
|
|
status = "NullResponse";
|
|
activity?.SetStatus(ActivityStatusCode.Error, "Response was null");
|
|
|
|
return response;
|
|
}
|
|
|
|
if (response.IsFailed)
|
|
{
|
|
status = "Failed";
|
|
activity?.SetStatus(ActivityStatusCode.Error, "Request failed");
|
|
|
|
var firstError = response.Errors.FirstOrDefault()?.Message ?? "Unknown Error";
|
|
activity?.SetTag("error.message", firstError);
|
|
|
|
foreach (var error in response.Errors)
|
|
activity?.AddEvent(new ActivityEvent("Result Error", tags: new() { { "message", error.Message } }));
|
|
}
|
|
else
|
|
activity?.SetStatus(ActivityStatusCode.Ok);
|
|
|
|
return response;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
status = "Exception";
|
|
activity?.SetStatus(ActivityStatusCode.Error, ex.Message);
|
|
|
|
activity?.AddException(ex);
|
|
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
stopWatch.Stop();
|
|
|
|
var tags = new TagList { { "request", requestName }, { "status", status } };
|
|
|
|
MediatorTelemetry.RequestCounter.Add(1, tags);
|
|
MediatorTelemetry.RequestDuration.Record(stopWatch.Elapsed.TotalMilliseconds, tags);
|
|
}
|
|
}
|
|
} |