diff --git a/src/Polly.Extensions/Telemetry/Log.cs b/src/Polly.Extensions/Telemetry/Log.cs index d6281868f4..c97647b314 100644 --- a/src/Polly.Extensions/Telemetry/Log.cs +++ b/src/Polly.Extensions/Telemetry/Log.cs @@ -83,9 +83,10 @@ public static void ExecutingStrategy( #endif #if NET6_0_OR_GREATER - [LoggerMessage(2, LogLevel.Debug, StrategyExecutedMessage, EventName = "StrategyExecuted")] + [LoggerMessage(EventId = 2, Message = StrategyExecutedMessage, EventName = "StrategyExecuted")] public static partial void StrategyExecuted( this ILogger logger, + LogLevel logLevel, string? builderName, string? strategyKey, string resultType, @@ -94,11 +95,15 @@ public static partial void StrategyExecuted( double executionTime, Exception? exception); #else - private static readonly Action StrategyExecutedAction = + private static readonly Action StrategyExecutedActionDebug = LoggerMessage.Define(LogLevel.Debug, new EventId(2, "StrategyExecuted"), StrategyExecutedMessage); + private static readonly Action StrategyExecutedActionWarning = + LoggerMessage.Define(LogLevel.Warning, new EventId(2, "StrategyExecuted"), StrategyExecutedMessage); + public static void StrategyExecuted( this ILogger logger, + LogLevel logLevel, string? builderName, string? strategyKey, string resultType, @@ -107,7 +112,14 @@ public static void StrategyExecuted( double executionTime, Exception? exception) { - StrategyExecutedAction(logger, builderName, strategyKey, resultType, result, executionHealth, executionTime, exception); + if (logLevel == LogLevel.Warning) + { + StrategyExecutedActionWarning(logger, builderName, strategyKey, resultType, result, executionHealth, executionTime, exception); + } + else + { + StrategyExecutedActionDebug(logger, builderName, strategyKey, resultType, result, executionHealth, executionTime, exception); + } } #endif } diff --git a/src/Polly.Extensions/Telemetry/ResilienceContextExtensions.cs b/src/Polly.Extensions/Telemetry/ResilienceContextExtensions.cs index ec4fa36275..87df8f617c 100644 --- a/src/Polly.Extensions/Telemetry/ResilienceContextExtensions.cs +++ b/src/Polly.Extensions/Telemetry/ResilienceContextExtensions.cs @@ -4,13 +4,9 @@ namespace Polly.Extensions.Telemetry; internal static class ResilienceContextExtensions { - public static string GetResultType(this ResilienceContext context) - { - return context.IsVoid ? "void" : context.ResultType.Name.ToString(CultureInfo.InvariantCulture); - } + public static string GetResultType(this ResilienceContext context) => context.IsVoid ? "void" : context.ResultType.Name.ToString(CultureInfo.InvariantCulture); - public static string GetExecutionHealth(this ResilienceContext context) - { - return context.ResilienceEvents.Count == 0 ? "Healthy" : "Unhealthy"; - } + public static string GetExecutionHealth(this ResilienceContext context) => context.IsExecutionHealthy() ? "Healthy" : "Unhealthy"; + + public static bool IsExecutionHealthy(this ResilienceContext context) => context.ResilienceEvents.Count == 0; } diff --git a/src/Polly.Extensions/Telemetry/TelemetryResilienceStrategy.cs b/src/Polly.Extensions/Telemetry/TelemetryResilienceStrategy.cs index 7302964322..34b7b5a485 100644 --- a/src/Polly.Extensions/Telemetry/TelemetryResilienceStrategy.cs +++ b/src/Polly.Extensions/Telemetry/TelemetryResilienceStrategy.cs @@ -58,8 +58,11 @@ protected override async ValueTask> ExecuteCoreAsync>>().Subject; + coll.Count.Should().Be(7); + coll.AsEnumerable().Should().HaveCount(7); + (coll as IEnumerable).GetEnumerator().Should().NotBeNull(); + + for (int i = 0; i < coll.Count; i++) + { + coll[i].Value.Should().NotBeNull(); + } + + coll.Invoking(c => c[coll.Count + 1]).Should().Throw(); } [Fact] diff --git a/test/Polly.TestUtils/FakeLogger.cs b/test/Polly.TestUtils/FakeLogger.cs index 2e20d4b075..9a6f70ac83 100644 --- a/test/Polly.TestUtils/FakeLogger.cs +++ b/test/Polly.TestUtils/FakeLogger.cs @@ -20,6 +20,6 @@ public IDisposable BeginScope(TState state) public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) where TState : notnull { - _records.Add(new LogRecord(eventId, formatter(state, exception), exception)); + _records.Add(new LogRecord(logLevel, eventId, formatter(state, exception), exception, state)); } } diff --git a/test/Polly.TestUtils/LogRecord.cs b/test/Polly.TestUtils/LogRecord.cs index 04685499b5..c25cc705f8 100644 --- a/test/Polly.TestUtils/LogRecord.cs +++ b/test/Polly.TestUtils/LogRecord.cs @@ -3,4 +3,4 @@ namespace Polly.TestUtils; #pragma warning disable CS8633 // Nullability in constraints for type parameter doesn't match the constraints for type parameter in implicitly implemented interface method'. -public record class LogRecord(EventId EventId, string Message, Exception? Exception); +public record class LogRecord(LogLevel LogLevel, EventId EventId, string Message, Exception? Exception, object State);