From b624b2b4afd8b3930507b849411fc4b2c740d3a0 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 14 Mar 2025 23:37:46 +0100 Subject: [PATCH] Refactor error span handling with prioritization and predicates Introduce `Order` property and `CanHandle` method in `IErrorSpanHandler` to enable prioritized and conditional processing of error spans. Update handler implementations to utilize these properties and streamline logic. This enhances flexibility and improves the extensibility of error span handling. --- .../Abstractions/ErrorSpanHandlerBase.cs | 2 ++ .../Elsa.OpenTelemetry/Contracts/IErrorSpanHandler.cs | 3 ++- .../Handlers/DefaultErrorSpanHandler.cs | 9 +++++---- .../Handlers/FaultExceptionErrorSpanHandler.cs | 6 +++--- .../OpenTelemetryTracingActivityExecutionMiddleware.cs | 6 ++++-- 5 files changed, 16 insertions(+), 10 deletions(-) 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); }