fix: парсинг RTT формата Xms Yus от RouterOS
This commit is contained in:
+31
-12
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user