ResilienceStrategyTelemetry
Resilience telemetry is used by individual resilience strategies to report some important events.
using Polly.Utils;
using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace Polly.Telemetry
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public sealed class ResilienceStrategyTelemetry
{
[System.Runtime.CompilerServices.Nullable(2)]
[field: System.Runtime.CompilerServices.Nullable(2)]
internal DiagnosticSource DiagnosticSource {
[System.Runtime.CompilerServices.NullableContext(2)]
get;
}
internal ResilienceTelemetrySource TelemetrySource { get; }
public bool IsEnabled => DiagnosticSource != null;
internal ResilienceStrategyTelemetry(ResilienceTelemetrySource source, [System.Runtime.CompilerServices.Nullable(2)] DiagnosticSource diagnosticSource)
{
TelemetrySource = source;
DiagnosticSource = diagnosticSource;
}
public void Report<[System.Runtime.CompilerServices.Nullable(2)] TArgs>(ResilienceEvent resilienceEvent, ResilienceContext context, TArgs args)
{
Guard.NotNull(context, "context");
context.AddResilienceEvent(resilienceEvent);
if (DiagnosticSource != null && DiagnosticSource.IsEnabled(resilienceEvent.EventName) && resilienceEvent.Severity != 0) {
TelemetryEventArguments telemetryEventArguments = TelemetryEventArguments.Get(TelemetrySource, resilienceEvent, context, null, args);
DiagnosticSource.Write(resilienceEvent.EventName, telemetryEventArguments);
TelemetryEventArguments.Return(telemetryEventArguments);
}
}
[System.Runtime.CompilerServices.NullableContext(2)]
public void Report<TArgs, TResult>(ResilienceEvent resilienceEvent, [System.Runtime.CompilerServices.Nullable(new byte[] {
0,
1,
1
})] OutcomeArguments<TResult, TArgs> args)
{
args.Context.AddResilienceEvent(resilienceEvent);
if (DiagnosticSource != null && DiagnosticSource.IsEnabled(resilienceEvent.EventName) && resilienceEvent.Severity != 0) {
TelemetryEventArguments telemetryEventArguments = TelemetryEventArguments.Get(TelemetrySource, resilienceEvent, args.Context, args.Outcome.AsOutcome(), args.Arguments);
DiagnosticSource.Write(resilienceEvent.EventName, telemetryEventArguments);
TelemetryEventArguments.Return(telemetryEventArguments);
}
}
}
}