Add trace_analysis/src/trace_analysis/core.py
This commit is contained in:
parent
10556bd97e
commit
6c4d7d2436
1 changed files with 57 additions and 0 deletions
57
trace_analysis/src/trace_analysis/core.py
Normal file
57
trace_analysis/src/trace_analysis/core.py
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import json
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any, List
|
||||
|
||||
|
||||
def analyze_spikes(event_log: str) -> Dict[str, Any]:
|
||||
"""Analysiert eBPF-Eventdaten und ermittelt Häufigkeit und Muster von Performance-Spitzen.
|
||||
|
||||
Es wird erwartet, dass die JSON-Datei eine Liste von Eventobjekten enthält, z. B.:
|
||||
[{"timestamp": "2024-01-01T12:00:00Z", "migration_type": "fully_pinned", "latency": 3.2}, ...]
|
||||
|
||||
Ein Spike wird angenommen, wenn das Feld 'latency' einen Schwellenwert überschreitet.
|
||||
Rückgabe: Dictionary mit Feldern migration_type, timestamp, spike_count.
|
||||
"""
|
||||
path = Path(event_log)
|
||||
if not path.exists() or not path.is_file():
|
||||
raise FileNotFoundError(f"Event log not found: {event_log}")
|
||||
|
||||
try:
|
||||
with path.open("r", encoding="utf-8") as f:
|
||||
events = json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
raise ValueError(f"Invalid JSON in event log: {e}")
|
||||
|
||||
if not isinstance(events, list):
|
||||
raise ValueError("Event log must contain a JSON array of event objects.")
|
||||
|
||||
spike_threshold = 2.0 # einfache Heuristik in Millisekunden
|
||||
spike_summary: Dict[str, int] = {}
|
||||
|
||||
for ev in events:
|
||||
if not isinstance(ev, dict):
|
||||
continue
|
||||
mig_type = ev.get("migration_type")
|
||||
latency = ev.get("latency")
|
||||
if mig_type is None or not isinstance(mig_type, str):
|
||||
continue
|
||||
if isinstance(latency, (int, float)) and latency > spike_threshold:
|
||||
spike_summary[mig_type] = spike_summary.get(mig_type, 0) + 1
|
||||
|
||||
if not spike_summary:
|
||||
# Keine Spikes gefunden – Rückgabe mit leeren Zählern
|
||||
return {
|
||||
"migration_type": None,
|
||||
"timestamp": datetime.utcnow().isoformat() + "Z",
|
||||
"spike_count": 0,
|
||||
}
|
||||
|
||||
# Nimmt den meistbetroffenen Migrationstyp
|
||||
top_type = max(spike_summary, key=spike_summary.get)
|
||||
report = {
|
||||
"migration_type": top_type,
|
||||
"timestamp": datetime.utcnow().isoformat() + "Z",
|
||||
"spike_count": spike_summary[top_type],
|
||||
}
|
||||
return report
|
||||
Loading…
Reference in a new issue