using System; using System.Diagnostics.Metrics; using System.Reflection; using GodotHostTest.Interfaces; using OwofGames.GodotHost; using R3; namespace GodotHostTest.Game.Metrics; public class MetricsHandler(IMeterFactory meterFactory, ITargetEventBus targetEventBus) : IHostLifetime { public static readonly string MeterName; private static readonly string? MeterVersion; private IDisposable? _disposables; static MetricsHandler() { var assemblyName = Assembly.GetExecutingAssembly().GetName(); MeterName = assemblyName.Name!; MeterVersion = assemblyName.Version?.ToString(); } public void Startup() { // create meter var assemblyName = Assembly.GetExecutingAssembly().GetName(); var meterName = assemblyName.Name!; var meterVersion = assemblyName.Version?.ToString(); var meter = meterFactory.Create(meterName, meterVersion); // create instruments var hitTargetsCounter = meter.CreateCounter("targets.hit", description: "number of targets hit"); var missedTargetsCounter = meter.CreateCounter("targets.missed", description: "number of targets missed"); // feed instruments data, and contextually create the disposable to clean up at shutdown time _disposables = Disposable.Combine( targetEventBus.Hit.Subscribe(_ => hitTargetsCounter.Add(1)), targetEventBus.TimedOut.Subscribe(_ => missedTargetsCounter.Add(1)), meter ); } public void Shutdown() { _disposables?.Dispose(); meterFactory.Create("godot-host-test")?.Dispose(); } }