diff --git a/src/netsleuth/models.py b/src/netsleuth/models.py index 0e502ae..1cc3f7d 100644 --- a/src/netsleuth/models.py +++ b/src/netsleuth/models.py @@ -266,7 +266,6 @@ class PingResult: resolved_ip: str | None = None method: str = "none" sent: int = 0 - received: int = 0 loss_pct: float = 0.0 min_ms: float | None = None avg_ms: float | None = None @@ -278,6 +277,10 @@ class PingResult: cv: float | None = None samples: list[float | None] = field(default_factory=list) + @property + def received(self) -> int: + return self.sent - int(round(self.sent * self.loss_pct / 100.0)) + @dataclass class TraceConfig: diff --git a/src/netsleuth/probes/latency.py b/src/netsleuth/probes/latency.py index 1927d24..034a967 100644 --- a/src/netsleuth/probes/latency.py +++ b/src/netsleuth/probes/latency.py @@ -24,7 +24,6 @@ def summarize_ping( resolved_ip=resolved_ip, method=method, sent=s.sent, - received=s.received, loss_pct=s.loss_pct, min_ms=s.min_ms, avg_ms=s.avg_ms, diff --git a/tests/test_exporter.py b/tests/test_exporter.py index 649fd58..d452d90 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -61,7 +61,7 @@ def modules() -> dict[str, ModuleResult]: "latency": ModuleResult( name="latency", status="partial", - data=[PingResult(label="cloudflare-dns", host="1.1.1.1", method="icmp_win", sent=5, received=5)], + data=[PingResult(label="cloudflare-dns", host="1.1.1.1", method="icmp_win", sent=5)], errors=[ProbeError(source="quad9-dns", kind="timeout", message="2s", retryable=True)], warnings=["quad9 did not answer"], duration_ms=1500, @@ -421,14 +421,13 @@ def full_modules() -> dict[str, ModuleResult]: host="1.1.1.1", method="icmp_win", sent=5, - received=5, avg_ms=12.4, min_ms=11.0, max_ms=15.1, jitter_ms=1.9, samples=[11.0, 12.0, None, 15.1, 12.4], ), - PingResult(label="github", host="github.com", method="tcp", sent=5, received=4, loss_pct=20.0, avg_ms=42.0), + PingResult(label="github", host="github.com", method="tcp", sent=5, loss_pct=20.0, avg_ms=42.0), ], duration_ms=2400, ), diff --git a/tests/test_interpret.py b/tests/test_interpret.py index d49520a..d200bf4 100644 --- a/tests/test_interpret.py +++ b/tests/test_interpret.py @@ -45,7 +45,6 @@ def ping(**kw) -> PingResult: resolved_ip="1.1.1.1", method="icmp_dgram", sent=20, - received=20, loss_pct=0.0, min_ms=10.0, avg_ms=12.0, @@ -75,7 +74,7 @@ def test_high_latency_produces_a_warn_finding_with_metric_and_threshold(threshol def test_high_jitter_and_loss_each_produce_their_own_finding(thresholds): - findings = latency_findings([ping(jitter_ms=25.0, loss_pct=5.0, received=19)], thresholds) + findings = latency_findings([ping(jitter_ms=25.0, loss_pct=5.0)], thresholds) ids = sorted(f.id for f in findings) assert ids == ["latency.jitter.cloudflare-dns", "latency.loss.cloudflare-dns"] @@ -89,7 +88,7 @@ def test_tcp_measured_loss_is_labelled_as_connection_failures_not_packet_loss(th def test_a_fully_dead_host_is_critical_regardless_of_bands(thresholds): findings = latency_findings( - [ping(received=0, loss_pct=100.0, avg_ms=None, min_ms=None, max_ms=None, jitter_ms=None)], + [ping(loss_pct=100.0, avg_ms=None, min_ms=None, max_ms=None, jitter_ms=None)], thresholds, ) assert [f.severity for f in findings] == ["crit"] @@ -103,7 +102,7 @@ def test_dual_family_findings_silent_when_no_v6_hosts_present(): def test_dual_family_findings_reports_unreachable_when_every_v6_host_is_dead(): pings = [ ping(), - ping(label="cloudflare-dns-v6", host="2606:4700:4700::1111", received=0, avg_ms=None, loss_pct=100.0), + ping(label="cloudflare-dns-v6", host="2606:4700:4700::1111", avg_ms=None, loss_pct=100.0), ] findings = dual_family_findings(pings) assert [f.id for f in findings] == ["net.ipv6_unreachable"] @@ -507,8 +506,8 @@ def has_cyrillic(text: str) -> bool: def test_latency_findings_carry_russian_siblings(): findings = latency_findings( [ - ping(received=0, loss_pct=100.0, avg_ms=None, min_ms=None, max_ms=None, jitter_ms=None), - ping(avg_ms=130.0, jitter_ms=25.0, loss_pct=5.0, received=19), + ping(loss_pct=100.0, avg_ms=None, min_ms=None, max_ms=None, jitter_ms=None), + ping(avg_ms=130.0, jitter_ms=25.0, loss_pct=5.0), ], thresholds_fixture(), ) diff --git a/tests/test_models.py b/tests/test_models.py index e04b2cb..e21b14a 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -157,7 +157,6 @@ def test_ping_result_round_trips_through_json(): resolved_ip="1.1.1.1", method="icmp_win", sent=20, - received=20, loss_pct=0.0, min_ms=11.0, avg_ms=12.4, diff --git a/tests/test_prefix_benchmark.py b/tests/test_prefix_benchmark.py index e3d560c..751949d 100644 --- a/tests/test_prefix_benchmark.py +++ b/tests/test_prefix_benchmark.py @@ -130,7 +130,6 @@ async def test_benchmark_prefixes_probes_selected_hosts_with_mocked_ping_host(mo resolved_ip=host, method="tcp", sent=count, - received=count, loss_pct=0.0, avg_ms=10.0, ) diff --git a/tests/test_watch.py b/tests/test_watch.py index 16744a7..d453fcd 100644 --- a/tests/test_watch.py +++ b/tests/test_watch.py @@ -24,7 +24,6 @@ def ping(label: str, avg: float | None, loss: float = 0.0) -> PingResult: resolved_ip="1.1.1.1", method="icmp_win", sent=5, - received=5 if avg is not None else 0, loss_pct=loss, avg_ms=avg, jitter_ms=1.5 if avg is not None else None,