using System.Diagnostics.Metrics; namespace StellaOps.Concelier.Connector.Vndr.Cisco.Internal; public sealed class CiscoDiagnostics : IDisposable { public const string MeterName = "StellaOps.Concelier.Connector.Vndr.Cisco"; private const string MeterVersion = "1.0.0"; private readonly Meter _meter; private readonly Counter _fetchDocuments; private readonly Counter _fetchFailures; private readonly Counter _fetchUnchanged; private readonly Counter _parseSuccess; private readonly Counter _parseFailures; private readonly Counter _mapSuccess; private readonly Counter _mapFailures; private readonly Histogram _mapAffected; public CiscoDiagnostics() { _meter = new Meter(MeterName, MeterVersion); _fetchDocuments = _meter.CreateCounter( name: "cisco.fetch.documents", unit: "documents", description: "Number of Cisco advisories fetched."); _fetchFailures = _meter.CreateCounter( name: "cisco.fetch.failures", unit: "operations", description: "Number of Cisco fetch failures."); _fetchUnchanged = _meter.CreateCounter( name: "cisco.fetch.unchanged", unit: "documents", description: "Number of Cisco advisories skipped because they were unchanged."); _parseSuccess = _meter.CreateCounter( name: "cisco.parse.success", unit: "documents", description: "Number of Cisco documents parsed successfully."); _parseFailures = _meter.CreateCounter( name: "cisco.parse.failures", unit: "documents", description: "Number of Cisco documents that failed to parse."); _mapSuccess = _meter.CreateCounter( name: "cisco.map.success", unit: "documents", description: "Number of Cisco advisories mapped successfully."); _mapFailures = _meter.CreateCounter( name: "cisco.map.failures", unit: "documents", description: "Number of Cisco advisories that failed to map to canonical form."); _mapAffected = _meter.CreateHistogram( name: "cisco.map.affected.packages", unit: "packages", description: "Distribution of affected package counts emitted per Cisco advisory."); } public Meter Meter => _meter; public void FetchDocument() => _fetchDocuments.Add(1); public void FetchFailure() => _fetchFailures.Add(1); public void FetchUnchanged() => _fetchUnchanged.Add(1); public void ParseSuccess() => _parseSuccess.Add(1); public void ParseFailure() => _parseFailures.Add(1); public void MapSuccess() => _mapSuccess.Add(1); public void MapFailure() => _mapFailures.Add(1); public void MapAffected(int count) { if (count >= 0) { _mapAffected.Record(count); } } public void Dispose() => _meter.Dispose(); }