chore(perception): trace Python GC pauses

This commit is contained in:
DCCONSTRUCTIONS
2026-08-25 18:38:33 +03:00
parent a0152f371e
commit d1e6e42cf4
2 changed files with 127 additions and 28 deletions
+23 -3
View File
@@ -1,15 +1,14 @@
from __future__ import annotations
import importlib.util
import time
from pathlib import Path
from k1link.perception.detector import DetectorFrameTiming
from k1link.perception.recorded_source import DecodedFrameTiming
REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
RUNNER_PATH = (
REPOSITORY_ROOT / "experiments/perception/run_m48s_reference_graph_shadow_worker.py"
)
RUNNER_PATH = REPOSITORY_ROOT / "experiments/perception/run_m48s_reference_graph_shadow_worker.py"
SPEC = importlib.util.spec_from_file_location("m48s_timed_shadow_runner", RUNNER_PATH)
assert SPEC is not None and SPEC.loader is not None
RUNNER = importlib.util.module_from_spec(SPEC)
@@ -81,3 +80,24 @@ def test_pipeline_timing_metrics_preserve_single_pass_stage_breakdown() -> None:
assert metrics["graph_unattributed_ms"]["maximum"] == 6.0
assert metrics["maximum_graph_sequence"] == 3
assert metrics["additional_inference_passes"] == 0
def test_gc_pause_telemetry_attributes_collection_to_active_stage() -> None:
telemetry = RUNNER.GcPauseTelemetry()
telemetry.enter_stage("rolling", 3928)
telemetry._observe("start", {"generation": 2})
time.sleep(0.001)
telemetry._observe(
"stop",
{"generation": 2, "collected": 17, "uncollectable": 0},
)
telemetry.exit_stage()
summary = RUNNER._gc_telemetry_summary(telemetry.events)
assert summary["event_count"] == 1
assert summary["pipeline_attributed_event_count"] == 1
assert summary["maximum_event"]["generation"] == 2
assert summary["maximum_event"]["stage_id"] == "rolling"
assert summary["maximum_event"]["sequence"] == 3928
assert summary["maximum_event"]["duration_ms"] >= 1.0