From 064879fead44f00f918250c841806377e74d8a38 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Tue, 8 Mar 2022 12:06:46 -0600 Subject: [PATCH] Add info api for #231 --- .../Controllers/API/Dtos/InfoResponse.cs | 21 ++++++++ WebfrontCore/Controllers/API/Info.cs | 53 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 WebfrontCore/Controllers/API/Dtos/InfoResponse.cs create mode 100644 WebfrontCore/Controllers/API/Info.cs diff --git a/WebfrontCore/Controllers/API/Dtos/InfoResponse.cs b/WebfrontCore/Controllers/API/Dtos/InfoResponse.cs new file mode 100644 index 000000000..4909b0b5a --- /dev/null +++ b/WebfrontCore/Controllers/API/Dtos/InfoResponse.cs @@ -0,0 +1,21 @@ +using System; + +namespace WebfrontCore.Controllers.API.Dtos; + +public class InfoResponse +{ + public int TotalConnectedClients { get; set; } + public int TotalClientSlots { get; set; } + public int TotalTrackedClients { get; set; } + public MetricSnapshot TotalRecentClients { get; set; } + + public MetricSnapshot MaxConcurrentClients { get; set; } +} + +public class MetricSnapshot +{ + public T Value { get; set; } + public DateTime? Time { get; set; } + public DateTime? StartAt { get; set; } + public DateTime? EndAt { get; set; } +} diff --git a/WebfrontCore/Controllers/API/Info.cs b/WebfrontCore/Controllers/API/Info.cs new file mode 100644 index 000000000..6f655504d --- /dev/null +++ b/WebfrontCore/Controllers/API/Info.cs @@ -0,0 +1,53 @@ +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using SharedLibraryCore; +using SharedLibraryCore.Interfaces; +using WebfrontCore.Controllers.API.Dtos; + +namespace WebfrontCore.Controllers.API; + +[ApiController] +[Route("api/[controller]")] +public class Info : BaseController +{ + private readonly IServerDataViewer _serverDataViewer; + + public Info(IManager manager, IServerDataViewer serverDataViewer) : base(manager) + { + _serverDataViewer = serverDataViewer; + } + + [HttpGet] + public async Task Get(int period = 24, CancellationToken token = default) + { + // todo: this is hardcoded currently because the cache doesn't take into consideration the duration, so + // we could impact the webfront usage too + var duration = TimeSpan.FromHours(24); + var (totalClients, totalRecentClients) = + await _serverDataViewer.ClientCountsAsync(duration, token); + var (maxConcurrent, maxConcurrentTime) = await _serverDataViewer.MaxConcurrentClientsAsync(overPeriod: duration, token: token); + var response = new InfoResponse + { + TotalTrackedClients = totalClients, + TotalConnectedClients = Manager.GetActiveClients().Count, + TotalClientSlots = Manager.GetServers().Sum(server => server.MaxClients), + MaxConcurrentClients = new MetricSnapshot + { + Value = maxConcurrent, Time = maxConcurrentTime, + EndAt = DateTime.UtcNow, + StartAt = DateTime.UtcNow - duration + }, + TotalRecentClients = new MetricSnapshot + { + Value = totalRecentClients, + EndAt = DateTime.UtcNow, + StartAt = DateTime.UtcNow - duration + } + }; + + return Json(response); + } +}