Initial commit
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
using System.Diagnostics;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Management;
|
||||
|
||||
namespace ResourceMonitorService
|
||||
{
|
||||
public class Worker : BackgroundService
|
||||
{
|
||||
private readonly IHostApplicationLifetime _lifetime;
|
||||
|
||||
public Worker(IHostApplicationLifetime lifetime)
|
||||
{
|
||||
_lifetime = lifetime;
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
var builder = WebApplication.CreateBuilder();
|
||||
builder.Services.AddControllers().AddNewtonsoftJson();
|
||||
var app = builder.Build();
|
||||
|
||||
app.MapGet("/api/resource-usage", async context =>
|
||||
{
|
||||
var computerInfo = GetComputerInfo();
|
||||
var cpuUsage = GetCpuUsage();
|
||||
var ramUsage = GetRamUsage();
|
||||
var gpuUsage = GetGpuUsage();
|
||||
|
||||
var resourceUsage = new
|
||||
{
|
||||
ComputerInfo = computerInfo,
|
||||
CPU = cpuUsage,
|
||||
RAM = ramUsage,
|
||||
GPU = gpuUsage
|
||||
};
|
||||
|
||||
var json = JsonConvert.SerializeObject(resourceUsage);
|
||||
context.Response.ContentType = "application/json";
|
||||
await context.Response.WriteAsync(json);
|
||||
});
|
||||
|
||||
app.RunAsync(stoppingToken);
|
||||
|
||||
await Task.Delay(Timeout.Infinite, stoppingToken);
|
||||
}
|
||||
|
||||
private object GetComputerInfo()
|
||||
{
|
||||
return new
|
||||
{
|
||||
MachineName = Environment.MachineName,
|
||||
OSVersion = RuntimeInformation.OSDescription,
|
||||
OSArchitecture = RuntimeInformation.OSArchitecture.ToString(),
|
||||
ProcessorCount = Environment.ProcessorCount
|
||||
};
|
||||
}
|
||||
|
||||
private float GetCpuUsage()
|
||||
{
|
||||
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
|
||||
cpuCounter.NextValue();
|
||||
Thread.Sleep(1000); // Wait a second to get a valid reading
|
||||
return cpuCounter.NextValue();
|
||||
}
|
||||
|
||||
private float GetRamUsage()
|
||||
{
|
||||
var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
|
||||
var totalMemory = GetTotalPhysicalMemory();
|
||||
var availableMemory = ramCounter.NextValue() * 1024 * 1024;
|
||||
return (float)(totalMemory - availableMemory) / totalMemory * 100;
|
||||
}
|
||||
|
||||
private ulong GetTotalPhysicalMemory()
|
||||
{
|
||||
ulong totalMemory = 0;
|
||||
var searcher = new ManagementObjectSearcher("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem");
|
||||
foreach (var obj in searcher.Get())
|
||||
{
|
||||
totalMemory = (ulong)obj["TotalPhysicalMemory"];
|
||||
}
|
||||
return totalMemory;
|
||||
}
|
||||
|
||||
private object GetGpuUsage()
|
||||
{
|
||||
NvmlWrapper.NvmlInit();
|
||||
IntPtr device;
|
||||
NvmlWrapper.NvmlDeviceGetHandleByIndex(0, out device);
|
||||
NvmlWrapper.NvmlUtilization utilization;
|
||||
NvmlWrapper.NvmlDeviceGetUtilizationRates(device, out utilization);
|
||||
|
||||
uint temperature;
|
||||
NvmlWrapper.NvmlDeviceGetTemperature(device, 0, out temperature);
|
||||
|
||||
uint fanSpeed;
|
||||
NvmlWrapper.NvmlDeviceGetFanSpeed(device, out fanSpeed);
|
||||
|
||||
NvmlWrapper.NvmlShutdown();
|
||||
|
||||
return new
|
||||
{
|
||||
Usage = utilization.Gpu,
|
||||
Temperature = temperature,
|
||||
FanSpeed = fanSpeed
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user