From c642e78dbde7e5f7cc7a36924ea5812b47e00c5d Mon Sep 17 00:00:00 2001 From: Angelo Breuer Date: Sun, 17 Mar 2024 13:49:15 +0100 Subject: [PATCH] feat: Add voice server allocation metric --- src/Lavalink4NET/Players/LavalinkPlayer.cs | 35 +++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Lavalink4NET/Players/LavalinkPlayer.cs b/src/Lavalink4NET/Players/LavalinkPlayer.cs index 403e78e3..1a9dd1f9 100644 --- a/src/Lavalink4NET/Players/LavalinkPlayer.cs +++ b/src/Lavalink4NET/Players/LavalinkPlayer.cs @@ -6,6 +6,7 @@ using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Metrics; using System.IO; +using System.Linq; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; @@ -39,6 +40,7 @@ public class LavalinkPlayer : ILavalinkPlayer, ILavalinkPlayerListener private volatile ITrackQueueItem? _replacedItem; private volatile ITrackQueueItem? _nextItem; private Counter? _previousStateCounter; + private string? _previousVoiceServer; public LavalinkPlayer(IPlayerProperties properties) { @@ -488,6 +490,12 @@ protected virtual async ValueTask DisposeAsyncCore() return; } + if (_previousVoiceServer is not null) + { + Diagnostics.VoiceServer.Add(-1, KeyValuePair.Create("server", _previousVoiceServer)); + _previousVoiceServer = null; + } + await UpdateStateAsync(PlayerState.Destroyed).ConfigureAwait(false); // Dispose the lifecycle to notify the player is being destroyed @@ -641,7 +649,7 @@ private ValueTask UpdateVoiceCredentialsAsync(CancellationToken cancellationToke { cancellationToken.ThrowIfCancellationRequested(); - if (_disposed is 1 || VoiceServer is null || VoiceState.SessionId is null) + if (_disposed is 1 || VoiceServer is null || VoiceServer is { Endpoint: null, } or { Token: null, } || VoiceState.SessionId is null) { return ValueTask.CompletedTask; } @@ -654,6 +662,23 @@ private ValueTask UpdateVoiceCredentialsAsync(CancellationToken cancellationToke SessionId: VoiceState.SessionId), }; + var voiceServerName = GetVoiceServerName(VoiceServer.Value); + + if (!StringComparer.Ordinal.Equals(voiceServerName, _previousVoiceServer)) + { + if (_previousVoiceServer is not null) + { + Diagnostics.VoiceServer.Add(-1, KeyValuePair.Create("server", _previousVoiceServer)); + } + + if (voiceServerName is not null) + { + Diagnostics.VoiceServer.Add(1, KeyValuePair.Create("server", voiceServerName)); + } + + _previousVoiceServer = voiceServerName; + } + return PerformUpdateAsync(properties, cancellationToken); } @@ -675,6 +700,11 @@ private ValueTask UpdateVoiceCredentialsAsync(CancellationToken cancellationToke return new TrackQueueItem(new TrackReference(track)); } + + private static string? GetVoiceServerName(VoiceServer voiceServer) + { + return voiceServer.Endpoint.Split('.', StringSplitOptions.TrimEntries).FirstOrDefault(); + } } internal static partial class Logging @@ -719,6 +749,7 @@ static Diagnostics() PausedPlayers = meter.CreateCounter("paused-players"); NotPlayingPlayers = meter.CreateCounter("not-playing-players"); PlayingPlayers = meter.CreateCounter("playing-players"); + VoiceServer = meter.CreateCounter("voice-server"); } public static Counter PausedPlayers { get; } @@ -726,4 +757,6 @@ static Diagnostics() public static Counter NotPlayingPlayers { get; } public static Counter PlayingPlayers { get; } + + public static Counter VoiceServer { get; } } \ No newline at end of file