Add artifact_3_retry_tail_analysis/src/artifact_3_retry_tail_analysis/core.py
This commit is contained in:
parent
137034cedf
commit
fb1d6cc370
1 changed files with 66 additions and 0 deletions
|
|
@ -0,0 +1,66 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from statistics import quantiles
|
||||||
|
from typing import Dict, Any
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
|
||||||
|
class InputValidationError(Exception):
|
||||||
|
"""Raised when input data does not meet expected structure."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_input(data: Dict[str, Any]) -> None:
|
||||||
|
"""Validate that input data contain retriable latency samples or 'retry_tail_p99'."""
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
raise InputValidationError("Expected a dict input.")
|
||||||
|
if 'retry_tail_p99' in data:
|
||||||
|
val = data['retry_tail_p99']
|
||||||
|
if not isinstance(val, (int, float)):
|
||||||
|
raise InputValidationError("'retry_tail_p99' must be numeric.")
|
||||||
|
elif 'retries' in data:
|
||||||
|
if not isinstance(data['retries'], (list, tuple)):
|
||||||
|
raise InputValidationError("'retries' must be list or tuple of numbers.")
|
||||||
|
else:
|
||||||
|
raise InputValidationError("Input missing 'retry_tail_p99' or 'retries'.")
|
||||||
|
|
||||||
|
|
||||||
|
def _extract_tail_p99(data: Dict[str, Any]) -> float:
|
||||||
|
"""Extract or compute retry_tail_p99 from the provided data dict."""
|
||||||
|
if 'retry_tail_p99' in data:
|
||||||
|
return float(data['retry_tail_p99'])
|
||||||
|
retries = data.get('retries', [])
|
||||||
|
if not retries:
|
||||||
|
raise InputValidationError("Cannot compute retry_tail_p99 from empty retries list.")
|
||||||
|
series = pd.Series(retries, dtype='float64')
|
||||||
|
return float(series.quantile(0.99))
|
||||||
|
|
||||||
|
|
||||||
|
def analyze_retry_tails(data_enforced: Dict[str, Any], data_randomized: Dict[str, Any]) -> Dict[str, float]:
|
||||||
|
"""Vergleicht Retry-Tail-Werte zwischen zwei Datenquellen für 'affinity enforced' und 'affinity off'-Modi.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
data_enforced: Retry-Daten im Affinitätsmodus (pinned).
|
||||||
|
data_randomized: Retry-Daten im Randomized-Modus (affinity off).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: Ergebnisse mit Kennzahlen wie `retry_tail_p99_enforced`, `retry_tail_p99_randomized`,
|
||||||
|
und Differenz `delta_retry_tail_p99`.
|
||||||
|
"""
|
||||||
|
_validate_input(data_enforced)
|
||||||
|
_validate_input(data_randomized)
|
||||||
|
|
||||||
|
enforced_p99 = _extract_tail_p99(data_enforced)
|
||||||
|
randomized_p99 = _extract_tail_p99(data_randomized)
|
||||||
|
|
||||||
|
result = {
|
||||||
|
'retry_tail_p99_enforced': enforced_p99,
|
||||||
|
'retry_tail_p99_randomized': randomized_p99,
|
||||||
|
'delta_retry_tail_p99': enforced_p99 - randomized_p99
|
||||||
|
}
|
||||||
|
|
||||||
|
# CI sanity check assertions
|
||||||
|
assert isinstance(result['retry_tail_p99_enforced'], float)
|
||||||
|
assert isinstance(result['retry_tail_p99_randomized'], float)
|
||||||
|
return result
|
||||||
Loading…
Reference in a new issue