// Copyright Epic Games, Inc. All Rights Reserved. using System.Collections.Generic; using System.Diagnostics.Metrics; using JetBrains.Annotations; namespace Jupiter.Common { public class Gauge where T : struct { [System.Diagnostics.CodeAnalysis.SuppressMessage("CodeQuality", "IDE0052:Remove unread private members", Justification = "Needed to keep the callback alive")] [UsedImplicitly] private readonly ObservableGauge _observableGauge; private readonly List> _measurements = new List>(); private readonly object _lock = new object(); public Gauge(Meter meter, string name) { _observableGauge = meter.CreateObservableGauge(name, GetMeasurements); } private IEnumerable> GetMeasurements() { List> measurements; lock (_lock) { measurements = new List>(_measurements); _measurements.Clear(); } return measurements; } public void Record(T measurement, IEnumerable> tags) { lock (_lock) { _measurements.Add(new Measurement(measurement, tags)); } } } public static class MeterExtensions { public static Gauge CreateGauge(this Meter m, string name) where T : struct { Gauge gauge = new Gauge(m, name); return gauge; } } }