Add info api for #231

This commit is contained in:
RaidMax 2022-03-08 12:06:46 -06:00
parent e32e97b9e6
commit 064879fead
2 changed files with 74 additions and 0 deletions

View File

@ -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<int> TotalRecentClients { get; set; }
public MetricSnapshot<int?> MaxConcurrentClients { get; set; }
}
public class MetricSnapshot<T>
{
public T Value { get; set; }
public DateTime? Time { get; set; }
public DateTime? StartAt { get; set; }
public DateTime? EndAt { get; set; }
}

View File

@ -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<IActionResult> 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<int?>
{
Value = maxConcurrent, Time = maxConcurrentTime,
EndAt = DateTime.UtcNow,
StartAt = DateTime.UtcNow - duration
},
TotalRecentClients = new MetricSnapshot<int>
{
Value = totalRecentClients,
EndAt = DateTime.UtcNow,
StartAt = DateTime.UtcNow - duration
}
};
return Json(response);
}
}