53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
|
|
"""Unit tests for the Atlas availability publisher."""
|
||
|
|
|
||
|
|
import importlib.util
|
||
|
|
import json
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
|
||
|
|
def load_module():
|
||
|
|
"""Load the service-owned rollup module without packaging it."""
|
||
|
|
path = (
|
||
|
|
Path(__file__).resolve().parents[2]
|
||
|
|
/ "services/monitoring/scripts/availability_rollup.py"
|
||
|
|
)
|
||
|
|
spec = importlib.util.spec_from_file_location("availability_rollup", path)
|
||
|
|
module = importlib.util.module_from_spec(spec)
|
||
|
|
assert spec.loader is not None
|
||
|
|
spec.loader.exec_module(module)
|
||
|
|
return module
|
||
|
|
|
||
|
|
|
||
|
|
def test_parse_export_deduplicates_replay_boundaries() -> None:
|
||
|
|
"""Keep only the final value when replay chunks share a timestamp."""
|
||
|
|
mod = load_module()
|
||
|
|
lines = [
|
||
|
|
(json.dumps({"timestamps": [1000, 2000], "values": [2, 3]}) + "\n").encode(),
|
||
|
|
(json.dumps({"timestamps": [2000, 3000], "values": [3, 5]}) + "\n").encode(),
|
||
|
|
]
|
||
|
|
|
||
|
|
assert mod.parse_export(lines) == {1000: 2.0, 2000: 3.0, 3000: 5.0}
|
||
|
|
|
||
|
|
|
||
|
|
def test_calculate_availability_uses_all_server_failures() -> None:
|
||
|
|
"""Calculate one bounded successful-request ratio."""
|
||
|
|
mod = load_module()
|
||
|
|
|
||
|
|
assert mod.calculate_availability(1000, 2) == pytest.approx(0.998)
|
||
|
|
with pytest.raises(ValueError):
|
||
|
|
mod.calculate_availability(0, 0)
|
||
|
|
with pytest.raises(ValueError):
|
||
|
|
mod.calculate_availability(100, -1)
|
||
|
|
|
||
|
|
|
||
|
|
def test_render_metric_publishes_only_the_request_v4_series() -> None:
|
||
|
|
"""Render the single series selected by the Grafana panel."""
|
||
|
|
mod = load_module()
|
||
|
|
|
||
|
|
assert mod.render_metric(0.9995, 1234) == (
|
||
|
|
'atlas:availability:ratio_365d{definition="request-v4",scope="atlas",'
|
||
|
|
'rollup="yearly"} 0.999500000000 1234\n'
|
||
|
|
)
|