diff --git a/src/modules/Elsa.OpenTelemetry/Abstractions/ErrorSpanHandlerBase.cs b/src/modules/Elsa.OpenTelemetry/Abstractions/ErrorSpanHandlerBase.cs index 420936119..06e77bd4f 100644 --- a/src/modules/Elsa.OpenTelemetry/Abstractions/ErrorSpanHandlerBase.cs +++ b/src/modules/Elsa.OpenTelemetry/Abstractions/ErrorSpanHandlerBase.cs @@ -5,5 +5,7 @@ namespace Elsa.OpenTelemetry.Abstractions; public abstract class ErrorSpanHandlerBase : IErrorSpanHandler { + public virtual float Order => 0; + public abstract bool CanHandle(ErrorSpanContext context); public abstract void Handle(ErrorSpanContext context); } \ No newline at end of file diff --git a/src/modules/Elsa.OpenTelemetry/Contracts/IErrorSpanHandler.cs b/src/modules/Elsa.OpenTelemetry/Contracts/IErrorSpanHandler.cs index d15c3dee4..70b16f645 100644 --- a/src/modules/Elsa.OpenTelemetry/Contracts/IErrorSpanHandler.cs +++ b/src/modules/Elsa.OpenTelemetry/Contracts/IErrorSpanHandler.cs @@ -1,10 +1,11 @@ -using Elsa.OpenTelemetry.Abstractions; using Elsa.OpenTelemetry.Models; namespace Elsa.OpenTelemetry.Contracts; public interface IErrorSpanHandler { + float Order { get; } + bool CanHandle(ErrorSpanContext context); void Handle(ErrorSpanContext context); } diff --git a/src/modules/Elsa.OpenTelemetry/Handlers/DefaultErrorSpanHandler.cs b/src/modules/Elsa.OpenTelemetry/Handlers/DefaultErrorSpanHandler.cs index a3003ba35..aac9fbae9 100644 --- a/src/modules/Elsa.OpenTelemetry/Handlers/DefaultErrorSpanHandler.cs +++ b/src/modules/Elsa.OpenTelemetry/Handlers/DefaultErrorSpanHandler.cs @@ -5,11 +5,12 @@ namespace Elsa.OpenTelemetry.Handlers; public class DefaultErrorSpanHandler : ErrorSpanHandlerBase { + public override float Order => 100000; + + public override bool CanHandle(ErrorSpanContext context) => context.Exception != null; + public override void Handle(ErrorSpanContext context) { - if (context.Exception is null) - return; - - context.Span.AddException(context.Exception); + context.Span.AddException(context.Exception!); } } \ No newline at end of file diff --git a/src/modules/Elsa.OpenTelemetry/Handlers/FaultExceptionErrorSpanHandler.cs b/src/modules/Elsa.OpenTelemetry/Handlers/FaultExceptionErrorSpanHandler.cs index 301b2b78d..9403e20e9 100644 --- a/src/modules/Elsa.OpenTelemetry/Handlers/FaultExceptionErrorSpanHandler.cs +++ b/src/modules/Elsa.OpenTelemetry/Handlers/FaultExceptionErrorSpanHandler.cs @@ -6,11 +6,11 @@ namespace Elsa.OpenTelemetry.Handlers; public class FaultExceptionErrorSpanHandler : ErrorSpanHandlerBase { + public override bool CanHandle(ErrorSpanContext context) => context.Exception is FaultException; + public override void Handle(ErrorSpanContext context) { - if (context.Exception is not FaultException faultException) - return; - + var faultException = (FaultException)context.Exception!; var span = context.Span; var tags = new Dictionary { diff --git a/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs b/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs index 60a2acd46..e11106912 100644 --- a/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs +++ b/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs @@ -46,9 +46,11 @@ public class OpenTelemetryTracingActivityExecutionMiddleware(ActivityMiddlewareD span.SetStatus(ActivityStatusCode.Error); span.SetTag("activity.incidents", true); - var errorSpanHandlers = context.GetServices(); var errorSpanHandlerContext = new ErrorSpanContext(span, context.Exception); - + var errorSpanHandlers = context.GetServices() + .OrderBy(x => x.Order) + .Where(x => x.CanHandle(errorSpanHandlerContext)); + foreach (var handler in errorSpanHandlers) handler.Handle(errorSpanHandlerContext); }