From 48885414e1b431ec5e198047740884847e0e646f Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Mon, 3 May 2021 18:26:25 -0500 Subject: [PATCH 1/3] Convert HealthChecks logging to use new Logging Source Generator --- .../src/DefaultHealthCheckService.cs | 166 ++++++++---------- .../src/HealthCheckPublisherHostedService.cs | 120 +++++-------- ...Extensions.Diagnostics.HealthChecks.csproj | 6 + 3 files changed, 125 insertions(+), 167 deletions(-) diff --git a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs index 7805292486fb..0ae30771794c 100644 --- a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs +++ b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs @@ -15,7 +15,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks { - internal class DefaultHealthCheckService : HealthCheckService + internal partial class DefaultHealthCheckService : HealthCheckService { private readonly IServiceScopeFactory _scopeFactory; private readonly IOptions _options; @@ -46,7 +46,7 @@ public override async Task CheckHealthAsync( } var totalTime = ValueStopwatch.StartNew(); - Log.HealthCheckProcessingBegin(_logger); + HealthCheckProcessingBegin(); var tasks = new Task[registrations.Count]; var index = 0; @@ -68,7 +68,7 @@ public override async Task CheckHealthAsync( var totalElapsedTime = totalTime.GetElapsedTime(); var report = new HealthReport(entries, totalElapsedTime); - Log.HealthCheckProcessingEnd(_logger, report.Status, totalElapsedTime); + HealthCheckProcessingEnd(report.Status, totalElapsedTime); return report; } @@ -87,7 +87,7 @@ private async Task RunCheckAsync(HealthCheckRegistration regi var stopwatch = ValueStopwatch.StartNew(); var context = new HealthCheckContext { Registration = registration }; - Log.HealthCheckBegin(_logger, registration); + HealthCheckBegin(registration.Name); HealthReportEntry entry; CancellationTokenSource? timeoutCancellationTokenSource = null; @@ -115,8 +115,8 @@ private async Task RunCheckAsync(HealthCheckRegistration regi data: result.Data, tags: registration.Tags); - Log.HealthCheckEnd(_logger, registration, entry, duration); - Log.HealthCheckData(_logger, registration, entry); + HealthCheckEnd(registration, entry, duration); + HealthCheckData(registration, entry); } catch (OperationCanceledException ex) when (!cancellationToken.IsCancellationRequested) { @@ -129,7 +129,7 @@ private async Task RunCheckAsync(HealthCheckRegistration regi data: null, tags: registration.Tags); - Log.HealthCheckError(_logger, registration, ex, duration); + HealthCheckError(registration, ex, duration); } // Allow cancellation to propagate if it's not a timeout. @@ -144,7 +144,7 @@ private async Task RunCheckAsync(HealthCheckRegistration regi data: null, tags: registration.Tags); - Log.HealthCheckError(_logger, registration, ex, duration); + HealthCheckError(registration, ex, duration); } finally @@ -182,104 +182,82 @@ private static void ValidateRegistrations(IEnumerable r internal static class EventIds { - public static readonly EventId HealthCheckProcessingBegin = new EventId(100, "HealthCheckProcessingBegin"); - public static readonly EventId HealthCheckProcessingEnd = new EventId(101, "HealthCheckProcessingEnd"); - - public static readonly EventId HealthCheckBegin = new EventId(102, "HealthCheckBegin"); - public static readonly EventId HealthCheckEnd = new EventId(103, "HealthCheckEnd"); - public static readonly EventId HealthCheckError = new EventId(104, "HealthCheckError"); - public static readonly EventId HealthCheckData = new EventId(105, "HealthCheckData"); + public const int HealthCheckProcessingBeginId = 100; + public const int HealthCheckProcessingEndId = 101; + public const int HealthCheckBeginId = 102; + public const int HealthCheckEndId = 103; + public const int HealthCheckErrorId = 104; + public const int HealthCheckDataId = 105; + + public static readonly EventId HealthCheckProcessingBegin = new EventId(HealthCheckProcessingBeginId, nameof(HealthCheckProcessingBegin)); + public static readonly EventId HealthCheckProcessingEnd = new EventId(HealthCheckProcessingEndId, nameof(HealthCheckProcessingEnd)); + + public static readonly EventId HealthCheckBegin = new EventId(HealthCheckBeginId, nameof(HealthCheckBegin)); + public static readonly EventId HealthCheckEnd = new EventId(HealthCheckEndId, nameof(HealthCheckEnd)); + public static readonly EventId HealthCheckError = new EventId(HealthCheckErrorId, nameof(HealthCheckError)); + public static readonly EventId HealthCheckData = new EventId(HealthCheckDataId, nameof(HealthCheckData)); } - private static class Log - { - private static readonly Action _healthCheckProcessingBegin = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckProcessingBegin, - "Running health checks"); - - private static readonly Action _healthCheckProcessingEnd = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckProcessingEnd, - "Health check processing with combined status {HealthStatus} completed after {ElapsedMilliseconds}ms"); - - private static readonly Action _healthCheckBegin = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckBegin, - "Running health check {HealthCheckName}"); - - // These are separate so they can have different log levels - private const string HealthCheckEndText = "Health check {HealthCheckName} with status {HealthStatus} completed after {ElapsedMilliseconds}ms with message '{HealthCheckDescription}'"; - - private static readonly Action _healthCheckEndHealthy = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckEnd, - HealthCheckEndText); - - private static readonly Action _healthCheckEndDegraded = LoggerMessage.Define( - LogLevel.Warning, - EventIds.HealthCheckEnd, - HealthCheckEndText); - - private static readonly Action _healthCheckEndUnhealthy = LoggerMessage.Define( - LogLevel.Error, - EventIds.HealthCheckEnd, - HealthCheckEndText); - - private static readonly Action _healthCheckError = LoggerMessage.Define( - LogLevel.Error, - EventIds.HealthCheckError, - "Health check {HealthCheckName} threw an unhandled exception after {ElapsedMilliseconds}ms"); - - public static void HealthCheckProcessingBegin(ILogger logger) - { - _healthCheckProcessingBegin(logger, null); - } + [LoggerMessage(EventId = EventIds.HealthCheckProcessingBeginId, Level = LogLevel.Debug, Message = "Running health checks")] + private partial void HealthCheckProcessingBegin(); - public static void HealthCheckProcessingEnd(ILogger logger, HealthStatus status, TimeSpan duration) - { - _healthCheckProcessingEnd(logger, duration.TotalMilliseconds, status, null); - } + private void HealthCheckProcessingEnd(HealthStatus status, TimeSpan duration) => + HealthCheckProcessingEnd(status, duration.TotalMilliseconds); - public static void HealthCheckBegin(ILogger logger, HealthCheckRegistration registration) - { - _healthCheckBegin(logger, registration.Name, null); - } + [LoggerMessage(EventId = EventIds.HealthCheckProcessingEndId, Level = LogLevel.Debug, Message = "Health check processing with combined status {HealthStatus} completed after {ElapsedMilliseconds}ms")] + private partial void HealthCheckProcessingEnd(HealthStatus HealthStatus, double ElapsedMilliseconds); - public static void HealthCheckEnd(ILogger logger, HealthCheckRegistration registration, HealthReportEntry entry, TimeSpan duration) - { - switch (entry.Status) - { - case HealthStatus.Healthy: - _healthCheckEndHealthy(logger, registration.Name, duration.TotalMilliseconds, entry.Status, entry.Description, null); - break; + [LoggerMessage(EventId = EventIds.HealthCheckBeginId, Level = LogLevel.Debug, Message = "Running health check {HealthCheckName}")] + private partial void HealthCheckBegin(string HealthCheckName); - case HealthStatus.Degraded: - _healthCheckEndDegraded(logger, registration.Name, duration.TotalMilliseconds, entry.Status, entry.Description, null); - break; + // These are separate so they can have different log levels + private const string HealthCheckEndText = "Health check {HealthCheckName} with status {HealthStatus} completed after {ElapsedMilliseconds}ms with message '{HealthCheckDescription}'"; - case HealthStatus.Unhealthy: - _healthCheckEndUnhealthy(logger, registration.Name, duration.TotalMilliseconds, entry.Status, entry.Description, entry.Exception); - break; - } - } +#pragma warning disable SYSLIB1006 + [LoggerMessage(EventId = EventIds.HealthCheckEndId, Level = LogLevel.Debug, Message = HealthCheckEndText)] + private partial void HealthCheckEndHealthy(string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription); - public static void HealthCheckError(ILogger logger, HealthCheckRegistration registration, Exception exception, TimeSpan duration) + [LoggerMessage(EventId = EventIds.HealthCheckEndId, Level = LogLevel.Warning, Message = HealthCheckEndText)] + private partial void HealthCheckEndDegraded(string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription); + + [LoggerMessage(EventId = EventIds.HealthCheckEndId, Level = LogLevel.Error, Message = HealthCheckEndText)] + private partial void HealthCheckEndUnhealthy(string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription, Exception? exception); +#pragma warning restore SYSLIB1006 + + private void HealthCheckEnd(HealthCheckRegistration registration, HealthReportEntry entry, TimeSpan duration) + { + switch (entry.Status) { - _healthCheckError(logger, registration.Name, duration.TotalMilliseconds, exception); + case HealthStatus.Healthy: + HealthCheckEndHealthy(registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description); + break; + + case HealthStatus.Degraded: + HealthCheckEndDegraded(registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description); + break; + + case HealthStatus.Unhealthy: + HealthCheckEndUnhealthy(registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description, entry.Exception); + break; } + } - public static void HealthCheckData(ILogger logger, HealthCheckRegistration registration, HealthReportEntry entry) + [LoggerMessage(EventId = EventIds.HealthCheckErrorId, Level = LogLevel.Error, Message = "Health check {HealthCheckName} threw an unhandled exception after {ElapsedMilliseconds}ms")] + private partial void HealthCheckError(string HealthCheckName, double ElapsedMilliseconds, Exception exception); + + private void HealthCheckError(HealthCheckRegistration registration, Exception exception, TimeSpan duration) => + HealthCheckError(registration.Name, duration.TotalMilliseconds, exception); + + private void HealthCheckData(HealthCheckRegistration registration, HealthReportEntry entry) + { + if (entry.Data.Count > 0 && _logger.IsEnabled(LogLevel.Debug)) { - if (entry.Data.Count > 0 && logger.IsEnabled(LogLevel.Debug)) - { - logger.Log( - LogLevel.Debug, - EventIds.HealthCheckData, - new HealthCheckDataLogValue(registration.Name, entry.Data), - null, - (state, ex) => state.ToString()); - } + _logger.Log( + LogLevel.Debug, + EventIds.HealthCheckData, + new HealthCheckDataLogValue(registration.Name, entry.Data), + null, + (state, ex) => state.ToString()); } } diff --git a/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs b/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs index 423c4e9fa74c..5167c80b3c37 100644 --- a/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs +++ b/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs @@ -13,7 +13,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks { - internal sealed class HealthCheckPublisherHostedService : IHostedService + internal sealed partial class HealthCheckPublisherHostedService : IHostedService { private readonly HealthCheckService _healthCheckService; private readonly IOptions _options; @@ -115,7 +115,7 @@ internal void CancelToken() internal async Task RunAsync() { var duration = ValueStopwatch.StartNew(); - Logger.HealthCheckPublisherProcessingBegin(_logger); + HealthCheckPublisherProcessingBegin(); CancellationTokenSource? cancellation = null; try @@ -128,7 +128,7 @@ internal async Task RunAsync() await RunAsyncCore(cancellation.Token); - Logger.HealthCheckPublisherProcessingEnd(_logger, duration.GetElapsedTime()); + HealthCheckPublisherProcessingEnd(duration.GetElapsedTime()); } catch (OperationCanceledException) when (IsStopping) { @@ -138,7 +138,7 @@ internal async Task RunAsync() catch (Exception ex) { // This is an error, publishing failed. - Logger.HealthCheckPublisherProcessingEnd(_logger, duration.GetElapsedTime(), ex); + HealthCheckPublisherProcessingEnd(duration.GetElapsedTime(), ex); } finally { @@ -170,10 +170,10 @@ private async Task RunPublisherAsync(IHealthCheckPublisher publisher, HealthRepo try { - Logger.HealthCheckPublisherBegin(_logger, publisher); + HealthCheckPublisherBegin(publisher); await publisher.PublishAsync(report, cancellationToken); - Logger.HealthCheckPublisherEnd(_logger, publisher, duration.GetElapsedTime()); + HealthCheckPublisherEnd(publisher, duration.GetElapsedTime()); } catch (OperationCanceledException) when (IsStopping) { @@ -182,89 +182,63 @@ private async Task RunPublisherAsync(IHealthCheckPublisher publisher, HealthRepo } catch (OperationCanceledException) { - Logger.HealthCheckPublisherTimeout(_logger, publisher, duration.GetElapsedTime()); + HealthCheckPublisherTimeout(publisher, duration.GetElapsedTime()); throw; } catch (Exception ex) { - Logger.HealthCheckPublisherError(_logger, publisher, duration.GetElapsedTime(), ex); + HealthCheckPublisherError(publisher, duration.GetElapsedTime(), ex); throw; } } internal static class EventIds { - public static readonly EventId HealthCheckPublisherProcessingBegin = new EventId(100, "HealthCheckPublisherProcessingBegin"); - public static readonly EventId HealthCheckPublisherProcessingEnd = new EventId(101, "HealthCheckPublisherProcessingEnd"); - public static readonly EventId HealthCheckPublisherProcessingError = new EventId(101, "HealthCheckPublisherProcessingError"); - - public static readonly EventId HealthCheckPublisherBegin = new EventId(102, "HealthCheckPublisherBegin"); - public static readonly EventId HealthCheckPublisherEnd = new EventId(103, "HealthCheckPublisherEnd"); - public static readonly EventId HealthCheckPublisherError = new EventId(104, "HealthCheckPublisherError"); - public static readonly EventId HealthCheckPublisherTimeout = new EventId(104, "HealthCheckPublisherTimeout"); + public const int HealthCheckPublisherProcessingBeginId = 100; + public const int HealthCheckPublisherProcessingEndId = 101; + public const int HealthCheckPublisherBeginId = 102; + public const int HealthCheckPublisherEndId = 103; + public const int HealthCheckPublisherErrorId = 104; + public const int HealthCheckPublisherTimeoutId = 104; + + public static readonly EventId HealthCheckPublisherProcessingBegin = new EventId(HealthCheckPublisherProcessingBeginId, nameof(HealthCheckPublisherProcessingBegin)); + public static readonly EventId HealthCheckPublisherProcessingEnd = new EventId(HealthCheckPublisherProcessingEndId, nameof(HealthCheckPublisherProcessingEnd)); + public static readonly EventId HealthCheckPublisherBegin = new EventId(HealthCheckPublisherBeginId, nameof(HealthCheckPublisherBegin)); + public static readonly EventId HealthCheckPublisherEnd = new EventId(HealthCheckPublisherEndId, nameof(HealthCheckPublisherEnd)); + public static readonly EventId HealthCheckPublisherError = new EventId(HealthCheckPublisherErrorId, nameof(HealthCheckPublisherError)); + public static readonly EventId HealthCheckPublisherTimeout = new EventId(HealthCheckPublisherTimeoutId, nameof(HealthCheckPublisherTimeout)); } - private static class Logger - { - private static readonly Action _healthCheckPublisherProcessingBegin = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckPublisherProcessingBegin, - "Running health check publishers"); - - private static readonly Action _healthCheckPublisherProcessingEnd = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckPublisherProcessingEnd, - "Health check publisher processing completed after {ElapsedMilliseconds}ms"); - - private static readonly Action _healthCheckPublisherBegin = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckPublisherBegin, - "Running health check publisher '{HealthCheckPublisher}'"); - - private static readonly Action _healthCheckPublisherEnd = LoggerMessage.Define( - LogLevel.Debug, - EventIds.HealthCheckPublisherEnd, - "Health check '{HealthCheckPublisher}' completed after {ElapsedMilliseconds}ms"); - - private static readonly Action _healthCheckPublisherError = LoggerMessage.Define( - LogLevel.Error, - EventIds.HealthCheckPublisherError, - "Health check {HealthCheckPublisher} threw an unhandled exception after {ElapsedMilliseconds}ms"); - - private static readonly Action _healthCheckPublisherTimeout = LoggerMessage.Define( - LogLevel.Error, - EventIds.HealthCheckPublisherTimeout, - "Health check {HealthCheckPublisher} was canceled after {ElapsedMilliseconds}ms"); - - public static void HealthCheckPublisherProcessingBegin(ILogger logger) - { - _healthCheckPublisherProcessingBegin(logger, null); - } + [LoggerMessage(EventId = EventIds.HealthCheckPublisherProcessingBeginId, Level = LogLevel.Debug, Message = "Running health check publishers")] + private partial void HealthCheckPublisherProcessingBegin(); - public static void HealthCheckPublisherProcessingEnd(ILogger logger, TimeSpan duration, Exception? exception = null) - { - _healthCheckPublisherProcessingEnd(logger, duration.TotalMilliseconds, exception); - } + private void HealthCheckPublisherProcessingEnd(TimeSpan duration, Exception? exception = null) => + HealthCheckPublisherProcessingEnd(duration.TotalMilliseconds, exception); - public static void HealthCheckPublisherBegin(ILogger logger, IHealthCheckPublisher publisher) - { - _healthCheckPublisherBegin(logger, publisher, null); - } + [LoggerMessage(EventId = EventIds.HealthCheckPublisherProcessingEndId, Level = LogLevel.Debug, Message = "Health check publisher processing completed after {ElapsedMilliseconds}ms")] + private partial void HealthCheckPublisherProcessingEnd(double ElapsedMilliseconds, Exception? exception = null); - public static void HealthCheckPublisherEnd(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration) - { - _healthCheckPublisherEnd(logger, publisher, duration.TotalMilliseconds, null); - } + [LoggerMessage(EventId = EventIds.HealthCheckPublisherBeginId, Level = LogLevel.Debug, Message = "Running health check publisher '{HealthCheckPublisher}'")] + private partial void HealthCheckPublisherBegin(IHealthCheckPublisher HealthCheckPublisher); - public static void HealthCheckPublisherError(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration, Exception exception) - { - _healthCheckPublisherError(logger, publisher, duration.TotalMilliseconds, exception); - } + private void HealthCheckPublisherEnd(IHealthCheckPublisher HealthCheckPublisher, TimeSpan duration) => + HealthCheckPublisherEnd(HealthCheckPublisher, duration.TotalMilliseconds); - public static void HealthCheckPublisherTimeout(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration) - { - _healthCheckPublisherTimeout(logger, publisher, duration.TotalMilliseconds, null); - } - } + [LoggerMessage(EventId = EventIds.HealthCheckPublisherEndId, Level = LogLevel.Debug, Message = "Health check '{HealthCheckPublisher}' completed after {ElapsedMilliseconds}ms")] + private partial void HealthCheckPublisherEnd(IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds); + + private void HealthCheckPublisherError(IHealthCheckPublisher publisher, TimeSpan duration, Exception exception) => + HealthCheckPublisherError(publisher, duration.TotalMilliseconds, exception); + +#pragma warning disable SYSLIB1006 + [LoggerMessage(EventId = EventIds.HealthCheckPublisherErrorId, Level = LogLevel.Error, Message = "Health check {HealthCheckPublisher} threw an unhandled exception after {ElapsedMilliseconds}ms")] + private partial void HealthCheckPublisherError(IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds, Exception exception); + + private void HealthCheckPublisherTimeout(IHealthCheckPublisher publisher, TimeSpan duration) => + HealthCheckPublisherTimeout(publisher, duration.TotalMilliseconds); + + [LoggerMessage(EventId = EventIds.HealthCheckPublisherTimeoutId, Level = LogLevel.Error, Message = "Health check {HealthCheckPublisher} was canceled after {ElapsedMilliseconds}ms")] + private partial void HealthCheckPublisherTimeout(IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds); +#pragma warning restore SYSLIB1006 } } diff --git a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj index b7b1240c77dc..9815e966a881 100644 --- a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj +++ b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj @@ -12,6 +12,8 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder diagnostics;healthchecks true enable + + $(NoWarn);SYSLIB1006 @@ -28,6 +30,10 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder + + + + From b6a021a619f97290fa51832a6c99949d18869239 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Tue, 29 Jun 2021 12:47:31 -0500 Subject: [PATCH 2/3] Respond to latest logging library changes and PR feedback * Keep nested Log class * Hard-code event names to ensure code refactoring doesn't lead to breaks --- .../src/DefaultHealthCheckService.cs | 122 ++++++++++-------- .../src/HealthCheckPublisherHostedService.cs | 79 +++++++----- 2 files changed, 111 insertions(+), 90 deletions(-) diff --git a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs index 0ae30771794c..e4615d44f379 100644 --- a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs +++ b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs @@ -46,7 +46,7 @@ public override async Task CheckHealthAsync( } var totalTime = ValueStopwatch.StartNew(); - HealthCheckProcessingBegin(); + Log.HealthCheckProcessingBegin(_logger); var tasks = new Task[registrations.Count]; var index = 0; @@ -68,7 +68,7 @@ public override async Task CheckHealthAsync( var totalElapsedTime = totalTime.GetElapsedTime(); var report = new HealthReport(entries, totalElapsedTime); - HealthCheckProcessingEnd(report.Status, totalElapsedTime); + Log.HealthCheckProcessingEnd(_logger, report.Status, totalElapsedTime); return report; } @@ -87,7 +87,7 @@ private async Task RunCheckAsync(HealthCheckRegistration regi var stopwatch = ValueStopwatch.StartNew(); var context = new HealthCheckContext { Registration = registration }; - HealthCheckBegin(registration.Name); + Log.HealthCheckBegin(_logger, registration.Name); HealthReportEntry entry; CancellationTokenSource? timeoutCancellationTokenSource = null; @@ -115,8 +115,8 @@ private async Task RunCheckAsync(HealthCheckRegistration regi data: result.Data, tags: registration.Tags); - HealthCheckEnd(registration, entry, duration); - HealthCheckData(registration, entry); + Log.HealthCheckEnd(_logger, registration, entry, duration); + Log.HealthCheckData(_logger, registration, entry); } catch (OperationCanceledException ex) when (!cancellationToken.IsCancellationRequested) { @@ -129,7 +129,7 @@ private async Task RunCheckAsync(HealthCheckRegistration regi data: null, tags: registration.Tags); - HealthCheckError(registration, ex, duration); + Log.HealthCheckError(_logger, registration, ex, duration); } // Allow cancellation to propagate if it's not a timeout. @@ -144,7 +144,7 @@ private async Task RunCheckAsync(HealthCheckRegistration regi data: null, tags: registration.Tags); - HealthCheckError(registration, ex, duration); + Log.HealthCheckError(_logger, registration, ex, duration); } finally @@ -189,75 +189,85 @@ internal static class EventIds public const int HealthCheckErrorId = 104; public const int HealthCheckDataId = 105; - public static readonly EventId HealthCheckProcessingBegin = new EventId(HealthCheckProcessingBeginId, nameof(HealthCheckProcessingBegin)); - public static readonly EventId HealthCheckProcessingEnd = new EventId(HealthCheckProcessingEndId, nameof(HealthCheckProcessingEnd)); - - public static readonly EventId HealthCheckBegin = new EventId(HealthCheckBeginId, nameof(HealthCheckBegin)); - public static readonly EventId HealthCheckEnd = new EventId(HealthCheckEndId, nameof(HealthCheckEnd)); - public static readonly EventId HealthCheckError = new EventId(HealthCheckErrorId, nameof(HealthCheckError)); - public static readonly EventId HealthCheckData = new EventId(HealthCheckDataId, nameof(HealthCheckData)); + // Hard code the event names to avoid breaking changes. Even if the methods are renamed, these hard-coded names shouldn't change. + public const string HealthCheckProcessingBeginName = "HealthCheckProcessingBegin"; + public const string HealthCheckProcessingEndName = "HealthCheckProcessingEnd"; + public const string HealthCheckBeginName = "HealthCheckBegin"; + public const string HealthCheckEndName = "HealthCheckEnd"; + public const string HealthCheckErrorName = "HealthCheckError"; + public const string HealthCheckDataName = "HealthCheckData"; + + public static readonly EventId HealthCheckProcessingBegin = new EventId(HealthCheckProcessingBeginId, HealthCheckProcessingBeginName); + public static readonly EventId HealthCheckProcessingEnd = new EventId(HealthCheckProcessingEndId, HealthCheckProcessingEndName); + public static readonly EventId HealthCheckBegin = new EventId(HealthCheckBeginId, HealthCheckBeginName); + public static readonly EventId HealthCheckEnd = new EventId(HealthCheckEndId, HealthCheckEndName); + public static readonly EventId HealthCheckError = new EventId(HealthCheckErrorId, HealthCheckErrorName); + public static readonly EventId HealthCheckData = new EventId(HealthCheckDataId, HealthCheckDataName); } - [LoggerMessage(EventId = EventIds.HealthCheckProcessingBeginId, Level = LogLevel.Debug, Message = "Running health checks")] - private partial void HealthCheckProcessingBegin(); + private static partial class Log + { + [LoggerMessage(EventIds.HealthCheckProcessingBeginId, LogLevel.Debug, "Running health checks", EventName = EventIds.HealthCheckProcessingBeginName)] + public static partial void HealthCheckProcessingBegin(ILogger logger); - private void HealthCheckProcessingEnd(HealthStatus status, TimeSpan duration) => - HealthCheckProcessingEnd(status, duration.TotalMilliseconds); + public static void HealthCheckProcessingEnd(ILogger logger, HealthStatus status, TimeSpan duration) => + HealthCheckProcessingEnd(logger, status, duration.TotalMilliseconds); - [LoggerMessage(EventId = EventIds.HealthCheckProcessingEndId, Level = LogLevel.Debug, Message = "Health check processing with combined status {HealthStatus} completed after {ElapsedMilliseconds}ms")] - private partial void HealthCheckProcessingEnd(HealthStatus HealthStatus, double ElapsedMilliseconds); + [LoggerMessage(EventIds.HealthCheckProcessingEndId, LogLevel.Debug, "Health check processing with combined status {HealthStatus} completed after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckProcessingEndName)] + private static partial void HealthCheckProcessingEnd(ILogger logger, HealthStatus HealthStatus, double ElapsedMilliseconds); - [LoggerMessage(EventId = EventIds.HealthCheckBeginId, Level = LogLevel.Debug, Message = "Running health check {HealthCheckName}")] - private partial void HealthCheckBegin(string HealthCheckName); + [LoggerMessage(EventIds.HealthCheckBeginId, LogLevel.Debug, "Running health check {HealthCheckName}", EventName = EventIds.HealthCheckBeginName)] + public static partial void HealthCheckBegin(ILogger logger, string HealthCheckName); - // These are separate so they can have different log levels - private const string HealthCheckEndText = "Health check {HealthCheckName} with status {HealthStatus} completed after {ElapsedMilliseconds}ms with message '{HealthCheckDescription}'"; + // These are separate so they can have different log levels + private const string HealthCheckEndText = "Health check {HealthCheckName} with status {HealthStatus} completed after {ElapsedMilliseconds}ms with message '{HealthCheckDescription}'"; #pragma warning disable SYSLIB1006 - [LoggerMessage(EventId = EventIds.HealthCheckEndId, Level = LogLevel.Debug, Message = HealthCheckEndText)] - private partial void HealthCheckEndHealthy(string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription); + [LoggerMessage(EventIds.HealthCheckEndId, LogLevel.Debug, HealthCheckEndText, EventName = EventIds.HealthCheckEndName)] + private static partial void HealthCheckEndHealthy(ILogger logger, string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription); - [LoggerMessage(EventId = EventIds.HealthCheckEndId, Level = LogLevel.Warning, Message = HealthCheckEndText)] - private partial void HealthCheckEndDegraded(string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription); + [LoggerMessage(EventIds.HealthCheckEndId, LogLevel.Warning, HealthCheckEndText, EventName = EventIds.HealthCheckEndName)] + private static partial void HealthCheckEndDegraded(ILogger logger, string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription); - [LoggerMessage(EventId = EventIds.HealthCheckEndId, Level = LogLevel.Error, Message = HealthCheckEndText)] - private partial void HealthCheckEndUnhealthy(string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription, Exception? exception); + [LoggerMessage(EventIds.HealthCheckEndId, LogLevel.Error, HealthCheckEndText, EventName = EventIds.HealthCheckEndName)] + private static partial void HealthCheckEndUnhealthy(ILogger logger, string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription, Exception? exception); #pragma warning restore SYSLIB1006 - private void HealthCheckEnd(HealthCheckRegistration registration, HealthReportEntry entry, TimeSpan duration) - { - switch (entry.Status) + public static void HealthCheckEnd(ILogger logger, HealthCheckRegistration registration, HealthReportEntry entry, TimeSpan duration) { - case HealthStatus.Healthy: - HealthCheckEndHealthy(registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description); - break; + switch (entry.Status) + { + case HealthStatus.Healthy: + HealthCheckEndHealthy(logger, registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description); + break; - case HealthStatus.Degraded: - HealthCheckEndDegraded(registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description); - break; + case HealthStatus.Degraded: + HealthCheckEndDegraded(logger, registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description); + break; - case HealthStatus.Unhealthy: - HealthCheckEndUnhealthy(registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description, entry.Exception); - break; + case HealthStatus.Unhealthy: + HealthCheckEndUnhealthy(logger, registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description, entry.Exception); + break; + } } - } - [LoggerMessage(EventId = EventIds.HealthCheckErrorId, Level = LogLevel.Error, Message = "Health check {HealthCheckName} threw an unhandled exception after {ElapsedMilliseconds}ms")] - private partial void HealthCheckError(string HealthCheckName, double ElapsedMilliseconds, Exception exception); + [LoggerMessage(EventIds.HealthCheckErrorId, LogLevel.Error, "Health check {HealthCheckName} threw an unhandled exception after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckErrorName)] + private static partial void HealthCheckError(ILogger logger, string HealthCheckName, double ElapsedMilliseconds, Exception exception); - private void HealthCheckError(HealthCheckRegistration registration, Exception exception, TimeSpan duration) => - HealthCheckError(registration.Name, duration.TotalMilliseconds, exception); + public static void HealthCheckError(ILogger logger, HealthCheckRegistration registration, Exception exception, TimeSpan duration) => + HealthCheckError(logger, registration.Name, duration.TotalMilliseconds, exception); - private void HealthCheckData(HealthCheckRegistration registration, HealthReportEntry entry) - { - if (entry.Data.Count > 0 && _logger.IsEnabled(LogLevel.Debug)) + public static void HealthCheckData(ILogger logger, HealthCheckRegistration registration, HealthReportEntry entry) { - _logger.Log( - LogLevel.Debug, - EventIds.HealthCheckData, - new HealthCheckDataLogValue(registration.Name, entry.Data), - null, - (state, ex) => state.ToString()); + if (entry.Data.Count > 0 && logger.IsEnabled(LogLevel.Debug)) + { + logger.Log( + LogLevel.Debug, + EventIds.HealthCheckData, + new HealthCheckDataLogValue(registration.Name, entry.Data), + null, + (state, ex) => state.ToString()); + } } } diff --git a/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs b/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs index 5167c80b3c37..834015dda495 100644 --- a/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs +++ b/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs @@ -20,7 +20,7 @@ internal sealed partial class HealthCheckPublisherHostedService : IHostedService private readonly ILogger _logger; private readonly IHealthCheckPublisher[] _publishers; - private CancellationTokenSource _stopping; + private readonly CancellationTokenSource _stopping; private Timer? _timer; private CancellationTokenSource? _runTokenSource; @@ -115,7 +115,7 @@ internal void CancelToken() internal async Task RunAsync() { var duration = ValueStopwatch.StartNew(); - HealthCheckPublisherProcessingBegin(); + Logger.HealthCheckPublisherProcessingBegin(_logger); CancellationTokenSource? cancellation = null; try @@ -128,7 +128,7 @@ internal async Task RunAsync() await RunAsyncCore(cancellation.Token); - HealthCheckPublisherProcessingEnd(duration.GetElapsedTime()); + Logger.HealthCheckPublisherProcessingEnd(_logger, duration.GetElapsedTime()); } catch (OperationCanceledException) when (IsStopping) { @@ -138,7 +138,7 @@ internal async Task RunAsync() catch (Exception ex) { // This is an error, publishing failed. - HealthCheckPublisherProcessingEnd(duration.GetElapsedTime(), ex); + Logger.HealthCheckPublisherProcessingEnd(_logger, duration.GetElapsedTime(), ex); } finally { @@ -170,10 +170,10 @@ private async Task RunPublisherAsync(IHealthCheckPublisher publisher, HealthRepo try { - HealthCheckPublisherBegin(publisher); + Logger.HealthCheckPublisherBegin(_logger, publisher); await publisher.PublishAsync(report, cancellationToken); - HealthCheckPublisherEnd(publisher, duration.GetElapsedTime()); + Logger.HealthCheckPublisherEnd(_logger, publisher, duration.GetElapsedTime()); } catch (OperationCanceledException) when (IsStopping) { @@ -182,12 +182,12 @@ private async Task RunPublisherAsync(IHealthCheckPublisher publisher, HealthRepo } catch (OperationCanceledException) { - HealthCheckPublisherTimeout(publisher, duration.GetElapsedTime()); + Logger.HealthCheckPublisherTimeout(_logger, publisher, duration.GetElapsedTime()); throw; } catch (Exception ex) { - HealthCheckPublisherError(publisher, duration.GetElapsedTime(), ex); + Logger.HealthCheckPublisherError(_logger, publisher, duration.GetElapsedTime(), ex); throw; } } @@ -201,44 +201,55 @@ internal static class EventIds public const int HealthCheckPublisherErrorId = 104; public const int HealthCheckPublisherTimeoutId = 104; - public static readonly EventId HealthCheckPublisherProcessingBegin = new EventId(HealthCheckPublisherProcessingBeginId, nameof(HealthCheckPublisherProcessingBegin)); - public static readonly EventId HealthCheckPublisherProcessingEnd = new EventId(HealthCheckPublisherProcessingEndId, nameof(HealthCheckPublisherProcessingEnd)); - public static readonly EventId HealthCheckPublisherBegin = new EventId(HealthCheckPublisherBeginId, nameof(HealthCheckPublisherBegin)); - public static readonly EventId HealthCheckPublisherEnd = new EventId(HealthCheckPublisherEndId, nameof(HealthCheckPublisherEnd)); - public static readonly EventId HealthCheckPublisherError = new EventId(HealthCheckPublisherErrorId, nameof(HealthCheckPublisherError)); - public static readonly EventId HealthCheckPublisherTimeout = new EventId(HealthCheckPublisherTimeoutId, nameof(HealthCheckPublisherTimeout)); + // Hard code the event names to avoid breaking changes. Even if the methods are renamed, these hard-coded names shouldn't change. + public const string HealthCheckPublisherProcessingBeginName = "HealthCheckPublisherProcessingBegin"; + public const string HealthCheckPublisherProcessingEndName = "HealthCheckPublisherProcessingEnd"; + public const string HealthCheckPublisherBeginName = "HealthCheckPublisherBegin"; + public const string HealthCheckPublisherEndName = "HealthCheckPublisherEnd"; + public const string HealthCheckPublisherErrorName = "HealthCheckPublisherError"; + public const string HealthCheckPublisherTimeoutName = "HealthCheckPublisherTimeout"; + + public static readonly EventId HealthCheckPublisherProcessingBegin = new EventId(HealthCheckPublisherProcessingBeginId, HealthCheckPublisherProcessingBeginName); + public static readonly EventId HealthCheckPublisherProcessingEnd = new EventId(HealthCheckPublisherProcessingEndId, HealthCheckPublisherProcessingEndName); + public static readonly EventId HealthCheckPublisherBegin = new EventId(HealthCheckPublisherBeginId, HealthCheckPublisherBeginName); + public static readonly EventId HealthCheckPublisherEnd = new EventId(HealthCheckPublisherEndId, HealthCheckPublisherEndName); + public static readonly EventId HealthCheckPublisherError = new EventId(HealthCheckPublisherErrorId, HealthCheckPublisherErrorName); + public static readonly EventId HealthCheckPublisherTimeout = new EventId(HealthCheckPublisherTimeoutId, HealthCheckPublisherTimeoutName); } - [LoggerMessage(EventId = EventIds.HealthCheckPublisherProcessingBeginId, Level = LogLevel.Debug, Message = "Running health check publishers")] - private partial void HealthCheckPublisherProcessingBegin(); + private static partial class Logger + { + [LoggerMessage(EventIds.HealthCheckPublisherProcessingBeginId, LogLevel.Debug, "Running health check publishers", EventName = EventIds.HealthCheckPublisherProcessingBeginName)] + public static partial void HealthCheckPublisherProcessingBegin(ILogger logger); - private void HealthCheckPublisherProcessingEnd(TimeSpan duration, Exception? exception = null) => - HealthCheckPublisherProcessingEnd(duration.TotalMilliseconds, exception); + public static void HealthCheckPublisherProcessingEnd(ILogger logger, TimeSpan duration, Exception? exception = null) => + HealthCheckPublisherProcessingEnd(logger, duration.TotalMilliseconds, exception); - [LoggerMessage(EventId = EventIds.HealthCheckPublisherProcessingEndId, Level = LogLevel.Debug, Message = "Health check publisher processing completed after {ElapsedMilliseconds}ms")] - private partial void HealthCheckPublisherProcessingEnd(double ElapsedMilliseconds, Exception? exception = null); + [LoggerMessage(EventIds.HealthCheckPublisherProcessingEndId, LogLevel.Debug, "Health check publisher processing completed after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherProcessingEndName)] + private static partial void HealthCheckPublisherProcessingEnd(ILogger logger, double ElapsedMilliseconds, Exception? exception = null); - [LoggerMessage(EventId = EventIds.HealthCheckPublisherBeginId, Level = LogLevel.Debug, Message = "Running health check publisher '{HealthCheckPublisher}'")] - private partial void HealthCheckPublisherBegin(IHealthCheckPublisher HealthCheckPublisher); + [LoggerMessage(EventIds.HealthCheckPublisherBeginId, LogLevel.Debug, "Running health check publisher '{HealthCheckPublisher}'", EventName = EventIds.HealthCheckPublisherBeginName)] + public static partial void HealthCheckPublisherBegin(ILogger logger, IHealthCheckPublisher HealthCheckPublisher); - private void HealthCheckPublisherEnd(IHealthCheckPublisher HealthCheckPublisher, TimeSpan duration) => - HealthCheckPublisherEnd(HealthCheckPublisher, duration.TotalMilliseconds); + public static void HealthCheckPublisherEnd(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, TimeSpan duration) => + HealthCheckPublisherEnd(logger, HealthCheckPublisher, duration.TotalMilliseconds); - [LoggerMessage(EventId = EventIds.HealthCheckPublisherEndId, Level = LogLevel.Debug, Message = "Health check '{HealthCheckPublisher}' completed after {ElapsedMilliseconds}ms")] - private partial void HealthCheckPublisherEnd(IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds); + [LoggerMessage(EventIds.HealthCheckPublisherEndId, LogLevel.Debug, "Health check '{HealthCheckPublisher}' completed after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherEndName)] + private static partial void HealthCheckPublisherEnd(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds); - private void HealthCheckPublisherError(IHealthCheckPublisher publisher, TimeSpan duration, Exception exception) => - HealthCheckPublisherError(publisher, duration.TotalMilliseconds, exception); + public static void HealthCheckPublisherError(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration, Exception exception) => + HealthCheckPublisherError(logger, publisher, duration.TotalMilliseconds, exception); #pragma warning disable SYSLIB1006 - [LoggerMessage(EventId = EventIds.HealthCheckPublisherErrorId, Level = LogLevel.Error, Message = "Health check {HealthCheckPublisher} threw an unhandled exception after {ElapsedMilliseconds}ms")] - private partial void HealthCheckPublisherError(IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds, Exception exception); + [LoggerMessage(EventIds.HealthCheckPublisherErrorId, LogLevel.Error, "Health check {HealthCheckPublisher} threw an unhandled exception after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherErrorName)] + private static partial void HealthCheckPublisherError(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds, Exception exception); - private void HealthCheckPublisherTimeout(IHealthCheckPublisher publisher, TimeSpan duration) => - HealthCheckPublisherTimeout(publisher, duration.TotalMilliseconds); + public static void HealthCheckPublisherTimeout(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration) => + HealthCheckPublisherTimeout(logger, publisher, duration.TotalMilliseconds); - [LoggerMessage(EventId = EventIds.HealthCheckPublisherTimeoutId, Level = LogLevel.Error, Message = "Health check {HealthCheckPublisher} was canceled after {ElapsedMilliseconds}ms")] - private partial void HealthCheckPublisherTimeout(IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds); + [LoggerMessage(EventIds.HealthCheckPublisherTimeoutId, LogLevel.Error, "Health check {HealthCheckPublisher} was canceled after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherTimeoutName)] + private static partial void HealthCheckPublisherTimeout(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds); #pragma warning restore SYSLIB1006 + } } } From 0d037c02a5281d01aa7b75ed607a59c7435c185b Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Wed, 30 Jun 2021 13:38:17 -0500 Subject: [PATCH 3/3] PR feedback --- .../src/DefaultHealthCheckService.cs | 5 -- .../src/HealthCheckPublisherHostedService.cs | 9 +-- ...Extensions.Diagnostics.HealthChecks.csproj | 4 - .../HealthCheckPublisherHostedServiceTest.cs | 77 +++++++++++-------- 4 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs index e4615d44f379..a8abfdbcd5ab 100644 --- a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs +++ b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs @@ -197,11 +197,6 @@ internal static class EventIds public const string HealthCheckErrorName = "HealthCheckError"; public const string HealthCheckDataName = "HealthCheckData"; - public static readonly EventId HealthCheckProcessingBegin = new EventId(HealthCheckProcessingBeginId, HealthCheckProcessingBeginName); - public static readonly EventId HealthCheckProcessingEnd = new EventId(HealthCheckProcessingEndId, HealthCheckProcessingEndName); - public static readonly EventId HealthCheckBegin = new EventId(HealthCheckBeginId, HealthCheckBeginName); - public static readonly EventId HealthCheckEnd = new EventId(HealthCheckEndId, HealthCheckEndName); - public static readonly EventId HealthCheckError = new EventId(HealthCheckErrorId, HealthCheckErrorName); public static readonly EventId HealthCheckData = new EventId(HealthCheckDataId, HealthCheckDataName); } diff --git a/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs b/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs index 834015dda495..4f5aa29c2779 100644 --- a/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs +++ b/src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs @@ -208,13 +208,6 @@ internal static class EventIds public const string HealthCheckPublisherEndName = "HealthCheckPublisherEnd"; public const string HealthCheckPublisherErrorName = "HealthCheckPublisherError"; public const string HealthCheckPublisherTimeoutName = "HealthCheckPublisherTimeout"; - - public static readonly EventId HealthCheckPublisherProcessingBegin = new EventId(HealthCheckPublisherProcessingBeginId, HealthCheckPublisherProcessingBeginName); - public static readonly EventId HealthCheckPublisherProcessingEnd = new EventId(HealthCheckPublisherProcessingEndId, HealthCheckPublisherProcessingEndName); - public static readonly EventId HealthCheckPublisherBegin = new EventId(HealthCheckPublisherBeginId, HealthCheckPublisherBeginName); - public static readonly EventId HealthCheckPublisherEnd = new EventId(HealthCheckPublisherEndId, HealthCheckPublisherEndName); - public static readonly EventId HealthCheckPublisherError = new EventId(HealthCheckPublisherErrorId, HealthCheckPublisherErrorName); - public static readonly EventId HealthCheckPublisherTimeout = new EventId(HealthCheckPublisherTimeoutId, HealthCheckPublisherTimeoutName); } private static partial class Logger @@ -229,7 +222,7 @@ public static void HealthCheckPublisherProcessingEnd(ILogger logger, TimeSpan du private static partial void HealthCheckPublisherProcessingEnd(ILogger logger, double ElapsedMilliseconds, Exception? exception = null); [LoggerMessage(EventIds.HealthCheckPublisherBeginId, LogLevel.Debug, "Running health check publisher '{HealthCheckPublisher}'", EventName = EventIds.HealthCheckPublisherBeginName)] - public static partial void HealthCheckPublisherBegin(ILogger logger, IHealthCheckPublisher HealthCheckPublisher); + public static partial void HealthCheckPublisherBegin(ILogger logger, IHealthCheckPublisher HealthCheckPublisher); public static void HealthCheckPublisherEnd(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, TimeSpan duration) => HealthCheckPublisherEnd(logger, HealthCheckPublisher, duration.TotalMilliseconds); diff --git a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj index 9815e966a881..8cb2a979d8ab 100644 --- a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj +++ b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj @@ -30,10 +30,6 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder - - - - diff --git a/src/HealthChecks/HealthChecks/test/HealthCheckPublisherHostedServiceTest.cs b/src/HealthChecks/HealthChecks/test/HealthCheckPublisherHostedServiceTest.cs index c5da4caac52c..9182da6ffe65 100644 --- a/src/HealthChecks/HealthChecks/test/HealthCheckPublisherHostedServiceTest.cs +++ b/src/HealthChecks/HealthChecks/test/HealthCheckPublisherHostedServiceTest.cs @@ -19,6 +19,23 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks { public class HealthCheckPublisherHostedServiceTest { + private static class DefaultHealthCheckEventIds + { + public static readonly EventId HealthCheckProcessingBegin = new EventId(DefaultHealthCheckService.EventIds.HealthCheckProcessingBeginId, DefaultHealthCheckService.EventIds.HealthCheckProcessingBeginName); + public static readonly EventId HealthCheckProcessingEnd = new EventId(DefaultHealthCheckService.EventIds.HealthCheckProcessingEndId, DefaultHealthCheckService.EventIds.HealthCheckProcessingEndName); + public static readonly EventId HealthCheckBegin = new EventId(DefaultHealthCheckService.EventIds.HealthCheckBeginId, DefaultHealthCheckService.EventIds.HealthCheckBeginName); + public static readonly EventId HealthCheckEnd = new EventId(DefaultHealthCheckService.EventIds.HealthCheckEndId, DefaultHealthCheckService.EventIds.HealthCheckEndName); + } + private static class HealthCheckPublisherEventIds + { + public static readonly EventId HealthCheckPublisherProcessingBegin = new EventId(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingBeginId, HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingBeginName); + public static readonly EventId HealthCheckPublisherProcessingEnd = new EventId(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingEndId, HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingEndName); + public static readonly EventId HealthCheckPublisherBegin = new EventId(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherBeginId, HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherBeginName); + public static readonly EventId HealthCheckPublisherEnd = new EventId(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherEndId, HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherEndName); + public static readonly EventId HealthCheckPublisherError = new EventId(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherErrorId, HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherErrorName); + public static readonly EventId HealthCheckPublisherTimeout = new EventId(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherTimeoutId, HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherTimeoutName); + } + [Fact] public async Task StartAsync_WithoutPublishers_DoesNotStartTimer() { @@ -210,16 +227,16 @@ public async Task RunAsync_WaitsForCompletion_Single() Assert.Collection( sink.Writes, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingBegin, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckProcessingBegin, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckBegin, entry.EventId); }, - entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckService.EventIds.HealthCheckBegin, DefaultHealthCheckService.EventIds.HealthCheckEnd }); }, - entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckService.EventIds.HealthCheckBegin, DefaultHealthCheckService.EventIds.HealthCheckEnd }); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckEnd, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckProcessingEnd, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherBegin, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherEnd, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingEnd, entry.EventId); }); + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherProcessingBegin, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckProcessingBegin, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckBegin, entry.EventId); }, + entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckEventIds.HealthCheckBegin, DefaultHealthCheckEventIds.HealthCheckEnd }); }, + entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckEventIds.HealthCheckBegin, DefaultHealthCheckEventIds.HealthCheckEnd }); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckEnd, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckProcessingEnd, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherBegin, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherEnd, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherProcessingEnd, entry.EventId); }); } // Not testing logs here to avoid differences in logging order @@ -319,16 +336,16 @@ public async Task RunAsync_PublishersCanTimeout() Assert.Collection( sink.Writes, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingBegin, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckProcessingBegin, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckBegin, entry.EventId); }, - entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckService.EventIds.HealthCheckBegin, DefaultHealthCheckService.EventIds.HealthCheckEnd }); }, - entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckService.EventIds.HealthCheckBegin, DefaultHealthCheckService.EventIds.HealthCheckEnd }); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckEnd, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckProcessingEnd, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherBegin, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherTimeout, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingEnd, entry.EventId); }); + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherProcessingBegin, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckProcessingBegin, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckBegin, entry.EventId); }, + entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckEventIds.HealthCheckBegin, DefaultHealthCheckEventIds.HealthCheckEnd }); }, + entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckEventIds.HealthCheckBegin, DefaultHealthCheckEventIds.HealthCheckEnd }); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckEnd, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckProcessingEnd, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherBegin, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherTimeout, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherProcessingEnd, entry.EventId); }); } [Fact] @@ -397,16 +414,16 @@ public async Task RunAsync_HandlesExceptions() Assert.Collection( sink.Writes, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingBegin, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckProcessingBegin, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckBegin, entry.EventId); }, - entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckService.EventIds.HealthCheckBegin, DefaultHealthCheckService.EventIds.HealthCheckEnd }); }, - entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckService.EventIds.HealthCheckBegin, DefaultHealthCheckService.EventIds.HealthCheckEnd }); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckEnd, entry.EventId); }, - entry => { Assert.Equal(DefaultHealthCheckService.EventIds.HealthCheckProcessingEnd, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherBegin, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherError, entry.EventId); }, - entry => { Assert.Equal(HealthCheckPublisherHostedService.EventIds.HealthCheckPublisherProcessingEnd, entry.EventId); }); + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherProcessingBegin, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckProcessingBegin, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckBegin, entry.EventId); }, + entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckEventIds.HealthCheckBegin, DefaultHealthCheckEventIds.HealthCheckEnd }); }, + entry => { Assert.Contains(entry.EventId, new[] { DefaultHealthCheckEventIds.HealthCheckBegin, DefaultHealthCheckEventIds.HealthCheckEnd }); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckEnd, entry.EventId); }, + entry => { Assert.Equal(DefaultHealthCheckEventIds.HealthCheckProcessingEnd, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherBegin, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherError, entry.EventId); }, + entry => { Assert.Equal(HealthCheckPublisherEventIds.HealthCheckPublisherProcessingEnd, entry.EventId); }); } // Not testing logging here to avoid flaky ordering issues