Enhance monitoring features and UI:

- Add detailed CPU core monitoring option for better performance control
- Update monitoring settings in app configuration
- Improve parallel task execution for resource usage monitoring
- Modify Telegram notification service to skip alerts from svchost processes
- Add "Memory %" column to process table in HTML and update related JavaScript
- Create performance test scripts for API response time evaluation
This commit is contained in:
Din
2025-08-08 16:19:45 +08:00
parent bb7c4c3d0e
commit 3d1c55468b
10 changed files with 236 additions and 34 deletions
+29 -32
View File
@@ -96,32 +96,26 @@ namespace ResourceMonitorService.Services
{
var timestamp = DateTime.Now;
var tasks = new List<Task>
{
Task.Run(async () => await GetCpuUsageAsync()),
Task.Run(async () => await GetMemoryUsageAsync())
};
// Execute all monitoring tasks in parallel and capture results
var cpuTask = GetCpuUsageAsync();
var memoryTask = GetMemoryUsageAsync();
var gpuTask = _settings.EnableGpuMonitoring ? GetGpuUsageAsync() : Task.FromResult(new GpuUsage());
var diskTask = _settings.EnableDiskMonitoring ? GetDiskUsageAsync() : Task.FromResult(new List<DiskUsage>());
var processTask = _settings.EnableProcessMonitoring ? GetTopProcessesAsync(_settings.MaxProcessesToTrack) : Task.FromResult(new List<ProcessInfo>());
var temperatureTask = _settings.EnableTemperatureMonitoring ? GetTemperatureInfoAsync() : Task.FromResult(new TemperatureInfo());
if (_settings.EnableGpuMonitoring)
tasks.Add(Task.Run(async () => await GetGpuUsageAsync()));
if (_settings.EnableDiskMonitoring)
tasks.Add(Task.Run(async () => await GetDiskUsageAsync()));
if (_settings.EnableProcessMonitoring)
tasks.Add(Task.Run(async () => await GetTopProcessesAsync(_settings.MaxProcessesToTrack)));
await Task.WhenAll(tasks);
// Wait for all tasks to complete
await Task.WhenAll(cpuTask, memoryTask, gpuTask, diskTask, processTask, temperatureTask);
return new ResourceUsage
{
Timestamp = timestamp,
CPU = await GetCpuUsageAsync(),
Memory = await GetMemoryUsageAsync(),
GPU = _settings.EnableGpuMonitoring ? await GetGpuUsageAsync() : new GpuUsage(),
Disks = _settings.EnableDiskMonitoring ? await GetDiskUsageAsync() : new List<DiskUsage>(),
TopProcesses = _settings.EnableProcessMonitoring ? await GetTopProcessesAsync(_settings.MaxProcessesToTrack) : new List<ProcessInfo>(),
Temperature = _settings.EnableTemperatureMonitoring ? await GetTemperatureInfoAsync() : new TemperatureInfo()
CPU = await cpuTask,
Memory = await memoryTask,
GPU = await gpuTask,
Disks = await diskTask,
TopProcesses = await processTask,
Temperature = await temperatureTask
};
}
@@ -136,20 +130,23 @@ namespace ResourceMonitorService.Services
#pragma warning disable CA1416 // Validate platform compatibility
var usage = _counters.TryGetValue("cpu", out var cpuCounter) ? cpuCounter.NextValue() : 0f;
// Get per-core usage
// Get per-core usage (only if enabled for performance)
var coreUsages = new List<float>();
for (int i = 0; i < Environment.ProcessorCount; i++)
if (_settings.EnableDetailedCpuCoreMonitoring)
{
try
for (int i = 0; i < Environment.ProcessorCount; i++)
{
using var coreCounter = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
coreCounter.NextValue();
Thread.Sleep(100); // Small delay for accurate reading
coreUsages.Add(coreCounter.NextValue());
}
catch
{
coreUsages.Add(0f);
try
{
using var coreCounter = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
coreCounter.NextValue();
Thread.Sleep(50); // Reduced delay for faster reading while maintaining accuracy
coreUsages.Add(coreCounter.NextValue());
}
catch
{
coreUsages.Add(0f);
}
}
}
+18
View File
@@ -77,6 +77,15 @@ namespace ResourceMonitorService.Services
return;
}
// Ignore alerts from svchost processes
if (alert.Component.Contains("svchost", StringComparison.OrdinalIgnoreCase) ||
alert.Message.Contains("svchost", StringComparison.OrdinalIgnoreCase))
{
_logger.LogInformation("Skipping Telegram alert for svchost process: {Component} - {Message}",
alert.Component, alert.Message);
return;
}
var message = FormatAlertMessage(alert, _telegramSettings.MessageTemplate);
foreach (var chatId in _telegramSettings.ChatIds)
@@ -110,6 +119,15 @@ namespace ResourceMonitorService.Services
if (_botClient == null || !_telegramSettings.IsEnabled || !_telegramSettings.SendResolutionNotifications)
return;
// Ignore alerts from svchost processes
if (alert.Component.Contains("svchost", StringComparison.OrdinalIgnoreCase) ||
alert.Message.Contains("svchost", StringComparison.OrdinalIgnoreCase))
{
_logger.LogInformation("Skipping Telegram resolution notification for svchost process: {Component} - {Message}",
alert.Component, alert.Message);
return;
}
var message = FormatAlertMessage(alert, _telegramSettings.ResolutionTemplate);
foreach (var chatId in _telegramSettings.ChatIds)