Add results_visualization/js/ui.js
This commit is contained in:
parent
07ff1b59fd
commit
eb1f27651d
1 changed files with 100 additions and 0 deletions
100
results_visualization/js/ui.js
Normal file
100
results_visualization/js/ui.js
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
let chartInstance = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Berechnet statistische Kennzahlen aus den Spike-Daten.
|
||||||
|
* @param {Array<{timestamp:number, type:string, cpu:int, value:number}>} spikeData
|
||||||
|
* @returns {{median:number, p99:number, deltaTail:number}}
|
||||||
|
*/
|
||||||
|
function computeStats(spikeData) {
|
||||||
|
if (!Array.isArray(spikeData) || spikeData.length === 0) {
|
||||||
|
return { median: 0, p99: 0, deltaTail: 0 };
|
||||||
|
}
|
||||||
|
const sorted = [...spikeData].sort((a, b) => a.value - b.value);
|
||||||
|
const n = sorted.length;
|
||||||
|
const median = sorted[Math.floor(n / 2)].value;
|
||||||
|
const p99 = sorted[Math.floor(n * 0.99) - 1 >= 0 ? Math.floor(n * 0.99) - 1 : 0].value;
|
||||||
|
const deltaTail = p99 - median;
|
||||||
|
return { median, p99, deltaTail };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Erstellt oder aktualisiert das Diagramm mit neuen Spikedaten.
|
||||||
|
* @param {Array<{timestamp:number, type:string, cpu:int, value:number}>} spikeData
|
||||||
|
*/
|
||||||
|
function renderSpikeChart(spikeData) {
|
||||||
|
const container = document.getElementById('chart-container');
|
||||||
|
if (!container) return;
|
||||||
|
|
||||||
|
// Falls eine vorhandene Instanz existiert, diese löschen
|
||||||
|
if (chartInstance && typeof chartInstance.destroy === 'function') {
|
||||||
|
chartInstance.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Daten für Chart.js vorbereiten
|
||||||
|
const labels = spikeData.map(d => new Date(d.timestamp).toLocaleTimeString());
|
||||||
|
const values = spikeData.map(d => d.value);
|
||||||
|
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
container.innerHTML = '';
|
||||||
|
container.appendChild(canvas);
|
||||||
|
|
||||||
|
// Chart.js Initialisierung
|
||||||
|
if (window.Chart) {
|
||||||
|
chartInstance = new Chart(canvas.getContext('2d'), {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: labels,
|
||||||
|
datasets: [{
|
||||||
|
label: 'P99 Spike Werte',
|
||||||
|
data: values,
|
||||||
|
borderColor: '#007ACC',
|
||||||
|
backgroundColor: 'rgba(0, 122, 204, 0.2)',
|
||||||
|
fill: true,
|
||||||
|
pointRadius: 2
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
scales: {
|
||||||
|
x: { title: { display: true, text: 'Zeit' } },
|
||||||
|
y: { title: { display: true, text: 'Spike Wert' } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Fallback: einfache Textanzeige
|
||||||
|
const info = document.createElement('div');
|
||||||
|
info.textContent = 'Chart-Komponente nicht verfügbar. Werteanzeige deaktiviert.';
|
||||||
|
container.innerHTML = '';
|
||||||
|
container.appendChild(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
const stats = computeStats(spikeData);
|
||||||
|
updateStatsPanel(stats);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aktualisiert statistische Kennwerte im UI.
|
||||||
|
* @param {{median:number, p99:number, deltaTail:number}} stats
|
||||||
|
*/
|
||||||
|
function updateStatsPanel(stats) {
|
||||||
|
const panel = document.querySelector('.stats-panel');
|
||||||
|
if (!panel) return;
|
||||||
|
|
||||||
|
const medianEl = panel.querySelector('.stat-median');
|
||||||
|
const p99El = panel.querySelector('.stat-p99');
|
||||||
|
const deltaEl = panel.querySelector('.stat-delta');
|
||||||
|
|
||||||
|
if (medianEl) medianEl.textContent = stats.median.toFixed(2);
|
||||||
|
if (p99El) p99El.textContent = stats.p99.toFixed(2);
|
||||||
|
if (deltaEl) deltaEl.textContent = stats.deltaTail.toFixed(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.ui = {
|
||||||
|
renderSpikeChart,
|
||||||
|
updateStatsPanel
|
||||||
|
};
|
||||||
|
})();
|
||||||
Loading…
Reference in a new issue