fix: парсинг RTT формата Xms Yus от RouterOS

This commit is contained in:
2026-05-16 15:30:33 +07:00
parent 3cc4be2209
commit 4cb78ed86a
+31 -12
View File
@@ -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 = [] rtts = []
for row in results: for row in results:
log.info("DEBUG row: %s", row) # Берём avg-rtt из последней строки (она накопительная)
# Пробуем все возможные ключи где может быть rtt rtt = parse_rtt(row.get("avg-rtt", ""))
for key in (b"time", b"avg-rtt", b"rtt", b"avg"): if rtt is not None:
time_val = row.get(key, b"").decode().replace("ms", "").strip() rtts.append(rtt)
if time_val:
try:
rtts.append(float(time_val))
break
except ValueError:
pass
if rtts: if rtts:
return sum(rtts) / len(rtts) return rtts[-1] # последняя строка содержит финальный avg
return None return None
except Exception as exc: except Exception as exc: