diff --git a/Watcher/Controllers/MonitoringController.cs b/Watcher/Controllers/MonitoringController.cs index ecae4f2..faf6df9 100644 --- a/Watcher/Controllers/MonitoringController.cs +++ b/Watcher/Controllers/MonitoringController.cs @@ -378,53 +378,62 @@ public class MonitoringController : Controller } [HttpGet("cpu-usage")] - public async Task GetCpuUsageData(int serverId) + public async Task GetCpuUsageData(int serverId, int hours = 1) { - var oneDayAgo = DateTime.UtcNow.AddDays(-1); - var data = await _context.Metrics - .Where(m => m.Timestamp >= oneDayAgo && m.ServerId == serverId) + var startTime = DateTime.UtcNow.AddHours(-hours); + var metrics = await _context.Metrics + .Where(m => m.Timestamp >= startTime && m.ServerId == serverId) .OrderBy(m => m.Timestamp) - .Select(m => new - { - label = m.Timestamp.ToUniversalTime().ToString("o"), - data = m.CPU_Load - }) .ToListAsync(); + // Timestamp-Format basierend auf Zeitbereich anpassen + string format = hours > 1 ? "dd.MM HH:mm" : "HH:mm"; + var data = metrics.Select(m => new + { + label = m.Timestamp.ToLocalTime().ToString(format), + data = m.CPU_Load + }).ToList(); + return Ok(data); } [HttpGet("ram-usage")] - public async Task GetRamUsageData(int serverId) + public async Task GetRamUsageData(int serverId, int hours = 1) { - var oneDayAgo = DateTime.UtcNow.AddDays(-1); - var data = await _context.Metrics - .Where(m => m.Timestamp >= oneDayAgo && m.ServerId == serverId) + var startTime = DateTime.UtcNow.AddHours(-hours); + var metrics = await _context.Metrics + .Where(m => m.Timestamp >= startTime && m.ServerId == serverId) .OrderBy(m => m.Timestamp) - .Select(m => new - { - label = m.Timestamp.ToUniversalTime().ToString("o"), - data = m.RAM_Load - }) .ToListAsync(); + // Timestamp-Format basierend auf Zeitbereich anpassen + string format = hours > 1 ? "dd.MM HH:mm" : "HH:mm"; + var data = metrics.Select(m => new + { + label = m.Timestamp.ToLocalTime().ToString(format), + data = m.RAM_Load + }).ToList(); + return Ok(data); } [HttpGet("gpu-usage")] - public async Task GetGpuUsageData(int serverId) + public async Task GetGpuUsageData(int serverId, int hours = 1) { - var oneDayAgo = DateTime.UtcNow.AddDays(-1); - var data = await _context.Metrics - .Where(m => m.Timestamp >= oneDayAgo && m.ServerId == serverId) + var startTime = DateTime.UtcNow.AddHours(-hours); + var metrics = await _context.Metrics + .Where(m => m.Timestamp >= startTime && m.ServerId == serverId) .OrderBy(m => m.Timestamp) - .Select(m => new - { - label = m.Timestamp.ToUniversalTime().ToString("o"), - data = m.GPU_Load - }) .ToListAsync(); + // Timestamp-Format basierend auf Zeitbereich anpassen + string format = hours > 1 ? "dd.MM HH:mm" : "HH:mm"; + var data = metrics.Select(m => new + { + label = m.Timestamp.ToLocalTime().ToString(format), + data = m.GPU_Load + }).ToList(); + return Ok(data); } diff --git a/Watcher/Views/Server/Details.cshtml b/Watcher/Views/Server/Details.cshtml index fb903a7..715bdb8 100644 --- a/Watcher/Views/Server/Details.cshtml +++ b/Watcher/Views/Server/Details.cshtml @@ -58,6 +58,17 @@ +
+
+
Metriken
+
+ + + +
+
+
+
CPU Last
@@ -94,10 +105,13 @@ datasets: [{ label: 'CPU Last (%)', data: [], - backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgba(54, 162, 235, 1)', + backgroundColor: 'rgba(54, 162, 235, 0.1)', + borderWidth: 2, fill: true, - tension: 0.3, - pointRadius: 3 + tension: 0.4, + pointRadius: 0, + pointHoverRadius: 4 }] }, options: { @@ -110,14 +124,29 @@ title: { display: true, text: 'Auslastung in %' + }, + grid: { + color: 'rgba(255, 255, 255, 0.1)' } }, x: { title: { display: false, text: 'Zeit' + }, + grid: { + color: 'rgba(255, 255, 255, 0.1)' + }, + ticks: { + maxTicksLimit: 12, + autoSkip: true } } + }, + plugins: { + legend: { + display: false + } } } }); @@ -129,10 +158,13 @@ datasets: [{ label: 'RAM Last (%)', data: [], - backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgba(75, 192, 192, 1)', + backgroundColor: 'rgba(75, 192, 192, 0.1)', + borderWidth: 2, fill: true, - tension: 0.3, - pointRadius: 3 + tension: 0.4, + pointRadius: 0, + pointHoverRadius: 4 }] }, options: { @@ -145,14 +177,29 @@ title: { display: true, text: 'Auslastung in %' + }, + grid: { + color: 'rgba(255, 255, 255, 0.1)' } }, x: { title: { display: false, text: 'Zeit' + }, + grid: { + color: 'rgba(255, 255, 255, 0.1)' + }, + ticks: { + maxTicksLimit: 12, + autoSkip: true } } + }, + plugins: { + legend: { + display: false + } } } }); @@ -164,10 +211,13 @@ datasets: [{ label: 'GPU Last (%)', data: [], - backgroundColor: 'rgba(255, 99, 132, 0.2)', + borderColor: 'rgba(153, 102, 255, 1)', + backgroundColor: 'rgba(153, 102, 255, 0.1)', + borderWidth: 2, fill: true, - tension: 0.3, - pointRadius: 3 + tension: 0.4, + pointRadius: 0, + pointHoverRadius: 4 }] }, options: { @@ -180,21 +230,38 @@ title: { display: true, text: 'Auslastung in %' + }, + grid: { + color: 'rgba(255, 255, 255, 0.1)' } }, x: { title: { display: false, text: 'Zeit' + }, + grid: { + color: 'rgba(255, 255, 255, 0.1)' + }, + ticks: { + maxTicksLimit: 12, + autoSkip: true } } + }, + plugins: { + legend: { + display: false + } } } }); + let currentHours = 1; // Standard: 1 Stunde + async function loadCpuData() { try { - const response = await fetch('/monitoring/cpu-usage?serverId=@Model.Id'); + const response = await fetch(`/monitoring/cpu-usage?serverId=@Model.Id&hours=${currentHours}`); if (!response.ok) { throw new Error(`HTTP-Fehler: ${response.status}`); } @@ -217,7 +284,7 @@ async function loadRamData() { try { - const response = await fetch('/monitoring/ram-usage?serverId=@Model.Id'); + const response = await fetch(`/monitoring/ram-usage?serverId=@Model.Id&hours=${currentHours}`); if (!response.ok) { throw new Error(`HTTP-Fehler: ${response.status}`); } @@ -240,7 +307,7 @@ async function loadGpuData() { try { - const response = await fetch('/monitoring/gpu-usage?serverId=@Model.Id'); + const response = await fetch(`/monitoring/gpu-usage?serverId=@Model.Id&hours=${currentHours}`); if (!response.ok) { throw new Error(`HTTP-Fehler: ${response.status}`); } @@ -261,6 +328,27 @@ } } + // Button-Handler für Zeitbereich-Wechsel + document.querySelectorAll('[data-range]').forEach(button => { + button.addEventListener('click', function() { + // Alle Buttons deaktivieren + document.querySelectorAll('[data-range]').forEach(btn => { + btn.classList.remove('active'); + }); + + // Aktuellen Button aktivieren + this.classList.add('active'); + + // Zeitbereich aktualisieren + currentHours = parseInt(this.getAttribute('data-range')); + + // Daten neu laden + loadCpuData(); + loadRamData(); + loadGpuData(); + }); + }); + // Initiales Laden loadCpuData(); loadRamData();