From 130350b71b0afd648b248c0f23bf7bf7e424f9e5 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Sun, 17 Jul 2022 01:13:29 +0200 Subject: [PATCH] lock metrics calls --- .../FileCleanupService.cs | 1 + .../Hubs/MareHub.Files.cs | 1 + .../MareSynchronosServer/Hubs/MareHub.User.cs | 1 + .../MareSynchronosServer/Hubs/MareHub.cs | 17 +++--- .../MareSynchronosServer/MareMetrics.cs | 50 ------------------ .../Metrics/LockedProxyCounter.cs | 22 ++++++++ .../Metrics/LockedProxyGauge.cs | 47 +++++++++++++++++ .../Metrics/MareMetrics.cs | 52 +++++++++++++++++++ .../MareSynchronosServer/Program.cs | 1 + .../MareSynchronosServer/SystemInfoService.cs | 1 + 10 files changed, 135 insertions(+), 58 deletions(-) delete mode 100644 MareSynchronosServer/MareSynchronosServer/MareMetrics.cs create mode 100644 MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyCounter.cs create mode 100644 MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyGauge.cs create mode 100644 MareSynchronosServer/MareSynchronosServer/Metrics/MareMetrics.cs diff --git a/MareSynchronosServer/MareSynchronosServer/FileCleanupService.cs b/MareSynchronosServer/MareSynchronosServer/FileCleanupService.cs index d096db0..282b9c7 100644 --- a/MareSynchronosServer/MareSynchronosServer/FileCleanupService.cs +++ b/MareSynchronosServer/MareSynchronosServer/FileCleanupService.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MareSynchronosServer.Data; +using MareSynchronosServer.Metrics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs index ef7e91a..fdd1199 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.Files.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using MareSynchronos.API; using MareSynchronosServer.Authentication; +using MareSynchronosServer.Metrics; using MareSynchronosServer.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs index 98f9102..a8d862f 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.User.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; using MareSynchronos.API; using MareSynchronosServer.Authentication; +using MareSynchronosServer.Metrics; using MareSynchronosServer.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs index a29d729..3f241e8 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs @@ -5,6 +5,7 @@ using System.Security.Cryptography; using System.Threading.Tasks; using MareSynchronos.API; using MareSynchronosServer.Data; +using MareSynchronosServer.Metrics; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; @@ -55,10 +56,6 @@ namespace MareSynchronosServer.Hubs IsAdmin = user.IsAdmin }; } - else - { - MareMetrics.UnauthorizedConnections.Inc(); - } return new ConnectionDto() { @@ -72,6 +69,12 @@ namespace MareSynchronosServer.Hubs return _systemInfoService.SystemInfoDto; } + public override Task OnConnectedAsync() + { + MareMetrics.Connections.Inc(); + return base.OnConnectedAsync(); + } + public override async Task OnDisconnectedAsync(Exception exception) { var user = await _dbContext.Users.AsNoTracking().SingleOrDefaultAsync(u => u.UID == AuthenticatedUserId); @@ -99,10 +102,8 @@ namespace MareSynchronosServer.Hubs await Clients.All.SendAsync("UsersOnline", await _dbContext.Users.CountAsync(u => !string.IsNullOrEmpty(u.CharacterIdentification))); } - else - { - MareMetrics.UnauthorizedConnections.Dec(); - } + + MareMetrics.Connections.Dec(); await base.OnDisconnectedAsync(exception); } diff --git a/MareSynchronosServer/MareSynchronosServer/MareMetrics.cs b/MareSynchronosServer/MareSynchronosServer/MareMetrics.cs deleted file mode 100644 index f61ad71..0000000 --- a/MareSynchronosServer/MareSynchronosServer/MareMetrics.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.IO; -using System.Linq; -using MareSynchronosServer.Data; -using Microsoft.Extensions.Configuration; -using Prometheus; - -namespace MareSynchronosServer -{ - public class MareMetrics - { - public static readonly Counter InitializedConnections = - Metrics.CreateCounter("mare_initialized_connections", "Initialized Connections"); - public static readonly Gauge UnauthorizedConnections = - Metrics.CreateGauge("mare_unauthorized_connections", "Unauthorized Connections"); - public static readonly Gauge AuthorizedConnections = - Metrics.CreateGauge("mare_authorized_connections", "Authorized Connections"); - - public static readonly Gauge UsersRegistered = Metrics.CreateGauge("mare_users_registered", "Total Registrations"); - - public static readonly Gauge Pairs = Metrics.CreateGauge("mare_pairs", "Total Pairs"); - public static readonly Gauge PairsPaused = Metrics.CreateGauge("mare_pairs_paused", "Total Paused Pairs"); - - public static readonly Gauge FilesTotal = Metrics.CreateGauge("mare_files", "Total uploaded files"); - public static readonly Gauge FilesTotalSize = - Metrics.CreateGauge("mare_files_size", "Total uploaded files (bytes)"); - - public static readonly Counter UserPushData = Metrics.CreateCounter("mare_user_push", "Users pushing data"); - public static readonly Counter UserPushDataTo = - Metrics.CreateCounter("mare_user_push_to", "Users Receiving Data"); - - public static readonly Counter UserDownloadedFiles = Metrics.CreateCounter("mare_user_downloaded_files", "Total Downloaded Files by Users"); - public static readonly Counter UserDownloadedFilesSize = Metrics.CreateCounter("mare_user_downloaded_files_size", "Total Downloaded Files Size by Users"); - - public static readonly Gauge - CPUUsage = Metrics.CreateGauge("mare_cpu_usage", "Total calculated CPU usage in %"); - public static readonly Gauge RAMUsage = - Metrics.CreateGauge("mare_ram_usage", "Total calculated RAM usage in bytes for Mare + MSSQL"); - public static readonly Gauge NetworkOut = Metrics.CreateGauge("mare_network_out", "Network out in byte/s"); - public static readonly Gauge NetworkIn = Metrics.CreateGauge("mare_network_in", "Network in in byte/s"); - - public static void InitializeMetrics(MareDbContext dbContext, IConfiguration configuration) - { - UsersRegistered.IncTo(dbContext.Users.Count()); - Pairs.IncTo(dbContext.ClientPairs.Count()); - PairsPaused.IncTo(dbContext.ClientPairs.Count(p => p.IsPaused)); - FilesTotal.IncTo(dbContext.Files.Count()); - FilesTotalSize.IncTo(Directory.EnumerateFiles(configuration["CacheDirectory"]).Sum(f => new FileInfo(f).Length)); - } - } -} diff --git a/MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyCounter.cs b/MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyCounter.cs new file mode 100644 index 0000000..a7632a3 --- /dev/null +++ b/MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyCounter.cs @@ -0,0 +1,22 @@ +using Prometheus; + +namespace MareSynchronosServer.Metrics +{ + public class LockedProxyCounter + { + private readonly Counter _c; + + public LockedProxyCounter(Counter c) + { + _c = c; + } + + public void Inc(double inc = 1d) + { + lock (_c) + { + _c.Inc(inc); + } + } + } +} diff --git a/MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyGauge.cs b/MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyGauge.cs new file mode 100644 index 0000000..62b56a9 --- /dev/null +++ b/MareSynchronosServer/MareSynchronosServer/Metrics/LockedProxyGauge.cs @@ -0,0 +1,47 @@ +using Prometheus; + +namespace MareSynchronosServer.Metrics; + +public class LockedProxyGauge +{ + private readonly Gauge _g; + + public LockedProxyGauge(Gauge g) + { + _g = g; + } + + public void Inc(double inc = 1d) + { + lock (_g) + { + _g.Inc(inc); + } + } + + public void IncTo(double incTo) + { + lock (_g) + { + _g.IncTo(incTo); + } + } + + public void Dec(double decBy = 1d) + { + lock (_g) + { + _g.Dec(decBy); + } + } + + public void Set(double setTo) + { + lock (_g) + { + _g.Set(setTo); + } + } + + public double Value => _g.Value; +} \ No newline at end of file diff --git a/MareSynchronosServer/MareSynchronosServer/Metrics/MareMetrics.cs b/MareSynchronosServer/MareSynchronosServer/Metrics/MareMetrics.cs new file mode 100644 index 0000000..4150c9f --- /dev/null +++ b/MareSynchronosServer/MareSynchronosServer/Metrics/MareMetrics.cs @@ -0,0 +1,52 @@ +using System.IO; +using System.Linq; +using MareSynchronosServer.Data; +using Microsoft.Extensions.Configuration; +using Prometheus; + +namespace MareSynchronosServer.Metrics +{ + public class MareMetrics + { + public static readonly LockedProxyCounter InitializedConnections = + new(Prometheus.Metrics.CreateCounter("mare_initialized_connections", "Initialized Connections")); + public static readonly LockedProxyGauge Connections = + new(Prometheus.Metrics.CreateGauge("mare_unauthorized_connections", "Unauthorized Connections")); + public static readonly LockedProxyGauge AuthorizedConnections = + new(Prometheus.Metrics.CreateGauge("mare_authorized_connections", "Authorized Connections")); + + public static readonly LockedProxyGauge UsersRegistered = new(Prometheus.Metrics.CreateGauge("mare_users_registered", "Total Registrations")); + + public static readonly LockedProxyGauge Pairs = new(Prometheus.Metrics.CreateGauge("mare_pairs", "Total Pairs")); + public static readonly LockedProxyGauge PairsPaused = new(Prometheus.Metrics.CreateGauge("mare_pairs_paused", "Total Paused Pairs")); + + public static readonly LockedProxyGauge FilesTotal = new(Prometheus.Metrics.CreateGauge("mare_files", "Total uploaded files")); + public static readonly LockedProxyGauge FilesTotalSize = + new(Prometheus.Metrics.CreateGauge("mare_files_size", "Total uploaded files (bytes)")); + + public static readonly LockedProxyCounter UserPushData = new(Prometheus.Metrics.CreateCounter("mare_user_push", "Users pushing data")); + public static readonly LockedProxyCounter UserPushDataTo = + new(Prometheus.Metrics.CreateCounter("mare_user_push_to", "Users Receiving Data")); + + public static readonly LockedProxyCounter UserDownloadedFiles = + new(Prometheus.Metrics.CreateCounter("mare_user_downloaded_files", "Total Downloaded Files by Users")); + public static readonly LockedProxyCounter UserDownloadedFilesSize = + new(Prometheus.Metrics.CreateCounter("mare_user_downloaded_files_size", "Total Downloaded Files Size by Users")); + + public static readonly LockedProxyGauge + CPUUsage = new(Prometheus.Metrics.CreateGauge("mare_cpu_usage", "Total calculated CPU usage in %")); + public static readonly LockedProxyGauge RAMUsage = + new(Prometheus.Metrics.CreateGauge("mare_ram_usage", "Total calculated RAM usage in bytes for Mare + MSSQL")); + public static readonly LockedProxyGauge NetworkOut = new(Prometheus.Metrics.CreateGauge("mare_network_out", "Network out in byte/s")); + public static readonly LockedProxyGauge NetworkIn = new(Prometheus.Metrics.CreateGauge("mare_network_in", "Network in in byte/s")); + + public static void InitializeMetrics(MareDbContext dbContext, IConfiguration configuration) + { + UsersRegistered.IncTo(dbContext.Users.Count()); + Pairs.IncTo(dbContext.ClientPairs.Count()); + PairsPaused.IncTo(dbContext.ClientPairs.Count(p => p.IsPaused)); + FilesTotal.IncTo(dbContext.Files.Count()); + FilesTotalSize.IncTo(Directory.EnumerateFiles(configuration["CacheDirectory"]).Sum(f => new FileInfo(f).Length)); + } + } +} diff --git a/MareSynchronosServer/MareSynchronosServer/Program.cs b/MareSynchronosServer/MareSynchronosServer/Program.cs index fbbbfd2..423181f 100644 --- a/MareSynchronosServer/MareSynchronosServer/Program.cs +++ b/MareSynchronosServer/MareSynchronosServer/Program.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using MareSynchronosServer.Metrics; namespace MareSynchronosServer { diff --git a/MareSynchronosServer/MareSynchronosServer/SystemInfoService.cs b/MareSynchronosServer/MareSynchronosServer/SystemInfoService.cs index 4cba87e..a6a1bc9 100644 --- a/MareSynchronosServer/MareSynchronosServer/SystemInfoService.cs +++ b/MareSynchronosServer/MareSynchronosServer/SystemInfoService.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using MareSynchronos.API; using MareSynchronosServer.Data; using MareSynchronosServer.Hubs; +using MareSynchronosServer.Metrics; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection;