< 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
83%
Covered lines: 31
Uncovered lines: 6
Coverable lines: 37
Total lines: 60
Line coverage: 83.7%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
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%210%
Update(...)100%11100%
UpdateDelivery(...)0%620%
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{
 27    public static readonly ApplicationAuditReconciliationSummary DisabledSummary =
 28        new(false, null, 0, 0, 0, 0, 0, 0, 0);
 9
 1610    private readonly Meter _meter = new("ProjectTemplate.AuditReconciliation", "1.0.0");
 1611    private ApplicationAuditReconciliationSummary _summary = DisabledSummary;
 12    private long _pendingDeliveryCount;
 13    private double _oldestPendingAgeSeconds;
 14    private long _totalRetryCount;
 15
 1616    public ApplicationAuditReconciliationMetrics()
 17    {
 1618        _meter.CreateObservableGauge("ncat.audit.reconciliation.findings.open",
 1619            () => _summary.OpenFindingCount);
 1620        _meter.CreateObservableGauge("ncat.audit.reconciliation.findings.error",
 1621            () => _summary.ErrorFindingCount);
 1622        _meter.CreateObservableGauge("ncat.audit.reconciliation.findings.critical",
 1623            () => _summary.CriticalFindingCount);
 1624        _meter.CreateObservableGauge("ncat.audit.reconciliation.manifest_failures",
 1625            () => _summary.ManifestVerificationFailureCount);
 1626        _meter.CreateObservableGauge("ncat.audit.reconciliation.missing_completions",
 1627            () => _summary.MissingCompletionCount);
 1628        _meter.CreateObservableGauge("ncat.audit.reconciliation.stale_delivery",
 1629            () => _summary.StaleDeliveryCount);
 1630        _meter.CreateObservableGauge("ncat.audit.reconciliation.dead_letters",
 1631            () => _summary.DeadLetterCount);
 1632        _meter.CreateObservableGauge("ncat.audit.outbox.pending",
 1633            () => Interlocked.Read(ref _pendingDeliveryCount));
 1634        _meter.CreateObservableGauge("ncat.audit.outbox.oldest_pending_age_seconds",
 1635            () => Volatile.Read(ref _oldestPendingAgeSeconds));
 1636        _meter.CreateObservableGauge("ncat.audit.outbox.retry_count",
 1637            () => Interlocked.Read(ref _totalRetryCount));
 1638    }
 39
 040    public DateTime? LastRunUtc => _summary.LastRunUtc;
 41
 42    public void Update(ApplicationAuditReconciliationSummary summary)
 43    {
 1644        ArgumentNullException.ThrowIfNull(summary);
 1645        _summary = summary;
 1646    }
 47
 48    public void UpdateDelivery(ApplicationAuditCompletionOutboxHealth health)
 49    {
 050        ArgumentNullException.ThrowIfNull(health);
 051        Interlocked.Exchange(ref _pendingDeliveryCount, health.BacklogCount);
 052        Volatile.Write(ref _oldestPendingAgeSeconds, health.OldestPendingAge?.TotalSeconds ?? 0);
 053        Interlocked.Exchange(ref _totalRetryCount, health.TotalRetryCount);
 054    }
 55
 56    public void Dispose()
 57    {
 1658        _meter.Dispose();
 1659    }
 60}