Remove network monitoring features and related code; update GPU monitoring in dashboard for improved performance and clarity.
This commit is contained in:
@@ -6,7 +6,6 @@ namespace ResourceMonitorService.Configuration
|
||||
public int DataRetentionDays { get; set; } = 7;
|
||||
public bool EnableGpuMonitoring { get; set; } = true;
|
||||
public bool EnableDiskMonitoring { get; set; } = true;
|
||||
public bool EnableNetworkMonitoring { get; set; } = true;
|
||||
public bool EnableTemperatureMonitoring { get; set; } = true;
|
||||
public bool EnableProcessMonitoring { get; set; } = true;
|
||||
public bool EnableGameDetection { get; set; } = true;
|
||||
|
||||
@@ -113,21 +113,6 @@ namespace ResourceMonitorService.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("network")]
|
||||
public async Task<ActionResult<NetworkUsage>> GetNetworkUsage()
|
||||
{
|
||||
try
|
||||
{
|
||||
var networkUsage = await _resourceMonitorService.GetNetworkUsageAsync();
|
||||
return Ok(networkUsage);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error getting network usage");
|
||||
return StatusCode(500, "Internal server error");
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("processes")]
|
||||
public async Task<ActionResult<List<ProcessInfo>>> GetTopProcesses([FromQuery] int count = 10)
|
||||
{
|
||||
|
||||
@@ -24,7 +24,6 @@ namespace ResourceMonitorService.Models
|
||||
public MemoryUsage Memory { get; set; } = new();
|
||||
public GpuUsage GPU { get; set; } = new();
|
||||
public List<DiskUsage> Disks { get; set; } = new();
|
||||
public NetworkUsage Network { get; set; } = new();
|
||||
public List<ProcessInfo> TopProcesses { get; set; } = new();
|
||||
public TemperatureInfo Temperature { get; set; } = new();
|
||||
public GameInfo? RunningGame { get; set; }
|
||||
@@ -84,27 +83,6 @@ namespace ResourceMonitorService.Models
|
||||
public long WriteOperations { get; set; }
|
||||
}
|
||||
|
||||
public class NetworkUsage
|
||||
{
|
||||
public float UploadSpeed { get; set; } // MB/s
|
||||
public float DownloadSpeed { get; set; } // MB/s
|
||||
public ulong BytesSent { get; set; }
|
||||
public ulong BytesReceived { get; set; }
|
||||
public List<NetworkAdapter> Adapters { get; set; } = new();
|
||||
}
|
||||
|
||||
public class NetworkAdapter
|
||||
{
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public bool IsOperational { get; set; }
|
||||
public long Speed { get; set; }
|
||||
public float UploadSpeed { get; set; }
|
||||
public float DownloadSpeed { get; set; }
|
||||
public string IPAddress { get; set; } = string.Empty;
|
||||
public string MACAddress { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class ProcessInfo
|
||||
{
|
||||
public int ProcessId { get; set; }
|
||||
|
||||
@@ -14,7 +14,6 @@ namespace ResourceMonitorService.Services
|
||||
Task<MemoryUsage> GetMemoryUsageAsync();
|
||||
Task<GpuUsage> GetGpuUsageAsync();
|
||||
Task<List<DiskUsage>> GetDiskUsageAsync();
|
||||
Task<NetworkUsage> GetNetworkUsageAsync();
|
||||
Task<List<ProcessInfo>> GetTopProcessesAsync(int count = 10);
|
||||
}
|
||||
|
||||
@@ -23,8 +22,6 @@ namespace ResourceMonitorService.Services
|
||||
private readonly ILogger<ResourceMonitorService> _logger;
|
||||
private readonly MonitoringSettings _settings;
|
||||
private readonly Dictionary<string, PerformanceCounter> _counters;
|
||||
private readonly Dictionary<string, long> _previousNetworkBytes;
|
||||
private readonly Dictionary<string, DateTime> _previousNetworkTime;
|
||||
private readonly Dictionary<string, long> _previousDiskBytes;
|
||||
private readonly Dictionary<string, DateTime> _previousDiskTime;
|
||||
private readonly Dictionary<string, int> _errorCounts;
|
||||
@@ -35,8 +32,6 @@ namespace ResourceMonitorService.Services
|
||||
_logger = logger;
|
||||
_settings = settings.Value;
|
||||
_counters = new Dictionary<string, PerformanceCounter>();
|
||||
_previousNetworkBytes = new Dictionary<string, long>();
|
||||
_previousNetworkTime = new Dictionary<string, DateTime>();
|
||||
_previousDiskBytes = new Dictionary<string, long>();
|
||||
_previousDiskTime = new Dictionary<string, DateTime>();
|
||||
_errorCounts = new Dictionary<string, int>();
|
||||
@@ -52,12 +47,6 @@ namespace ResourceMonitorService.Services
|
||||
_counters["cpu"] = new PerformanceCounter("Processor", "% Processor Time", "_Total");
|
||||
_counters["memory_available"] = new PerformanceCounter("Memory", "Available MBytes");
|
||||
|
||||
if (_settings.EnableNetworkMonitoring)
|
||||
{
|
||||
_counters["network_bytes_sent"] = new PerformanceCounter("Network Interface", "Bytes Sent/sec", "*");
|
||||
_counters["network_bytes_received"] = new PerformanceCounter("Network Interface", "Bytes Received/sec", "*");
|
||||
}
|
||||
|
||||
if (_settings.EnableDiskMonitoring)
|
||||
{
|
||||
_counters["disk_read"] = new PerformanceCounter("PhysicalDisk", "Disk Read Bytes/sec", "_Total");
|
||||
@@ -119,9 +108,6 @@ namespace ResourceMonitorService.Services
|
||||
if (_settings.EnableDiskMonitoring)
|
||||
tasks.Add(Task.Run(async () => await GetDiskUsageAsync()));
|
||||
|
||||
if (_settings.EnableNetworkMonitoring)
|
||||
tasks.Add(Task.Run(async () => await GetNetworkUsageAsync()));
|
||||
|
||||
if (_settings.EnableProcessMonitoring)
|
||||
tasks.Add(Task.Run(async () => await GetTopProcessesAsync(_settings.MaxProcessesToTrack)));
|
||||
|
||||
@@ -134,7 +120,6 @@ namespace ResourceMonitorService.Services
|
||||
Memory = await GetMemoryUsageAsync(),
|
||||
GPU = _settings.EnableGpuMonitoring ? await GetGpuUsageAsync() : new GpuUsage(),
|
||||
Disks = _settings.EnableDiskMonitoring ? await GetDiskUsageAsync() : new List<DiskUsage>(),
|
||||
Network = _settings.EnableNetworkMonitoring ? await GetNetworkUsageAsync() : new NetworkUsage(),
|
||||
TopProcesses = _settings.EnableProcessMonitoring ? await GetTopProcessesAsync(_settings.MaxProcessesToTrack) : new List<ProcessInfo>(),
|
||||
Temperature = _settings.EnableTemperatureMonitoring ? await GetTemperatureInfoAsync() : new TemperatureInfo()
|
||||
};
|
||||
@@ -654,91 +639,6 @@ namespace ResourceMonitorService.Services
|
||||
return false;
|
||||
}
|
||||
|
||||
public async Task<NetworkUsage> GetNetworkUsageAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
var networkUsage = new NetworkUsage();
|
||||
var adapters = new List<NetworkAdapter>();
|
||||
|
||||
try
|
||||
{
|
||||
#pragma warning disable CA1416 // Validate platform compatibility
|
||||
using var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface WHERE Name != 'Loopback'");
|
||||
using var collection = searcher.Get();
|
||||
|
||||
foreach (ManagementObject obj in collection)
|
||||
{
|
||||
var name = obj["Name"]?.ToString() ?? "";
|
||||
if (name.Contains("Loopback") || name.Contains("Isatap") || name.Contains("Teredo"))
|
||||
continue;
|
||||
|
||||
var bytesSent = Convert.ToInt64(obj["BytesSentPerSec"] ?? 0);
|
||||
var bytesReceived = Convert.ToInt64(obj["BytesReceivedPerSec"] ?? 0);
|
||||
var timestamp = DateTime.Now;
|
||||
|
||||
var adapter = new NetworkAdapter
|
||||
{
|
||||
Name = name,
|
||||
IsOperational = true
|
||||
};
|
||||
|
||||
// Calculate speeds if we have previous data
|
||||
var key = $"{name}_sent";
|
||||
if (_previousNetworkBytes.ContainsKey(key) && _previousNetworkTime.ContainsKey(key))
|
||||
{
|
||||
var timeDiff = (timestamp - _previousNetworkTime[key]).TotalSeconds;
|
||||
if (timeDiff > 0)
|
||||
{
|
||||
var bytesDiff = bytesSent - _previousNetworkBytes[key];
|
||||
adapter.UploadSpeed = (float)(bytesDiff / timeDiff / (1024 * 1024)); // MB/s
|
||||
networkUsage.UploadSpeed += adapter.UploadSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
key = $"{name}_received";
|
||||
if (_previousNetworkBytes.ContainsKey(key) && _previousNetworkTime.ContainsKey(key))
|
||||
{
|
||||
var timeDiff = (timestamp - _previousNetworkTime[key]).TotalSeconds;
|
||||
if (timeDiff > 0)
|
||||
{
|
||||
var bytesDiff = bytesReceived - _previousNetworkBytes[key];
|
||||
adapter.DownloadSpeed = (float)(bytesDiff / timeDiff / (1024 * 1024)); // MB/s
|
||||
networkUsage.DownloadSpeed += adapter.DownloadSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
// Store current values for next calculation
|
||||
_previousNetworkBytes[$"{name}_sent"] = bytesSent;
|
||||
_previousNetworkBytes[$"{name}_received"] = bytesReceived;
|
||||
_previousNetworkTime[$"{name}_sent"] = timestamp;
|
||||
_previousNetworkTime[$"{name}_received"] = timestamp;
|
||||
|
||||
networkUsage.BytesSent += (ulong)bytesSent;
|
||||
networkUsage.BytesReceived += (ulong)bytesReceived;
|
||||
|
||||
adapters.Add(adapter);
|
||||
}
|
||||
#pragma warning restore CA1416 // Validate platform compatibility
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogWarning(ex, "Could not get network performance data");
|
||||
}
|
||||
|
||||
networkUsage.Adapters = adapters;
|
||||
return networkUsage;
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error getting network usage");
|
||||
return new NetworkUsage();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<List<ProcessInfo>> GetTopProcessesAsync(int count = 10)
|
||||
{
|
||||
try
|
||||
|
||||
+7
-16
@@ -41,7 +41,7 @@
|
||||
<!-- Main Content -->
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
<!-- Dashboard Overview -->
|
||||
<div id="dashboard" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
|
||||
<div id="dashboard" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
|
||||
<!-- CPU Card -->
|
||||
<div class="bg-white rounded-lg shadow-lg p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
@@ -93,23 +93,14 @@
|
||||
<div class="w-full bg-gray-200 rounded-full h-2">
|
||||
<div id="gpuBar" class="bg-purple-600 h-2 rounded-full transition-all duration-300" style="width: 0%"></div>
|
||||
</div>
|
||||
<div class="mt-2 flex items-center justify-between text-sm">
|
||||
<span class="text-gray-500">
|
||||
<i class="fas fa-thermometer-half mr-1"></i>
|
||||
<span id="gpuTemp" class="font-medium">0°C</span>
|
||||
</span>
|
||||
<span id="gpuTempStatus" class="text-green-600">Normal</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Network Card -->
|
||||
<div class="bg-white rounded-lg shadow-lg p-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<div>
|
||||
<p class="text-sm font-medium text-gray-500">Network</p>
|
||||
<p id="networkSpeed" class="text-3xl font-bold text-orange-600">0 MB/s</p>
|
||||
</div>
|
||||
<div class="bg-orange-100 p-3 rounded-full">
|
||||
<i class="fas fa-network-wired text-orange-600 text-xl"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<p id="networkDetail" class="text-sm text-gray-500">↑ 0 MB/s ↓ 0 MB/s</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
+63
-9
@@ -228,18 +228,29 @@ class ResourceDashboard {
|
||||
// Update GPU
|
||||
if (data.gpu) {
|
||||
const gpuUsage = data.gpu.usage || 0;
|
||||
const gpuTemp = data.gpu.temperature || 0;
|
||||
|
||||
document.getElementById('gpuUsage').textContent = `${gpuUsage.toFixed(1)}%`;
|
||||
document.getElementById('gpuBar').style.width = `${gpuUsage}%`;
|
||||
}
|
||||
|
||||
// Update Network
|
||||
if (data.network) {
|
||||
const bytesReceived = data.network.bytesReceived || 0;
|
||||
const bytesSent = data.network.bytesSent || 0;
|
||||
const totalSpeed = (bytesReceived + bytesSent) / 1024 / 1024;
|
||||
document.getElementById('networkSpeed').textContent = `${totalSpeed.toFixed(1)} MB/s`;
|
||||
document.getElementById('networkDetail').textContent =
|
||||
`↑ ${(bytesSent / 1024 / 1024).toFixed(1)} MB/s ↓ ${(bytesReceived / 1024 / 1024).toFixed(1)} MB/s`;
|
||||
// Update GPU temperature
|
||||
document.getElementById('gpuTemp').textContent = `${gpuTemp}°C`;
|
||||
|
||||
// Set temperature status color based on temperature ranges
|
||||
const tempStatusElement = document.getElementById('gpuTempStatus');
|
||||
if (gpuTemp <= 60) {
|
||||
tempStatusElement.textContent = 'Cool';
|
||||
tempStatusElement.className = 'text-green-600';
|
||||
} else if (gpuTemp <= 75) {
|
||||
tempStatusElement.textContent = 'Normal';
|
||||
tempStatusElement.className = 'text-yellow-600';
|
||||
} else if (gpuTemp <= 85) {
|
||||
tempStatusElement.textContent = 'Warm';
|
||||
tempStatusElement.className = 'text-orange-600';
|
||||
} else {
|
||||
tempStatusElement.textContent = 'Hot';
|
||||
tempStatusElement.className = 'text-red-600';
|
||||
}
|
||||
}
|
||||
|
||||
// Update Game Detection
|
||||
@@ -258,6 +269,11 @@ class ResourceDashboard {
|
||||
if (data.disks && !document.getElementById('detailsSection').classList.contains('hidden')) {
|
||||
this.updateDiskUsage(data.disks);
|
||||
}
|
||||
|
||||
// Update System Info GPU details (only if details section is visible and we have system info)
|
||||
if (!document.getElementById('detailsSection').classList.contains('hidden') && this.lastSystemInfo) {
|
||||
this.updateSystemInfo(this.lastSystemInfo);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error updating dashboard:', error);
|
||||
this.showNotification('Error updating dashboard data', 'error');
|
||||
@@ -343,6 +359,43 @@ class ResourceDashboard {
|
||||
// Store the latest system info
|
||||
this.lastSystemInfo = systemInfo;
|
||||
|
||||
// Get GPU info from the latest resource data if available
|
||||
const gpuInfo = this.lastResourceData?.gpu;
|
||||
|
||||
let gpuSection = '';
|
||||
if (gpuInfo && gpuInfo.isAvailable) {
|
||||
gpuSection = `
|
||||
<div class="bg-gray-50 p-4 rounded-lg">
|
||||
<h4 class="font-semibold text-gray-700">GPU</h4>
|
||||
<p class="text-gray-600">${gpuInfo.name || 'Unknown GPU'}</p>
|
||||
<div class="mt-2 space-y-1">
|
||||
<div class="flex justify-between text-sm">
|
||||
<span class="text-gray-500">Usage:</span>
|
||||
<span class="text-gray-700">${gpuInfo.usage || 0}%</span>
|
||||
</div>
|
||||
<div class="flex justify-between text-sm">
|
||||
<span class="text-gray-500">Temperature:</span>
|
||||
<span class="text-gray-700 ${gpuInfo.temperature > 85 ? 'text-red-600' : gpuInfo.temperature > 75 ? 'text-orange-600' : gpuInfo.temperature > 60 ? 'text-yellow-600' : 'text-green-600'}">${gpuInfo.temperature || 0}°C</span>
|
||||
</div>
|
||||
<div class="flex justify-between text-sm">
|
||||
<span class="text-gray-500">Memory:</span>
|
||||
<span class="text-gray-700">${gpuInfo.memoryUsed && gpuInfo.memoryTotal ? ((gpuInfo.memoryUsed / gpuInfo.memoryTotal) * 100).toFixed(1) : 0}%</span>
|
||||
</div>
|
||||
${gpuInfo.fanSpeed ? `
|
||||
<div class="flex justify-between text-sm">
|
||||
<span class="text-gray-500">Fan Speed:</span>
|
||||
<span class="text-gray-700">${gpuInfo.fanSpeed}%</span>
|
||||
</div>` : ''}
|
||||
${gpuInfo.powerUsage ? `
|
||||
<div class="flex justify-between text-sm">
|
||||
<span class="text-gray-500">Power:</span>
|
||||
<span class="text-gray-700">${gpuInfo.powerUsage}W</span>
|
||||
</div>` : ''}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
const systemInfoDiv = document.getElementById('systemInfo');
|
||||
systemInfoDiv.innerHTML = `
|
||||
<div class="bg-gray-50 p-4 rounded-lg">
|
||||
@@ -369,6 +422,7 @@ class ResourceDashboard {
|
||||
<h4 class="font-semibold text-gray-700">Uptime</h4>
|
||||
<p class="text-gray-600">${systemInfo.uptime ? this.formatUptime(systemInfo.uptime) : 'N/A'}</p>
|
||||
</div>
|
||||
${gpuSection}
|
||||
`;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user