Initial commit
This commit is contained in:
78
trace_analyzer/helpers.py
Normal file
78
trace_analyzer/helpers.py
Normal file
@@ -0,0 +1,78 @@
|
||||
import json
|
||||
from statistics import mean, median
|
||||
|
||||
|
||||
def parse_jsonish(value):
|
||||
"""Parse nested JSON strings until a non-string value is reached."""
|
||||
current = value
|
||||
while isinstance(current, str):
|
||||
text = current.strip()
|
||||
if not text:
|
||||
return current
|
||||
try:
|
||||
current = json.loads(text)
|
||||
except json.JSONDecodeError:
|
||||
return current
|
||||
return current
|
||||
|
||||
|
||||
def safe_int(value, default=0):
|
||||
if value is None or value == "":
|
||||
return default
|
||||
try:
|
||||
return int(value)
|
||||
except (TypeError, ValueError):
|
||||
return default
|
||||
|
||||
|
||||
def safe_float(value, default=0.0):
|
||||
if value is None or value == "":
|
||||
return default
|
||||
try:
|
||||
return float(value)
|
||||
except (TypeError, ValueError):
|
||||
return default
|
||||
|
||||
|
||||
def percentile(values, pct):
|
||||
if not values:
|
||||
return 0.0
|
||||
ordered = sorted(values)
|
||||
if len(ordered) == 1:
|
||||
return float(ordered[0])
|
||||
rank = pct * (len(ordered) - 1)
|
||||
low = int(rank)
|
||||
high = min(low + 1, len(ordered) - 1)
|
||||
fraction = rank - low
|
||||
return ordered[low] + (ordered[high] - ordered[low]) * fraction
|
||||
|
||||
|
||||
def series_stats(values):
|
||||
cleaned = [v for v in values if v is not None]
|
||||
if not cleaned:
|
||||
return {
|
||||
"count": 0,
|
||||
"min": 0,
|
||||
"max": 0,
|
||||
"mean": 0.0,
|
||||
"median": 0.0,
|
||||
"p90": 0.0,
|
||||
}
|
||||
return {
|
||||
"count": len(cleaned),
|
||||
"min": min(cleaned),
|
||||
"max": max(cleaned),
|
||||
"mean": mean(cleaned),
|
||||
"median": median(cleaned),
|
||||
"p90": percentile(cleaned, 0.9),
|
||||
}
|
||||
|
||||
|
||||
def safe_div(numerator, denominator):
|
||||
if not denominator:
|
||||
return 0.0
|
||||
return numerator / denominator
|
||||
|
||||
|
||||
def compact_json(data):
|
||||
return json.dumps(data, ensure_ascii=False, separators=(",", ":"))
|
||||
Reference in New Issue
Block a user