< Summary

Information
Class: ProjectTemplate.Infrastructure.Data.Auditing.ApplicationAuditReconciliationMetrics
Assembly: ProjectTemplate.Infrastructure
File(s): /home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Infrastructure/Data/Auditing/ApplicationAuditReconciliationMetrics.cs
Line coverage
100%
Covered lines: 37
Uncovered lines: 0
Coverable lines: 37
Total lines: 60
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor()100%11100%
get_LastRunUtc()100%11100%
Update(...)100%11100%
UpdateDelivery(...)100%22100%
Dispose()100%11100%

File(s)

/home/runner/work/NetCoreApplicationTemplate/NetCoreApplicationTemplate/src/ProjectTemplate.Infrastructure/Data/Auditing/ApplicationAuditReconciliationMetrics.cs

#LineLine coverage
 1using System.Diagnostics.Metrics;
 2
 3namespace ProjectTemplate.Infrastructure.Data.Auditing;
 4
 5public sealed class ApplicationAuditReconciliationMetrics : IDisposable
 6{
 17    public static readonly ApplicationAuditReconciliationSummary DisabledSummary =
 18        new(false, null, 0, 0, 0, 0, 0, 0, 0);
 9
 2210    private readonly Meter _meter = new("ProjectTemplate.AuditReconciliation", "1.0.0");
 2211    private ApplicationAuditReconciliationSummary _summary = DisabledSummary;
 12    private long _pendingDeliveryCount;
 13    private double _oldestPendingAgeSeconds;
 14    private long _totalRetryCount;
 15
 2216    public ApplicationAuditReconciliationMetrics()
 17    {
 2218        _meter.CreateObservableGauge("ncat.audit.reconciliation.findings.open",
 2219            () => _summary.OpenFindingCount);
 2220        _meter.CreateObservableGauge("ncat.audit.reconciliation.findings.error",
 2221            () => _summary.ErrorFindingCount);
 2222        _meter.CreateObservableGauge("ncat.audit.reconciliation.findings.critical",
 2223            () => _summary.CriticalFindingCount);
 2224        _meter.CreateObservableGauge("ncat.audit.reconciliation.manifest_failures",
 2225            () => _summary.ManifestVerificationFailureCount);
 2226        _meter.CreateObservableGauge("ncat.audit.reconciliation.missing_completions",
 2227            () => _summary.MissingCompletionCount);
 2228        _meter.CreateObservableGauge("ncat.audit.reconciliation.stale_delivery",
 2229            () => _summary.StaleDeliveryCount);
 2230        _meter.CreateObservableGauge("ncat.audit.reconciliation.dead_letters",
 2231            () => _summary.DeadLetterCount);
 2232        _meter.CreateObservableGauge("ncat.audit.outbox.pending",
 2233            () => Interlocked.Read(ref _pendingDeliveryCount));
 2234        _meter.CreateObservableGauge("ncat.audit.outbox.oldest_pending_age_seconds",
 2235            () => Volatile.Read(ref _oldestPendingAgeSeconds));
 2236        _meter.CreateObservableGauge("ncat.audit.outbox.retry_count",
 2237            () => Interlocked.Read(ref _totalRetryCount));
 2238    }
 39
 140    public DateTime? LastRunUtc => _summary.LastRunUtc;
 41
 42    public void Update(ApplicationAuditReconciliationSummary summary)
 43    {
 1844        ArgumentNullException.ThrowIfNull(summary);
 1845        _summary = summary;
 1846    }
 47
 48    public void UpdateDelivery(ApplicationAuditCompletionOutboxHealth health)
 49    {
 350        ArgumentNullException.ThrowIfNull(health);
 351        Interlocked.Exchange(ref _pendingDeliveryCount, health.BacklogCount);
 352        Volatile.Write(ref _oldestPendingAgeSeconds, health.OldestPendingAge?.TotalSeconds ?? 0);
 353        Interlocked.Exchange(ref _totalRetryCount, health.TotalRetryCount);
 354    }
 55
 56    public void Dispose()
 57    {
 2258        _meter.Dispose();
 2259    }
 60}