From d268fff7b40b9c30d393b569782d46b5b683c036 Mon Sep 17 00:00:00 2001 From: redglow Date: Wed, 29 Jul 2026 11:40:39 +0200 Subject: [PATCH] feat: metrics test. --- Game/Game/GameServiceSource.cs | 8 ++++- Game/Metrics/MetricsHandler.cs | 50 ++++++++++++++++++++++++++++ Game/Metrics/MetricsHandler.cs.uid | 1 + godot-host-test.csproj | 3 ++ godot-host-test.sln.DotSettings.user | 4 ++- 5 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 Game/Metrics/MetricsHandler.cs create mode 100644 Game/Metrics/MetricsHandler.cs.uid diff --git a/Game/Game/GameServiceSource.cs b/Game/Game/GameServiceSource.cs index f81b614..8f8ead2 100644 --- a/Game/Game/GameServiceSource.cs +++ b/Game/Game/GameServiceSource.cs @@ -1,10 +1,12 @@ using Godot; using GodotHostTest.AetherBind; using GodotHostTest.Game.Level; +using GodotHostTest.Game.Metrics; using GodotHostTest.Game.Score; using GodotHostTest.Game.Target; using GodotHostTest.Interfaces; using Microsoft.Extensions.DependencyInjection; +using OwofGames.GodotHost; using OwofGames.GodotHost.Observability; using OwofGames.GodotLume; @@ -23,12 +25,16 @@ public partial class GameServiceSource : RootServiceSource // current level / level data management .AddInstance(_levelsData) .AddSingleton() + // metrics + .AddSingleton() // level scope services .AddLevelServices(); } protected override void ConfigureServices(IServiceCollection serviceCollection) { - serviceCollection.AddObservability(builder => builder.AddGrpcExporter("http://localhost:4317")); + serviceCollection.AddObservability(builder => builder + .AddGrpcExporter("http://localhost:4317") + .AddMeterName(MetricsHandler.MeterName)); } } \ No newline at end of file diff --git a/Game/Metrics/MetricsHandler.cs b/Game/Metrics/MetricsHandler.cs new file mode 100644 index 0000000..29dcc5c --- /dev/null +++ b/Game/Metrics/MetricsHandler.cs @@ -0,0 +1,50 @@ +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(); + } +} \ No newline at end of file diff --git a/Game/Metrics/MetricsHandler.cs.uid b/Game/Metrics/MetricsHandler.cs.uid new file mode 100644 index 0000000..22f9662 --- /dev/null +++ b/Game/Metrics/MetricsHandler.cs.uid @@ -0,0 +1 @@ +uid://5ramu7es1104 diff --git a/godot-host-test.csproj b/godot-host-test.csproj index a11ccfa..87fa1e4 100644 --- a/godot-host-test.csproj +++ b/godot-host-test.csproj @@ -17,6 +17,9 @@ ..\OwofGames.Godot\OwofGames.GodotHost\bin\Debug\net8.0\OwofGames.GodotHost.dll + + ..\OwofGames.Godot\OwofGames.GodotHost.Abstractions\bin\Debug\net8.0\OwofGames.GodotHost.Abstractions.dll + ..\OwofGames.Godot\OwofGames.GodotHost.Observability\bin\Debug\net8.0\OwofGames.GodotHost.Observability.dll diff --git a/godot-host-test.sln.DotSettings.user b/godot-host-test.sln.DotSettings.user index c66414f..4350b22 100644 --- a/godot-host-test.sln.DotSettings.user +++ b/godot-host-test.sln.DotSettings.user @@ -2,6 +2,7 @@ True True True + True True True True @@ -20,6 +21,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -32,7 +34,7 @@ ForceIncluded ForceIncluded <AssemblyExplorer> - <Assembly Path="/home/redglow/sources/OwofGames.Godot/OwofGames.AetherBind.Observability/bin/Debug/net8.0/OwofGames.AetherBind.Observability.dll" /> + <Assembly Path="/home/redglow/sources/OwofGames.Godot/OwofGames.GodotHost/bin/Debug/net8.0/OwofGames.GodotHost.dll" /> </AssemblyExplorer> /usr/lib/dotnet/dotnet /usr/lib/dotnet/sdk/10.0.109/MSBuild.dll