[AETHER-1278]: Obtain ping DNS averages on modem and adb agents
Change-Id: I58ebd40f192544916843dfd6d5dd60998f2d2f4d
diff --git a/edge-monitoring/agent_adb/edge_monitoring_agent_adb.py b/edge-monitoring/agent_adb/edge_monitoring_agent_adb.py
index af81d5e..9d808b5 100755
--- a/edge-monitoring/agent_adb/edge_monitoring_agent_adb.py
+++ b/edge-monitoring/agent_adb/edge_monitoring_agent_adb.py
@@ -46,7 +46,9 @@
ADB_GET_COMMANDS = {
"apn_mode": "settings get global airplane_mode_on",
"lte_state": "dumpsys telephony.registry | grep -m1 mDataConnectionState",
- "ping_result": "ping -c 3 8.8.8.8&>/dev/null; echo $?"
+ "ping_result": "ping -c 3 8.8.8.8&>/dev/null; echo $?",
+ "ping_dns_result": "ping -c 10 " + "8.8.8.8" +
+ " | tail -1 | awk '{print $4}'"
}
ADB_APN_COMMANDS = {
"home": "input keyevent 3",
@@ -73,6 +75,16 @@
'status': {
'control_plane': None,
'user_plane': 'connected'
+ },
+ 'speedtest': {
+ 'ping': {
+ 'dns': {
+ 'min': None,
+ 'avg': None,
+ 'max': None,
+ 'stddev': None
+ }
+ }
}
}
@@ -138,6 +150,39 @@
return state, None
+def run_ping_test(adb, ip, count):
+ '''
+ Runs the ping test
+ Input: IP to ping, # times to ping
+ Returns: dict of the min/avg/max/stddev numbers from the ping command result
+ '''
+ result = {'min': None,
+ 'avg': None,
+ 'max': None,
+ 'stddev': None}
+ try:
+ commandResult, commandOutput = _run_adb_shell(adb, ADB_GET_COMMANDS['ping_dns_result'])
+ pingResult = commandOutput.split("/")
+ result = {'min': float(pingResult[0]),
+ 'avg': float(pingResult[1]),
+ 'max': float(pingResult[2]),
+ 'stddev': float(pingResult[3])}
+ except Exception as e:
+ logging.error("Ping test failed for " + ip + ": %s", e)
+ return result
+
+
+def get_ping_test(adb):
+ '''
+ Each ping test result saves the min/avg/max/stddev to dict.
+ 1) Performs ping test to Google Public DNS for 10 iterations.
+ 2) # TODO: Performs ping to device on network.
+ '''
+ speedtest_ping = {}
+ speedtest_ping['dns'] = run_ping_test(adb, "8.8.8.8", 10)
+ return speedtest_ping
+
+
def report_aether_network_state():
'''
report the aether network state to the monitoring server
@@ -176,9 +221,11 @@
_run_adb_shell(adb, "svc power stayon true")
cp_state, err = get_control_plane_state(adb)
up_state, err = get_user_plane_state(adb)
+ speedtest_ping = get_ping_test(adb)
edge_status['status']['control_plane'] = cp_state.name
edge_status['status']['user_plane'] = up_state.name
+ edge_status['speedtest']['ping'] = speedtest_ping
report_aether_network_state()
_run_adb_shell(adb, "svc power stayon false")
diff --git a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
index a9a89f0..0744304 100755
--- a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
+++ b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
@@ -22,6 +22,7 @@
import requests
import time
import serial
+import subprocess
from collections import namedtuple
'''
@@ -47,6 +48,16 @@
'status': {
'control_plane': None,
'user_plane': None
+ },
+ 'speedtest': {
+ 'ping': {
+ 'dns': {
+ 'min': None,
+ 'avg': None,
+ 'max': None,
+ 'stddev': None
+ }
+ }
}
}
@@ -175,9 +186,45 @@
return State.connected if resp is 0 else State.disconnected, None
-def report_status(cp_state, up_state):
+def run_ping_test(ip, count):
+ '''
+ Runs the ping test
+ Input: IP to ping, # times to ping
+ Returns: dict of the min/avg/max/stddev numbers from the ping command result
+ '''
+ result = {'min': None,
+ 'avg': None,
+ 'max': None,
+ 'stddev': None}
+ try:
+ pingResult = subprocess.check_output(
+ "ping -c " + str(count) + " " + ip + \
+ " | tail -1 | awk '{print $4}'",
+ shell=True).decode("UTF-8").split("/")
+ result = {'min': float(pingResult[0]),
+ 'avg': float(pingResult[1]),
+ 'max': float(pingResult[2]),
+ 'stddev': float(pingResult[3])}
+ except Exception as e:
+ logging.error("Ping test failed for " + ip + ": %s", e)
+ return result
+
+
+def get_ping_test(modem):
+ '''
+ Each ping test result saves the min/avg/max/stddev to dict.
+ 1) Performs ping test to Google Public DNS for 10 iterations.
+ 2) # TODO: Performs ping to device on network.
+ '''
+ speedtest_ping = {}
+ speedtest_ping['dns'] = run_ping_test("8.8.8.8", 10)
+ return speedtest_ping
+
+
+def report_status(cp_state, up_state, speedtest_ping):
report['status']['control_plane'] = cp_state.name
report['status']['user_plane'] = up_state.name
+ report['speedtest']['ping'] = speedtest_ping
logging.info("Sending report %s", report)
try:
@@ -209,12 +256,13 @@
while True:
cp_state, cp_msg = get_control_plane_state(modem)
up_state, up_msg = get_user_plane_state(modem)
+ speedtest_ping = get_ping_test(modem)
if cp_state is State.error:
logging.error("Modem is in error state.")
sys.exit(1)
- report_status(cp_state, up_state)
+ report_status(cp_state, up_state, speedtest_ping)
time.sleep(CONF.report_interval)
modem.close()