eBPF_Write_Hooks_Analysis/results_visualization/js/dataProcessor.js

71 lines
2.1 KiB
JavaScript

/* js/dataProcessor.js
* Verantwortlich für Transformierung der eBPF Analyse-Rohdaten
* in darstellungsfähige Strukturen (Diagramme & Tabellen)
*/
/**
* Verknüpft write_pre und write_post Events anhand derselben corr_id.
* @param {Array<{corr_id: string, type: string, timestamp: number, details: object}>} rawData
* @returns {Array<{corr_id: string, pre: object|null, post: object|null, duration: number|null}>}
*/
export function aggregatePrePostPairs(rawData) {
if (!Array.isArray(rawData)) return [];
const grouped = new Map();
for (const event of rawData) {
if (!event?.corr_id || !event?.type) continue;
const group = grouped.get(event.corr_id) ?? { corr_id: event.corr_id, pre: null, post: null, duration: null };
if (event.type === 'write_pre') {
group.pre = event;
} else if (event.type === 'write_post') {
group.post = event;
}
grouped.set(event.corr_id, group);
}
const pairs = [];
for (const [, pair] of grouped) {
if (pair.pre && pair.post) {
pair.duration = pair.post.timestamp - pair.pre.timestamp;
}
pairs.push(pair);
}
return pairs;
}
/**
* Berechnet Kennzahlen wie mittlere Dauer, Eventanzahl pro Typ.
* @param {Array<{corr_id: string, pre: object|null, post: object|null, duration: number|null}>} aggregatedEvents
* @returns {{totalEvents: number, counts: Record<string, number>, meanDuration: number|null}}
*/
export function computeStats(aggregatedEvents) {
if (!Array.isArray(aggregatedEvents)) return { totalEvents: 0, counts: {}, meanDuration: null };
const counts = { write_pre: 0, write_post: 0, read: 0 };
let totalDuration = 0;
let validDurations = 0;
let totalEvents = 0;
aggregatedEvents.forEach(entry => {
if (entry.pre) counts.write_pre++;
if (entry.post) counts.write_post++;
totalEvents++;
if (typeof entry.duration === 'number' && !isNaN(entry.duration)) {
totalDuration += entry.duration;
validDurations++;
}
});
const meanDuration = validDurations > 0 ? totalDuration / validDurations : null;
return {
totalEvents,
counts,
meanDuration
};
}