Re-organised statistic endpoints and services/helpers
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using MoonCore.Attributes;
|
using MoonCore.Attributes;
|
||||||
using MoonCore.Helpers;
|
using MoonCore.Helpers;
|
||||||
using MoonlightServers.ApiServer.Database.Entities;
|
using MoonlightServers.ApiServer.Database.Entities;
|
||||||
|
using MoonlightServers.DaemonShared.Http.Responses.Statistics;
|
||||||
using MoonlightServers.DaemonShared.Http.Responses.Sys;
|
using MoonlightServers.DaemonShared.Http.Responses.Sys;
|
||||||
|
|
||||||
namespace MoonlightServers.ApiServer.Services;
|
namespace MoonlightServers.ApiServer.Services;
|
||||||
@@ -29,24 +30,31 @@ public class NodeService
|
|||||||
return new HttpApiClient(httpClient);
|
return new HttpApiClient(httpClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SystemInfoResponse> GetSystemInfo(Node node)
|
|
||||||
{
|
|
||||||
using var apiClient = await CreateApiClient(node);
|
|
||||||
|
|
||||||
return await apiClient.GetJson<SystemInfoResponse>("api/system/info");
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<SystemStatusResponse> GetSystemStatus(Node node)
|
public async Task<SystemStatusResponse> GetSystemStatus(Node node)
|
||||||
{
|
{
|
||||||
using var apiClient = await CreateApiClient(node);
|
using var apiClient = await CreateApiClient(node);
|
||||||
|
|
||||||
return await apiClient.GetJson<SystemStatusResponse>("api/system/status");
|
return await apiClient.GetJson<SystemStatusResponse>("api/system/status");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SystemDataUsageResponse> GetSystemDataUsage(Node node)
|
#region Statistics
|
||||||
|
|
||||||
|
public async Task<StatisticsApplicationResponse> GetApplicationStatistics(Node node)
|
||||||
{
|
{
|
||||||
using var apiClient = await CreateApiClient(node);
|
using var apiClient = await CreateApiClient(node);
|
||||||
|
return await apiClient.GetJson<StatisticsApplicationResponse>("api/statistics/application");
|
||||||
|
}
|
||||||
|
|
||||||
return await apiClient.GetJson<SystemDataUsageResponse>("api/system/dataUsage");
|
public async Task<StatisticsHostResponse> GetHostStatistics(Node node)
|
||||||
|
{
|
||||||
|
using var apiClient = await CreateApiClient(node);
|
||||||
|
return await apiClient.GetJson<StatisticsHostResponse>("api/statistics/host");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<StatisticsDockerResponse> GetDockerStatistics(Node node)
|
||||||
|
{
|
||||||
|
using var apiClient = await CreateApiClient(node);
|
||||||
|
return await apiClient.GetJson<StatisticsDockerResponse>("api/statistics/docker");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
49
MoonlightServers.Daemon/Helpers/HostSystemHelper.cs
Normal file
49
MoonlightServers.Daemon/Helpers/HostSystemHelper.cs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using MoonCore.Attributes;
|
||||||
|
|
||||||
|
namespace MoonlightServers.Daemon.Helpers;
|
||||||
|
|
||||||
|
[Singleton]
|
||||||
|
public class HostSystemHelper
|
||||||
|
{
|
||||||
|
public string GetOsName()
|
||||||
|
{
|
||||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||||
|
{
|
||||||
|
// Windows platform detected
|
||||||
|
var osVersion = Environment.OSVersion.Version;
|
||||||
|
return $"Windows {osVersion.Major}.{osVersion.Minor}.{osVersion.Build}";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||||
|
{
|
||||||
|
var releaseRaw = File
|
||||||
|
.ReadAllLines("/etc/os-release")
|
||||||
|
.FirstOrDefault(x => x.StartsWith("PRETTY_NAME="));
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(releaseRaw))
|
||||||
|
return "Linux (unknown release)";
|
||||||
|
|
||||||
|
var release = releaseRaw
|
||||||
|
.Replace("PRETTY_NAME=", "")
|
||||||
|
.Replace("\"", "");
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(release))
|
||||||
|
return "Linux (unknown release)";
|
||||||
|
|
||||||
|
return release;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||||
|
{
|
||||||
|
// macOS platform detected
|
||||||
|
var osVersion = Environment.OSVersion.Version;
|
||||||
|
return $"Shitty macOS {osVersion.Major}.{osVersion.Minor}.{osVersion.Build}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unknown platform
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
36
MoonlightServers.Daemon/Helpers/OwnProcessHelper.cs
Normal file
36
MoonlightServers.Daemon/Helpers/OwnProcessHelper.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using MoonCore.Attributes;
|
||||||
|
|
||||||
|
namespace MoonlightServers.Daemon.Helpers;
|
||||||
|
|
||||||
|
[Singleton]
|
||||||
|
public class OwnProcessHelper
|
||||||
|
{
|
||||||
|
public long GetMemoryUsage()
|
||||||
|
{
|
||||||
|
var process = Process.GetCurrentProcess();
|
||||||
|
var bytes = process.PrivateMemorySize64;
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeSpan GetUptime()
|
||||||
|
{
|
||||||
|
var process = Process.GetCurrentProcess();
|
||||||
|
var uptime = DateTime.Now - process.StartTime;
|
||||||
|
|
||||||
|
return uptime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int CpuUsage()
|
||||||
|
{
|
||||||
|
var process = Process.GetCurrentProcess();
|
||||||
|
var cpuTime = process.TotalProcessorTime;
|
||||||
|
var wallClockTime = DateTime.UtcNow - process.StartTime.ToUniversalTime();
|
||||||
|
|
||||||
|
var cpuUsage = (int)(100.0 * cpuTime.TotalMilliseconds / wallClockTime.TotalMilliseconds /
|
||||||
|
Environment.ProcessorCount);
|
||||||
|
|
||||||
|
return cpuUsage;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using MoonlightServers.Daemon.Helpers;
|
||||||
|
using MoonlightServers.DaemonShared.Http.Responses.Statistics;
|
||||||
|
|
||||||
|
namespace MoonlightServers.Daemon.Http.Controllers.Statistics;
|
||||||
|
|
||||||
|
// This controller hosts endpoints for the statistics for the daemon application itself
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/statistics/application")]
|
||||||
|
public class StatisticsApplicationController : Controller
|
||||||
|
{
|
||||||
|
private readonly OwnProcessHelper ProcessHelper;
|
||||||
|
|
||||||
|
public StatisticsApplicationController(OwnProcessHelper processHelper)
|
||||||
|
{
|
||||||
|
ProcessHelper = processHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<StatisticsApplicationResponse> Get()
|
||||||
|
{
|
||||||
|
return new StatisticsApplicationResponse()
|
||||||
|
{
|
||||||
|
Uptime = ProcessHelper.GetUptime(),
|
||||||
|
MemoryUsage = ProcessHelper.GetMemoryUsage(),
|
||||||
|
CpuUsage = ProcessHelper.CpuUsage()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using MoonlightServers.Daemon.Services;
|
||||||
|
using MoonlightServers.DaemonShared.Http.Responses.Statistics;
|
||||||
|
|
||||||
|
namespace MoonlightServers.Daemon.Http.Controllers.Statistics;
|
||||||
|
|
||||||
|
// This controller hosts endpoints for the statistics for the docker environment
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/statistics/docker")]
|
||||||
|
public class StatisticsDockerController : Controller
|
||||||
|
{
|
||||||
|
private readonly DockerInfoService DockerInfoService;
|
||||||
|
|
||||||
|
public StatisticsDockerController(DockerInfoService dockerInfoService)
|
||||||
|
{
|
||||||
|
DockerInfoService = dockerInfoService;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<StatisticsDockerResponse> Get()
|
||||||
|
{
|
||||||
|
var usage = await DockerInfoService.GetDataUsage();
|
||||||
|
|
||||||
|
return new StatisticsDockerResponse
|
||||||
|
{
|
||||||
|
Version = await DockerInfoService.GetDockerVersion(),
|
||||||
|
ContainersReclaimable = usage.Containers.Reclaimable,
|
||||||
|
ContainersUsed = usage.Containers.Used,
|
||||||
|
BuildCacheReclaimable = usage.BuildCache.Reclaimable,
|
||||||
|
BuildCacheUsed = usage.BuildCache.Used,
|
||||||
|
ImagesUsed = usage.Images.Used,
|
||||||
|
ImagesReclaimable = usage.Images.Reclaimable
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using MoonlightServers.Daemon.Helpers;
|
||||||
|
using MoonlightServers.DaemonShared.Http.Responses.Statistics;
|
||||||
|
|
||||||
|
namespace MoonlightServers.Daemon.Http.Controllers.Statistics;
|
||||||
|
|
||||||
|
// This controller hosts endpoints for the statistics for host system the daemon runs on
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/statistics/host")]
|
||||||
|
public class StatisticsHostController : Controller
|
||||||
|
{
|
||||||
|
private readonly HostSystemHelper HostSystemHelper;
|
||||||
|
|
||||||
|
public StatisticsHostController(HostSystemHelper hostSystemHelper)
|
||||||
|
{
|
||||||
|
HostSystemHelper = hostSystemHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<StatisticsHostResponse> Get()
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
OperatingSystem = HostSystemHelper.GetOsName()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using MoonlightServers.Daemon.Services;
|
|
||||||
using MoonlightServers.DaemonShared.Http.Responses.Sys;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Daemon.Http.Controllers.Sys;
|
|
||||||
|
|
||||||
[ApiController]
|
|
||||||
[Route("api/system/dataUsage")]
|
|
||||||
public class SystemDataUsageController : Controller
|
|
||||||
{
|
|
||||||
private readonly DockerInfoService DockerInfoService;
|
|
||||||
|
|
||||||
public SystemDataUsageController(DockerInfoService dockerInfoService)
|
|
||||||
{
|
|
||||||
DockerInfoService = dockerInfoService;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public async Task<SystemDataUsageResponse> Get()
|
|
||||||
{
|
|
||||||
var report = await DockerInfoService.GetDataUsage();
|
|
||||||
|
|
||||||
return new SystemDataUsageResponse()
|
|
||||||
{
|
|
||||||
ImagesReclaimable = report.Images.Reclaimable,
|
|
||||||
ImagesUsed = report.Images.Used,
|
|
||||||
ContainersReclaimable = report.Containers.Reclaimable,
|
|
||||||
ContainersUsed = report.Containers.Used,
|
|
||||||
BuildCacheReclaimable = report.BuildCache.Reclaimable,
|
|
||||||
BuildCacheUsed = report.BuildCache.Used
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using MoonlightServers.Daemon.Services;
|
|
||||||
using MoonlightServers.DaemonShared.Http.Responses.Sys;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Daemon.Http.Controllers.Sys;
|
|
||||||
|
|
||||||
[ApiController]
|
|
||||||
[Route("api/system/info")]
|
|
||||||
public class SystemInfoController : Controller
|
|
||||||
{
|
|
||||||
private readonly SystemInfoService SystemInfoService;
|
|
||||||
private readonly DockerInfoService DockerInfoService;
|
|
||||||
|
|
||||||
public SystemInfoController(SystemInfoService systemInfoService, DockerInfoService dockerInfoService)
|
|
||||||
{
|
|
||||||
SystemInfoService = systemInfoService;
|
|
||||||
DockerInfoService = dockerInfoService;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public async Task<SystemInfoResponse> GetInfo()
|
|
||||||
{
|
|
||||||
return new SystemInfoResponse()
|
|
||||||
{
|
|
||||||
Uptime = await SystemInfoService.GetUptime(),
|
|
||||||
Version = "2.1.0",
|
|
||||||
CpuUsage = await SystemInfoService.GetCpuUsage(),
|
|
||||||
DockerVersion = await DockerInfoService.GetDockerVersion(),
|
|
||||||
MemoryUsage = await SystemInfoService.GetMemoryUsage(),
|
|
||||||
OsName = await SystemInfoService.GetOsName()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
using System.Diagnostics;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using Docker.DotNet;
|
|
||||||
using MoonCore.Attributes;
|
|
||||||
using MoonlightServers.Daemon.Helpers;
|
|
||||||
|
|
||||||
namespace MoonlightServers.Daemon.Services;
|
|
||||||
|
|
||||||
[Singleton]
|
|
||||||
public class SystemInfoService
|
|
||||||
{
|
|
||||||
private readonly ILogger<SystemInfoService> Logger;
|
|
||||||
private readonly IHost Host;
|
|
||||||
|
|
||||||
public SystemInfoService(
|
|
||||||
ILogger<SystemInfoService> logger,
|
|
||||||
IHost host
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Logger = logger;
|
|
||||||
Host = host;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetOsName()
|
|
||||||
{
|
|
||||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
||||||
{
|
|
||||||
// Windows platform detected
|
|
||||||
var osVersion = Environment.OSVersion.Version;
|
|
||||||
return Task.FromResult($"Windows {osVersion.Major}.{osVersion.Minor}.{osVersion.Build}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
||||||
{
|
|
||||||
var releaseRaw = File
|
|
||||||
.ReadAllLines("/etc/os-release")
|
|
||||||
.FirstOrDefault(x => x.StartsWith("PRETTY_NAME="));
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(releaseRaw))
|
|
||||||
return Task.FromResult("Linux (unknown release)");
|
|
||||||
|
|
||||||
var release = releaseRaw
|
|
||||||
.Replace("PRETTY_NAME=", "")
|
|
||||||
.Replace("\"", "");
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(release))
|
|
||||||
return Task.FromResult("Linux (unknown release)");
|
|
||||||
|
|
||||||
return Task.FromResult(release);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
||||||
{
|
|
||||||
// macOS platform detected
|
|
||||||
var osVersion = Environment.OSVersion.Version;
|
|
||||||
return Task.FromResult($"macOS {osVersion.Major}.{osVersion.Minor}.{osVersion.Build}");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unknown platform
|
|
||||||
return Task.FromResult("N/A");
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<long> GetMemoryUsage()
|
|
||||||
{
|
|
||||||
var process = Process.GetCurrentProcess();
|
|
||||||
var bytes = process.PrivateMemorySize64;
|
|
||||||
return Task.FromResult(bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<TimeSpan> GetUptime()
|
|
||||||
{
|
|
||||||
var process = Process.GetCurrentProcess();
|
|
||||||
var uptime = DateTime.Now - process.StartTime;
|
|
||||||
return Task.FromResult(uptime);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> GetCpuUsage()
|
|
||||||
{
|
|
||||||
var process = Process.GetCurrentProcess();
|
|
||||||
var cpuTime = process.TotalProcessorTime;
|
|
||||||
var wallClockTime = DateTime.UtcNow - process.StartTime.ToUniversalTime();
|
|
||||||
|
|
||||||
var cpuUsage = (int)(100.0 * cpuTime.TotalMilliseconds / wallClockTime.TotalMilliseconds /
|
|
||||||
Environment.ProcessorCount);
|
|
||||||
|
|
||||||
return Task.FromResult(cpuUsage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task Shutdown()
|
|
||||||
{
|
|
||||||
Logger.LogCritical("Restart of daemon has been requested");
|
|
||||||
|
|
||||||
Task.Run(async () =>
|
|
||||||
{
|
|
||||||
await Task.Delay(TimeSpan.FromSeconds(1));
|
|
||||||
await Host.StopAsync(CancellationToken.None);
|
|
||||||
});
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace MoonlightServers.DaemonShared.Http.Responses.Statistics;
|
||||||
|
|
||||||
|
public class StatisticsApplicationResponse
|
||||||
|
{
|
||||||
|
public int CpuUsage { get; set; }
|
||||||
|
public long MemoryUsage { get; set; }
|
||||||
|
public TimeSpan Uptime { get; set; }
|
||||||
|
}
|
||||||
@@ -1,11 +1,15 @@
|
|||||||
namespace MoonlightServers.DaemonShared.Http.Responses.Sys;
|
namespace MoonlightServers.DaemonShared.Http.Responses.Statistics;
|
||||||
|
|
||||||
public class SystemDataUsageResponse
|
public class StatisticsDockerResponse
|
||||||
{
|
{
|
||||||
|
public string Version { get; set; }
|
||||||
|
|
||||||
public long ImagesUsed { get; set; }
|
public long ImagesUsed { get; set; }
|
||||||
public long ImagesReclaimable { get; set; }
|
public long ImagesReclaimable { get; set; }
|
||||||
|
|
||||||
public long ContainersUsed { get; set; }
|
public long ContainersUsed { get; set; }
|
||||||
public long ContainersReclaimable { get; set; }
|
public long ContainersReclaimable { get; set; }
|
||||||
|
|
||||||
public long BuildCacheUsed { get; set; }
|
public long BuildCacheUsed { get; set; }
|
||||||
public long BuildCacheReclaimable { get; set; }
|
public long BuildCacheReclaimable { get; set; }
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace MoonlightServers.DaemonShared.Http.Responses.Statistics;
|
||||||
|
|
||||||
|
public class StatisticsHostResponse
|
||||||
|
{
|
||||||
|
public string OperatingSystem { get; set; }
|
||||||
|
}
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
namespace MoonlightServers.DaemonShared.Http.Responses.Sys;
|
|
||||||
|
|
||||||
public class SystemInfoResponse
|
|
||||||
{
|
|
||||||
public string DockerVersion { get; set; }
|
|
||||||
public string Version { get; set; }
|
|
||||||
public string OsName { get; set; }
|
|
||||||
public long MemoryUsage { get; set; }
|
|
||||||
public TimeSpan Uptime { get; set; }
|
|
||||||
public int CpuUsage { get; set; }
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user