Add results_visualization/js/dataProcessor.js
This commit is contained in:
parent
ee1effbb89
commit
a06e985674
1 changed files with 71 additions and 0 deletions
71
results_visualization/js/dataProcessor.js
Normal file
71
results_visualization/js/dataProcessor.js
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
/* 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
|
||||
};
|
||||
}
|
||||
Loading…
Reference in a new issue