From 4cb78ed86a07c6aad550338536992146b298bb8a Mon Sep 17 00:00:00 2001 From: Sergey Date: Sat, 16 May 2026 15:30:33 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20RTT=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=20Xms?= =?UTF-8?q?=20Yus=20=D0=BE=D1=82=20RouterOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- monitor.py | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/monitor.py b/monitor.py index eb2b349..3489365 100644 --- a/monitor.py +++ b/monitor.py @@ -109,23 +109,42 @@ def mikrotik_ping(api, address: str) -> Optional[float]: }, ) - log.info("DEBUG ping %s raw response: %s", address, results) + def parse_rtt(val) -> Optional[float]: + """Парсит '3ms674us', '2ms', '500us' → миллисекунды (float).""" + if isinstance(val, bytes): + val = val.decode() + val = val.strip() + if not val: + return None + ms, us = 0.0, 0.0 + if "ms" in val: + parts = val.split("ms") + try: + ms = float(parts[0]) + except ValueError: + pass + if len(parts) > 1 and "us" in parts[1]: + try: + us = float(parts[1].replace("us", "")) + except ValueError: + pass + elif "us" in val: + try: + us = float(val.replace("us", "")) + except ValueError: + pass + total = ms + us / 1000.0 + return total if total > 0 else None rtts = [] for row in results: - log.info("DEBUG row: %s", row) - # Пробуем все возможные ключи где может быть rtt - for key in (b"time", b"avg-rtt", b"rtt", b"avg"): - time_val = row.get(key, b"").decode().replace("ms", "").strip() - if time_val: - try: - rtts.append(float(time_val)) - break - except ValueError: - pass + # Берём avg-rtt из последней строки (она накопительная) + rtt = parse_rtt(row.get("avg-rtt", "")) + if rtt is not None: + rtts.append(rtt) if rtts: - return sum(rtts) / len(rtts) + return rtts[-1] # последняя строка содержит финальный avg return None except Exception as exc: