Add trace_analysis/src/trace_analysis/core.py
This commit is contained in:
commit
3ff2cc3c32
1 changed files with 75 additions and 0 deletions
75
trace_analysis/src/trace_analysis/core.py
Normal file
75
trace_analysis/src/trace_analysis/core.py
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
import statistics
|
||||||
|
from typing import Dict, Any, List
|
||||||
|
|
||||||
|
|
||||||
|
def analyze_trace(trace_data: Dict[str, Any]) -> Dict[str, Any]:
|
||||||
|
"""Analysiert Trace-Daten auf CPU-Migrationen, Reorder-Score und potenzielle Anomalien.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
trace_data (dict): Enthält Trace-Events, die jeweils timestamp, cpu_path, reorder_score
|
||||||
|
und mixed_snapshot_signature_count umfassen.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: Analyseergebnis mit Statistiken und Identifikation möglicher Anomalien.
|
||||||
|
"""
|
||||||
|
events: List[Dict[str, Any]] = trace_data.get("events", [])
|
||||||
|
|
||||||
|
if not events:
|
||||||
|
return {
|
||||||
|
"cpu_switch_count": 0,
|
||||||
|
"reorder_score": {"mean": None, "stdev": None, "max": None},
|
||||||
|
"mixed_snapshot_sum": 0,
|
||||||
|
"anomalies": []
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu_switch_count = 0
|
||||||
|
reorder_scores: List[float] = []
|
||||||
|
mixed_snapshot_sum = 0
|
||||||
|
anomalies: List[Dict[str, Any]] = []
|
||||||
|
|
||||||
|
last_cpu = None
|
||||||
|
|
||||||
|
for ev in events:
|
||||||
|
cpu = ev.get("cpu_path")
|
||||||
|
reorder = ev.get("reorder_score", 0.0)
|
||||||
|
mixed_sig = ev.get("mixed_snapshot_signature_count", 0)
|
||||||
|
|
||||||
|
if last_cpu is not None and cpu != last_cpu:
|
||||||
|
cpu_switch_count += 1
|
||||||
|
last_cpu = cpu
|
||||||
|
|
||||||
|
if isinstance(reorder, (int, float)):
|
||||||
|
reorder_scores.append(reorder)
|
||||||
|
if reorder > 0.8: # heuristische Anomalieschwelle
|
||||||
|
anomalies.append({
|
||||||
|
"timestamp": ev.get("timestamp"),
|
||||||
|
"issue": "High reorder score",
|
||||||
|
"score": reorder
|
||||||
|
})
|
||||||
|
|
||||||
|
if isinstance(mixed_sig, int):
|
||||||
|
mixed_snapshot_sum += mixed_sig
|
||||||
|
if mixed_sig > 5:
|
||||||
|
anomalies.append({
|
||||||
|
"timestamp": ev.get("timestamp"),
|
||||||
|
"issue": "High mixed snapshot signature count",
|
||||||
|
"count": mixed_sig
|
||||||
|
})
|
||||||
|
|
||||||
|
if reorder_scores:
|
||||||
|
mean_r = statistics.mean(reorder_scores)
|
||||||
|
stdev_r = statistics.stdev(reorder_scores) if len(reorder_scores) > 1 else 0.0
|
||||||
|
max_r = max(reorder_scores)
|
||||||
|
else:
|
||||||
|
mean_r = stdev_r = max_r = None
|
||||||
|
|
||||||
|
return {
|
||||||
|
"cpu_switch_count": cpu_switch_count,
|
||||||
|
"reorder_score": {
|
||||||
|
"mean": mean_r,
|
||||||
|
"stdev": stdev_r,
|
||||||
|
"max": max_r
|
||||||
|
},
|
||||||
|
"mixed_snapshot_sum": mixed_snapshot_sum,
|
||||||
|
"anomalies": anomalies
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue