using System.Diagnostics.Metrics; using System.Reflection; namespace Speckle.Connectors.Logging; public sealed class LoggingMetricsFactory : IDisposable { private readonly Meter _meterSource = new(Consts.TRACING_SOURCE, Consts.GetPackageVersion(Assembly.GetExecutingAssembly())); public LoggingCounter CreateCounter(string name, string? unit = null, string? description = null) where T : struct => new(_meterSource.CreateCounter(name, unit, description)); public void Dispose() => _meterSource.Dispose(); } public readonly struct LoggingCounter where T : struct { private readonly Counter _counter; internal LoggingCounter(Counter counter) { _counter = counter; } public void Add(T value) => _counter.Add(value); public void Add(T value, KeyValuePair tag) => _counter.Add(value, tag); public void Add(T value, KeyValuePair tag1, KeyValuePair tag2) => _counter.Add(value, tag1, tag2); public void Add( T value, KeyValuePair tag1, KeyValuePair tag2, KeyValuePair tag3 ) => _counter.Add(value, tag1, tag2, tag3); public void Add(T value, params KeyValuePair[] tags) => _counter.Add(value, tags); }