namidaka / crpg

Multiplayer mod for Mount & Blade II: Bannerlord
https://c-rpg.eu
GNU General Public License v3.0
14 stars 14 forks source link

Use OpenTelemetry for metrics in the game server #43

Open namidaka opened 1 year ago

namidaka commented 1 year ago

From crpg created by verdie-g: verdie-g/crpg#708

null

namidaka commented 1 year ago
using System.Diagnostics.Metrics;
using System.Reflection;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;

namespace Crpg.Module.Telemetry;

internal static class CrpgMetrics
{
    private static readonly AssemblyName AssemblyName = typeof(CrpgMetrics).Assembly.GetName();
    private static readonly string InstrumentationName = AssemblyName.Name!;
    private static readonly string InstrumentationVersion = AssemblyName.Version!.ToString();
    private static readonly Meter Meter = new(InstrumentationName, InstrumentationVersion);

    // ReSharper disable NotAccessedField.Local
    private static readonly ObservableGauge<long> UsersPlayingGauge;
    // ReSharper restore NotAccessedField.Local

    private static long _usersPlaying;

    static CrpgMetrics()
    {
        UsersPlayingGauge = Meter.CreateObservableGauge("crpg.users.playing.count", () => _usersPlaying);
    }

    public static void Init()
    {
        string? region = Environment.GetEnvironmentVariable("CRPG_REGION");
        string? service = Environment.GetEnvironmentVariable("CRPG_SERVICE");
        string? instance = Environment.GetEnvironmentVariable("CRPG_INSTANCE");
        if (region == null || service == null || instance == null)
        {
            return;
        }

        var resourceBuilder = ResourceBuilder.CreateEmpty()
            .AddService(serviceName: service, serviceInstanceId: instance)
            .AddAttributes(new[] { new KeyValuePair<string, object>("region", region) });
        Sdk.CreateMeterProviderBuilder()
            .SetResourceBuilder(resourceBuilder)
            .AddConsoleExporter()
            .Build();
    }

    public static void SetUserPlaying(long userPlaying) => _usersPlaying = userPlaying;
}
namidaka commented 1 year ago

I got some dependency issues. I'll wait for the game to be migrated to .NET 6.