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 = []
|
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user