From b772eb988e8a519203ede3ef9dfa9c405c9d38d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Chalet?= Date: Fri, 3 Jan 2025 21:32:58 +0100 Subject: [PATCH] Log a message when an unhandled exception occurs in a task runner --- src/OpenNetty/OpenNettyGatewayOptions.cs | 36 ++++++++++++++++++++++-- src/OpenNetty/OpenNettyLogger.cs | 12 ++++++++ src/OpenNetty/OpenNettyWorker.cs | 2 ++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/OpenNetty/OpenNettyGatewayOptions.cs b/src/OpenNetty/OpenNettyGatewayOptions.cs index b0628d7..d2bc491 100644 --- a/src/OpenNetty/OpenNettyGatewayOptions.cs +++ b/src/OpenNetty/OpenNettyGatewayOptions.cs @@ -263,9 +263,39 @@ when message.Medium is OpenNettyMedium.Bus _ => TimeSpan.FromSeconds(60) }), MaxRetryAttempts = int.MaxValue, - ShouldHandle = static arguments => ValueTask.FromResult( - !arguments.Context.CancellationToken.IsCancellationRequested && - arguments.Outcome.Exception is not null) + ShouldHandle = static arguments => + { + if (!arguments.Context.Properties.TryGetValue( + key : new ResiliencePropertyKey(nameof(OpenNettyGateway)), + value: out OpenNettyGateway? gateway)) + { + throw new InvalidOperationException(SR.GetResourceString(SR.ID0074)); + } + + if (!arguments.Context.Properties.TryGetValue( + key : new ResiliencePropertyKey>(nameof(OpenNettyLogger)), + value: out OpenNettyLogger? logger)) + { + throw new InvalidOperationException(SR.GetResourceString(SR.ID0074)); + } + + if (!arguments.Context.Properties.TryGetValue( + key : new ResiliencePropertyKey(nameof(OpenNettySessionType)), + value: out OpenNettySessionType type)) + { + throw new InvalidOperationException(SR.GetResourceString(SR.ID0074)); + } + + if (arguments.Outcome.Exception is not Exception exception) + { + return ValueTask.FromResult(false); + } + + logger.SessionErrored(exception, gateway, type); + + // Always recreate new sessions on failed attempts, unless the operation was canceled by the worker. + return ValueTask.FromResult(!arguments.Context.CancellationToken.IsCancellationRequested); + } }) .Build() }; diff --git a/src/OpenNetty/OpenNettyLogger.cs b/src/OpenNetty/OpenNettyLogger.cs index 020d712..68193e3 100644 --- a/src/OpenNetty/OpenNettyLogger.cs +++ b/src/OpenNetty/OpenNettyLogger.cs @@ -242,4 +242,16 @@ public OpenNettyLogger(ILogger logger) Level = LogLevel.Error, Message = "An error occurred while trying to connect to the MQTT broker.")] public partial void MqttBrokerConnectionError(Exception exception); + + /// + /// Logs a message indicating that an error occcured while opening a session. + /// + /// The exception. + /// The gateway. + /// The session type. + [LoggerMessage( + EventId = 6020, + Level = LogLevel.Error, + Message = "An error occurred while trying to open a session of type {Type} to gateway {Gateway}.")] + public partial void SessionErrored(Exception exception, OpenNettyGateway gateway, OpenNettySessionType type); } diff --git a/src/OpenNetty/OpenNettyWorker.cs b/src/OpenNetty/OpenNettyWorker.cs index 20d8072..1af1b06 100644 --- a/src/OpenNetty/OpenNettyWorker.cs +++ b/src/OpenNetty/OpenNettyWorker.cs @@ -67,6 +67,7 @@ async Task CreateSharedSessionWorkerAsync(OpenNettyGateway gateway, OpenNettySes { var context = ResilienceContextPool.Shared.Get(cancellationToken); context.Properties.Set(new ResiliencePropertyKey(nameof(OpenNettyGateway)), gateway); + context.Properties.Set(new ResiliencePropertyKey>(nameof(OpenNettyLogger)), _logger); context.Properties.Set(new ResiliencePropertyKey(nameof(OpenNettySessionType)), type); _logger.TaskRunnerScheduled(gateway, type); @@ -134,6 +135,7 @@ async Task CreateAdHocSessionWorkerAsync( { var context = ResilienceContextPool.Shared.Get(cancellationToken); context.Properties.Set(new ResiliencePropertyKey(nameof(OpenNettyGateway)), gateway); + context.Properties.Set(new ResiliencePropertyKey>(nameof(OpenNettyLogger)), _logger); context.Properties.Set(new ResiliencePropertyKey(nameof(OpenNettySessionType)), type); _logger.TaskRunnerScheduled(gateway, type);