Skip to content

Commit 1dd00f4

Browse files
authored
Convert HealthChecks logging to use new Logging Source Generator (#32414)
* Convert HealthChecks logging to use new Logging Source Generator
1 parent 1362112 commit 1dd00f4

4 files changed

+136
-156
lines changed

src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs

+44-61
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
namespace Microsoft.Extensions.Diagnostics.HealthChecks
1717
{
18-
internal class DefaultHealthCheckService : HealthCheckService
18+
internal partial class DefaultHealthCheckService : HealthCheckService
1919
{
2020
private readonly IServiceScopeFactory _scopeFactory;
2121
private readonly IOptions<HealthCheckServiceOptions> _options;
@@ -87,7 +87,7 @@ private async Task<HealthReportEntry> RunCheckAsync(HealthCheckRegistration regi
8787
var stopwatch = ValueStopwatch.StartNew();
8888
var context = new HealthCheckContext { Registration = registration };
8989

90-
Log.HealthCheckBegin(_logger, registration);
90+
Log.HealthCheckBegin(_logger, registration.Name);
9191

9292
HealthReportEntry entry;
9393
CancellationTokenSource? timeoutCancellationTokenSource = null;
@@ -182,92 +182,75 @@ private static void ValidateRegistrations(IEnumerable<HealthCheckRegistration> r
182182

183183
internal static class EventIds
184184
{
185-
public static readonly EventId HealthCheckProcessingBegin = new EventId(100, "HealthCheckProcessingBegin");
186-
public static readonly EventId HealthCheckProcessingEnd = new EventId(101, "HealthCheckProcessingEnd");
187-
188-
public static readonly EventId HealthCheckBegin = new EventId(102, "HealthCheckBegin");
189-
public static readonly EventId HealthCheckEnd = new EventId(103, "HealthCheckEnd");
190-
public static readonly EventId HealthCheckError = new EventId(104, "HealthCheckError");
191-
public static readonly EventId HealthCheckData = new EventId(105, "HealthCheckData");
185+
public const int HealthCheckProcessingBeginId = 100;
186+
public const int HealthCheckProcessingEndId = 101;
187+
public const int HealthCheckBeginId = 102;
188+
public const int HealthCheckEndId = 103;
189+
public const int HealthCheckErrorId = 104;
190+
public const int HealthCheckDataId = 105;
191+
192+
// Hard code the event names to avoid breaking changes. Even if the methods are renamed, these hard-coded names shouldn't change.
193+
public const string HealthCheckProcessingBeginName = "HealthCheckProcessingBegin";
194+
public const string HealthCheckProcessingEndName = "HealthCheckProcessingEnd";
195+
public const string HealthCheckBeginName = "HealthCheckBegin";
196+
public const string HealthCheckEndName = "HealthCheckEnd";
197+
public const string HealthCheckErrorName = "HealthCheckError";
198+
public const string HealthCheckDataName = "HealthCheckData";
199+
200+
public static readonly EventId HealthCheckData = new EventId(HealthCheckDataId, HealthCheckDataName);
192201
}
193202

194-
private static class Log
203+
private static partial class Log
195204
{
196-
private static readonly Action<ILogger, Exception?> _healthCheckProcessingBegin = LoggerMessage.Define(
197-
LogLevel.Debug,
198-
EventIds.HealthCheckProcessingBegin,
199-
"Running health checks");
205+
[LoggerMessage(EventIds.HealthCheckProcessingBeginId, LogLevel.Debug, "Running health checks", EventName = EventIds.HealthCheckProcessingBeginName)]
206+
public static partial void HealthCheckProcessingBegin(ILogger logger);
207+
208+
public static void HealthCheckProcessingEnd(ILogger logger, HealthStatus status, TimeSpan duration) =>
209+
HealthCheckProcessingEnd(logger, status, duration.TotalMilliseconds);
200210

201-
private static readonly Action<ILogger, double, HealthStatus, Exception?> _healthCheckProcessingEnd = LoggerMessage.Define<double, HealthStatus>(
202-
LogLevel.Debug,
203-
EventIds.HealthCheckProcessingEnd,
204-
"Health check processing with combined status {HealthStatus} completed after {ElapsedMilliseconds}ms");
211+
[LoggerMessage(EventIds.HealthCheckProcessingEndId, LogLevel.Debug, "Health check processing with combined status {HealthStatus} completed after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckProcessingEndName)]
212+
private static partial void HealthCheckProcessingEnd(ILogger logger, HealthStatus HealthStatus, double ElapsedMilliseconds);
205213

206-
private static readonly Action<ILogger, string, Exception?> _healthCheckBegin = LoggerMessage.Define<string>(
207-
LogLevel.Debug,
208-
EventIds.HealthCheckBegin,
209-
"Running health check {HealthCheckName}");
214+
[LoggerMessage(EventIds.HealthCheckBeginId, LogLevel.Debug, "Running health check {HealthCheckName}", EventName = EventIds.HealthCheckBeginName)]
215+
public static partial void HealthCheckBegin(ILogger logger, string HealthCheckName);
210216

211217
// These are separate so they can have different log levels
212218
private const string HealthCheckEndText = "Health check {HealthCheckName} with status {HealthStatus} completed after {ElapsedMilliseconds}ms with message '{HealthCheckDescription}'";
213219

214-
private static readonly Action<ILogger, string, double, HealthStatus, string?, Exception?> _healthCheckEndHealthy = LoggerMessage.Define<string, double, HealthStatus, string?>(
215-
LogLevel.Debug,
216-
EventIds.HealthCheckEnd,
217-
HealthCheckEndText);
218-
219-
private static readonly Action<ILogger, string, double, HealthStatus, string?, Exception?> _healthCheckEndDegraded = LoggerMessage.Define<string, double, HealthStatus, string?>(
220-
LogLevel.Warning,
221-
EventIds.HealthCheckEnd,
222-
HealthCheckEndText);
223-
224-
private static readonly Action<ILogger, string, double, HealthStatus, string?, Exception?> _healthCheckEndUnhealthy = LoggerMessage.Define<string, double, HealthStatus, string?>(
225-
LogLevel.Error,
226-
EventIds.HealthCheckEnd,
227-
HealthCheckEndText);
220+
#pragma warning disable SYSLIB1006
221+
[LoggerMessage(EventIds.HealthCheckEndId, LogLevel.Debug, HealthCheckEndText, EventName = EventIds.HealthCheckEndName)]
222+
private static partial void HealthCheckEndHealthy(ILogger logger, string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription);
228223

229-
private static readonly Action<ILogger, string, double, Exception?> _healthCheckError = LoggerMessage.Define<string, double>(
230-
LogLevel.Error,
231-
EventIds.HealthCheckError,
232-
"Health check {HealthCheckName} threw an unhandled exception after {ElapsedMilliseconds}ms");
224+
[LoggerMessage(EventIds.HealthCheckEndId, LogLevel.Warning, HealthCheckEndText, EventName = EventIds.HealthCheckEndName)]
225+
private static partial void HealthCheckEndDegraded(ILogger logger, string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription);
233226

234-
public static void HealthCheckProcessingBegin(ILogger logger)
235-
{
236-
_healthCheckProcessingBegin(logger, null);
237-
}
238-
239-
public static void HealthCheckProcessingEnd(ILogger logger, HealthStatus status, TimeSpan duration)
240-
{
241-
_healthCheckProcessingEnd(logger, duration.TotalMilliseconds, status, null);
242-
}
243-
244-
public static void HealthCheckBegin(ILogger logger, HealthCheckRegistration registration)
245-
{
246-
_healthCheckBegin(logger, registration.Name, null);
247-
}
227+
[LoggerMessage(EventIds.HealthCheckEndId, LogLevel.Error, HealthCheckEndText, EventName = EventIds.HealthCheckEndName)]
228+
private static partial void HealthCheckEndUnhealthy(ILogger logger, string HealthCheckName, HealthStatus HealthStatus, double ElapsedMilliseconds, string? HealthCheckDescription, Exception? exception);
229+
#pragma warning restore SYSLIB1006
248230

249231
public static void HealthCheckEnd(ILogger logger, HealthCheckRegistration registration, HealthReportEntry entry, TimeSpan duration)
250232
{
251233
switch (entry.Status)
252234
{
253235
case HealthStatus.Healthy:
254-
_healthCheckEndHealthy(logger, registration.Name, duration.TotalMilliseconds, entry.Status, entry.Description, null);
236+
HealthCheckEndHealthy(logger, registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description);
255237
break;
256238

257239
case HealthStatus.Degraded:
258-
_healthCheckEndDegraded(logger, registration.Name, duration.TotalMilliseconds, entry.Status, entry.Description, null);
240+
HealthCheckEndDegraded(logger, registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description);
259241
break;
260242

261243
case HealthStatus.Unhealthy:
262-
_healthCheckEndUnhealthy(logger, registration.Name, duration.TotalMilliseconds, entry.Status, entry.Description, entry.Exception);
244+
HealthCheckEndUnhealthy(logger, registration.Name, entry.Status, duration.TotalMilliseconds, entry.Description, entry.Exception);
263245
break;
264246
}
265247
}
266248

267-
public static void HealthCheckError(ILogger logger, HealthCheckRegistration registration, Exception exception, TimeSpan duration)
268-
{
269-
_healthCheckError(logger, registration.Name, duration.TotalMilliseconds, exception);
270-
}
249+
[LoggerMessage(EventIds.HealthCheckErrorId, LogLevel.Error, "Health check {HealthCheckName} threw an unhandled exception after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckErrorName)]
250+
private static partial void HealthCheckError(ILogger logger, string HealthCheckName, double ElapsedMilliseconds, Exception exception);
251+
252+
public static void HealthCheckError(ILogger logger, HealthCheckRegistration registration, Exception exception, TimeSpan duration) =>
253+
HealthCheckError(logger, registration.Name, duration.TotalMilliseconds, exception);
271254

272255
public static void HealthCheckData(ILogger logger, HealthCheckRegistration registration, HealthReportEntry entry)
273256
{

src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs

+43-65
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313

1414
namespace Microsoft.Extensions.Diagnostics.HealthChecks
1515
{
16-
internal sealed class HealthCheckPublisherHostedService : IHostedService
16+
internal sealed partial class HealthCheckPublisherHostedService : IHostedService
1717
{
1818
private readonly HealthCheckService _healthCheckService;
1919
private readonly IOptions<HealthCheckPublisherOptions> _options;
2020
private readonly ILogger _logger;
2121
private readonly IHealthCheckPublisher[] _publishers;
2222

23-
private CancellationTokenSource _stopping;
23+
private readonly CancellationTokenSource _stopping;
2424
private Timer? _timer;
2525
private CancellationTokenSource? _runTokenSource;
2626

@@ -194,77 +194,55 @@ private async Task RunPublisherAsync(IHealthCheckPublisher publisher, HealthRepo
194194

195195
internal static class EventIds
196196
{
197-
public static readonly EventId HealthCheckPublisherProcessingBegin = new EventId(100, "HealthCheckPublisherProcessingBegin");
198-
public static readonly EventId HealthCheckPublisherProcessingEnd = new EventId(101, "HealthCheckPublisherProcessingEnd");
199-
public static readonly EventId HealthCheckPublisherProcessingError = new EventId(101, "HealthCheckPublisherProcessingError");
200-
201-
public static readonly EventId HealthCheckPublisherBegin = new EventId(102, "HealthCheckPublisherBegin");
202-
public static readonly EventId HealthCheckPublisherEnd = new EventId(103, "HealthCheckPublisherEnd");
203-
public static readonly EventId HealthCheckPublisherError = new EventId(104, "HealthCheckPublisherError");
204-
public static readonly EventId HealthCheckPublisherTimeout = new EventId(104, "HealthCheckPublisherTimeout");
197+
public const int HealthCheckPublisherProcessingBeginId = 100;
198+
public const int HealthCheckPublisherProcessingEndId = 101;
199+
public const int HealthCheckPublisherBeginId = 102;
200+
public const int HealthCheckPublisherEndId = 103;
201+
public const int HealthCheckPublisherErrorId = 104;
202+
public const int HealthCheckPublisherTimeoutId = 104;
203+
204+
// Hard code the event names to avoid breaking changes. Even if the methods are renamed, these hard-coded names shouldn't change.
205+
public const string HealthCheckPublisherProcessingBeginName = "HealthCheckPublisherProcessingBegin";
206+
public const string HealthCheckPublisherProcessingEndName = "HealthCheckPublisherProcessingEnd";
207+
public const string HealthCheckPublisherBeginName = "HealthCheckPublisherBegin";
208+
public const string HealthCheckPublisherEndName = "HealthCheckPublisherEnd";
209+
public const string HealthCheckPublisherErrorName = "HealthCheckPublisherError";
210+
public const string HealthCheckPublisherTimeoutName = "HealthCheckPublisherTimeout";
205211
}
206212

207-
private static class Logger
213+
private static partial class Logger
208214
{
209-
private static readonly Action<ILogger, Exception?> _healthCheckPublisherProcessingBegin = LoggerMessage.Define(
210-
LogLevel.Debug,
211-
EventIds.HealthCheckPublisherProcessingBegin,
212-
"Running health check publishers");
213-
214-
private static readonly Action<ILogger, double, Exception?> _healthCheckPublisherProcessingEnd = LoggerMessage.Define<double>(
215-
LogLevel.Debug,
216-
EventIds.HealthCheckPublisherProcessingEnd,
217-
"Health check publisher processing completed after {ElapsedMilliseconds}ms");
218-
219-
private static readonly Action<ILogger, IHealthCheckPublisher, Exception?> _healthCheckPublisherBegin = LoggerMessage.Define<IHealthCheckPublisher>(
220-
LogLevel.Debug,
221-
EventIds.HealthCheckPublisherBegin,
222-
"Running health check publisher '{HealthCheckPublisher}'");
223-
224-
private static readonly Action<ILogger, IHealthCheckPublisher, double, Exception?> _healthCheckPublisherEnd = LoggerMessage.Define<IHealthCheckPublisher, double>(
225-
LogLevel.Debug,
226-
EventIds.HealthCheckPublisherEnd,
227-
"Health check '{HealthCheckPublisher}' completed after {ElapsedMilliseconds}ms");
228-
229-
private static readonly Action<ILogger, IHealthCheckPublisher, double, Exception?> _healthCheckPublisherError = LoggerMessage.Define<IHealthCheckPublisher, double>(
230-
LogLevel.Error,
231-
EventIds.HealthCheckPublisherError,
232-
"Health check {HealthCheckPublisher} threw an unhandled exception after {ElapsedMilliseconds}ms");
233-
234-
private static readonly Action<ILogger, IHealthCheckPublisher, double, Exception?> _healthCheckPublisherTimeout = LoggerMessage.Define<IHealthCheckPublisher, double>(
235-
LogLevel.Error,
236-
EventIds.HealthCheckPublisherTimeout,
237-
"Health check {HealthCheckPublisher} was canceled after {ElapsedMilliseconds}ms");
238-
239-
public static void HealthCheckPublisherProcessingBegin(ILogger logger)
240-
{
241-
_healthCheckPublisherProcessingBegin(logger, null);
242-
}
215+
[LoggerMessage(EventIds.HealthCheckPublisherProcessingBeginId, LogLevel.Debug, "Running health check publishers", EventName = EventIds.HealthCheckPublisherProcessingBeginName)]
216+
public static partial void HealthCheckPublisherProcessingBegin(ILogger logger);
243217

244-
public static void HealthCheckPublisherProcessingEnd(ILogger logger, TimeSpan duration, Exception? exception = null)
245-
{
246-
_healthCheckPublisherProcessingEnd(logger, duration.TotalMilliseconds, exception);
247-
}
218+
public static void HealthCheckPublisherProcessingEnd(ILogger logger, TimeSpan duration, Exception? exception = null) =>
219+
HealthCheckPublisherProcessingEnd(logger, duration.TotalMilliseconds, exception);
248220

249-
public static void HealthCheckPublisherBegin(ILogger logger, IHealthCheckPublisher publisher)
250-
{
251-
_healthCheckPublisherBegin(logger, publisher, null);
252-
}
221+
[LoggerMessage(EventIds.HealthCheckPublisherProcessingEndId, LogLevel.Debug, "Health check publisher processing completed after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherProcessingEndName)]
222+
private static partial void HealthCheckPublisherProcessingEnd(ILogger logger, double ElapsedMilliseconds, Exception? exception = null);
253223

254-
public static void HealthCheckPublisherEnd(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration)
255-
{
256-
_healthCheckPublisherEnd(logger, publisher, duration.TotalMilliseconds, null);
257-
}
224+
[LoggerMessage(EventIds.HealthCheckPublisherBeginId, LogLevel.Debug, "Running health check publisher '{HealthCheckPublisher}'", EventName = EventIds.HealthCheckPublisherBeginName)]
225+
public static partial void HealthCheckPublisherBegin(ILogger logger, IHealthCheckPublisher HealthCheckPublisher);
258226

259-
public static void HealthCheckPublisherError(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration, Exception exception)
260-
{
261-
_healthCheckPublisherError(logger, publisher, duration.TotalMilliseconds, exception);
262-
}
227+
public static void HealthCheckPublisherEnd(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, TimeSpan duration) =>
228+
HealthCheckPublisherEnd(logger, HealthCheckPublisher, duration.TotalMilliseconds);
263229

264-
public static void HealthCheckPublisherTimeout(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration)
265-
{
266-
_healthCheckPublisherTimeout(logger, publisher, duration.TotalMilliseconds, null);
267-
}
230+
[LoggerMessage(EventIds.HealthCheckPublisherEndId, LogLevel.Debug, "Health check '{HealthCheckPublisher}' completed after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherEndName)]
231+
private static partial void HealthCheckPublisherEnd(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds);
232+
233+
public static void HealthCheckPublisherError(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration, Exception exception) =>
234+
HealthCheckPublisherError(logger, publisher, duration.TotalMilliseconds, exception);
235+
236+
#pragma warning disable SYSLIB1006
237+
[LoggerMessage(EventIds.HealthCheckPublisherErrorId, LogLevel.Error, "Health check {HealthCheckPublisher} threw an unhandled exception after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherErrorName)]
238+
private static partial void HealthCheckPublisherError(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds, Exception exception);
239+
240+
public static void HealthCheckPublisherTimeout(ILogger logger, IHealthCheckPublisher publisher, TimeSpan duration) =>
241+
HealthCheckPublisherTimeout(logger, publisher, duration.TotalMilliseconds);
242+
243+
[LoggerMessage(EventIds.HealthCheckPublisherTimeoutId, LogLevel.Error, "Health check {HealthCheckPublisher} was canceled after {ElapsedMilliseconds}ms", EventName = EventIds.HealthCheckPublisherTimeoutName)]
244+
private static partial void HealthCheckPublisherTimeout(ILogger logger, IHealthCheckPublisher HealthCheckPublisher, double ElapsedMilliseconds);
245+
#pragma warning restore SYSLIB1006
268246
}
269247
}
270248
}

0 commit comments

Comments
 (0)