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: