summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/monit_device/monit_device.py148
1 files changed, 87 insertions, 61 deletions
diff --git a/tools/monit_device/monit_device.py b/tools/monit_device/monit_device.py
index e3c7300..f1de310 100644
--- a/tools/monit_device/monit_device.py
+++ b/tools/monit_device/monit_device.py
@@ -17,36 +17,41 @@ KBPS = (1 * 1000)
G_JSON_PATH = '/var/run/mrzcpd/mrmonit.daemon'
-TITLE_VECTOR = ['PhyRXFrame','PhyRXBits','PhyRXMissed','PhyRXError',
- 'PhyRXNoBUF','PhyTXFrame','PhyTXBits','PhyTXError',
+TITLE_VECTOR = ['PhyRXFrame', 'PhyRXBits', 'PhyRXMissed', 'PhyRXError',
+ 'PhyRXNoBUF', 'PhyTXFrame', 'PhyTXBits', 'PhyTXError',
'UsrRXDrops', 'UsrTXDrops']
-TITLE_MAP = { 'PhyRXFrame' : 'ipackets',
- 'PhyRXBits' : 'ibytes',
- 'PhyRXMissed' : 'imissed',
- 'PhyRXError' : 'ierrors',
- 'PhyRXNoBUF' : 'rxnombuf',
- 'PhyTXFrame' : 'opackets',
- 'PhyTXBits' : 'obytes',
- 'PhyTXError' : 'oerrors',
- 'UsrRXDrops' : 'userrxdrop',
- 'UsrTXDrops' : 'usertxdrop'
- }
+TITLE_MAP = {'PhyRXFrame': 'ipackets',
+ 'PhyRXBits': 'ibytes',
+ 'PhyRXMissed': 'imissed',
+ 'PhyRXError': 'ierrors',
+ 'PhyRXNoBUF': 'rxnombuf',
+ 'PhyTXFrame': 'opackets',
+ 'PhyTXBits': 'obytes',
+ 'PhyTXError': 'oerrors',
+ 'UsrRXDrops': 'userrxdrop',
+ 'UsrTXDrops': 'usertxdrop'
+ }
+
def locate_vector_by_symbol(vector, symbol):
return [s for s in vector if s['symbol'] == symbol]
+
def list_all_phydev(json_fp):
- return [ s['symbol'] for s in json_fp['device']]
+ return [s['symbol'] for s in json_fp['device']]
+
def phydev_value_read(json_fp, str_device, str_item):
phydevs = locate_vector_by_symbol(json_fp['device'], str_device)
return phydevs[0]['stats']['accumulative'][str_item]
+
def phydev_speed_read(json_fp, str_device, str_item):
phydevs = locate_vector_by_symbol(json_fp['device'], str_device)
return phydevs[0]['stats']['speed'][str_item]
+
def trans_to_human_readable(value):
if value > TBPS:
return value * 1.0 / TBPS, 'T'
@@ -59,12 +64,13 @@ def trans_to_human_readable(value):
return value * 1.0, ' '
-def dump_human_table(json_fp, devsym, is_human_number = 0):
+
+def dump_human_table(json_fp, devsym, is_human_number=0):
print('\nTime: %s, Physical device: %s' % (time.strftime('%c'), devsym))
- table_phydev = prettytable.PrettyTable([' '] + TITLE_VECTOR,
- vertical_char=' ',horizontal_char = '-', junction_char=' ')
+ table_phydev = prettytable.PrettyTable([' '] + TITLE_VECTOR,
+ vertical_char=' ', horizontal_char='-', junction_char=' ')
ValueList = ['Accumulative']
SpeedList = ['Per Second']
@@ -95,48 +101,52 @@ def dump_human_table(json_fp, devsym, is_human_number = 0):
print(table_phydev)
# APM sendlog format
-def dump_apm_sendlog(json_fp, telegraf_client, devsym):
- __metric_dict_speed = {}
- __metric_dict_value = {}
- __tags = {'device' : devsym }
- for item in TITLE_VECTOR:
- value = phydev_speed_read(json_fp, devsym, TITLE_MAP[item])
- __metric_dict_speed[item] = value
-
+def dump_apm_sendlog(json_fp, telegraf_client, devsym, lasttime_metrics):
+
+ thistime_metrics = {}
+ delta_metrics = {}
+
+ __tags = {'device': devsym}
+
for item in TITLE_VECTOR:
value = phydev_value_read(json_fp, devsym, TITLE_MAP[item])
- __metric_dict_value[item] = value
+ thistime_metrics[item] = value
+
+ for item in TITLE_VECTOR:
+ delta_metrics[item] = thistime_metrics[item] - \
+ lasttime_metrics.get(item, 0)
+
+ telegraf_client.metric('mr4_device_rxtx_value', delta_metrics, tags=__tags)
+ return thistime_metrics
- telegraf_client.metric('mr4_device_rxtx_speed', __metric_dict_speed, tags = __tags)
- telegraf_client.metric('mr4_device_rxtx_value', __metric_dict_value, tags = __tags)
- return
def setup_argv_parser(phydev_list):
parser = argparse.ArgumentParser(description='Marsio ZeroCopy Tools -- Monitor NIC devices',
- version = 'Marsio ZeroCopy Tools Suite 4.1')
-
- parser.add_argument('-t', '--time', help = 'interval, seconds to wait between updates',
- type=int, default = 1)
- parser.add_argument('-l', '--loop', help = 'print loop, exit when recv a signal',
- action='store_true', default = 0)
- parser.add_argument('-H', '--human-readable', help = 'print value in human readable format',
- action = 'store_true', default = 0)
- parser.add_argument('-i', '--interface', help = 'the name of network interface',
- action = 'append', choices=phydev_list)
- parser.add_argument('--clear-screen', help = 'clear screen at start of loop',
- action='store_true', default = 0)
+ version='Marsio ZeroCopy Tools Suite 4.1')
+
+ parser.add_argument('-t', '--time', help='interval, seconds to wait between updates',
+ type=int, default=1)
+ parser.add_argument('-l', '--loop', help='print loop, exit when recv a signal',
+ action='store_true', default=0)
+ parser.add_argument('-H', '--human-readable', help='print value in human readable format',
+ action='store_true', default=0)
+ parser.add_argument('-i', '--interface', help='the name of network interface',
+ action='append', choices=phydev_list)
+ parser.add_argument('--clear-screen', help='clear screen at start of loop',
+ action='store_true', default=0)
# APM sendlog options
- parser.add_argument('--sendlog-apm', help = 'send log to apm server',
- action='store_true', default = 0)
- parser.add_argument('--sendlog-apm-cfg', help = 'send log configure file',
- type=str, default = '/opt/mrzcpd/etc/mrsendlog.conf')
-
+ parser.add_argument('--sendlog-apm', help='send log to apm server',
+ action='store_true', default=0)
+ parser.add_argument('--sendlog-apm-cfg', help='send log configure file',
+ type=str, default='/opt/mrzcpd/etc/mrsendlog.conf')
+
return parser.parse_args()
+
def phydev_json_load():
with open(G_JSON_PATH) as json_fp:
return json.load(json_fp)
@@ -144,7 +154,7 @@ def phydev_json_load():
def sendlog_hostname(test_hostname, test_port):
import socket
-
+
hostname = socket.gethostname()
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
@@ -157,6 +167,7 @@ def sendlog_hostname(test_hostname, test_port):
return hostname, local_ip_addr
+
def sendlog_apm_init(r_option):
import ConfigParser
import urllib
@@ -170,22 +181,30 @@ def sendlog_apm_init(r_option):
url_host, url_port = urllib.splitport(url_host)
hostname, local_ip_addr = sendlog_hostname(url_host, url_port)
- sendlog_tags = {'host' : hostname, 'local_ip_addr': local_ip_addr}
-
+ sendlog_tags = {'host': hostname, 'local_ip_addr': local_ip_addr}
+
if url_proto == 'udp':
- telegraf_client = telegraf.TelegrafClient(host = url_host,
- port = int(url_port), tags = sendlog_tags)
+ telegraf_client = telegraf.TelegrafClient(host=url_host,
+ port=int(url_port), tags=sendlog_tags)
elif url_proto == 'http':
- telegraf_client = telegraf.HttpClient(host = url_host,
- port = int(url_port), tags = sendlog_tags)
+ telegraf_client = telegraf.HttpClient(host=url_host,
+ port=int(url_port), tags=sendlog_tags)
+
+ try:
+ send_interval = config.get('sendlog_apm', 'apm_send_interval')
+ except:
+ send_interval = 5
+
+ return telegraf_client, send_interval
- return telegraf_client
def sigint_handler(handler, frame):
sys.exit(0)
+
def main():
signal.signal(signal.SIGINT, sigint_handler)
+ lasttime_metrics_dict = {}
try:
json_fp = phydev_json_load()
@@ -193,7 +212,9 @@ def main():
r_option = setup_argv_parser(phydev_list)
if r_option.sendlog_apm:
- telegraf_client = sendlog_apm_init(r_option)
+ telegraf_client, sleep_interval = sendlog_apm_init(r_option)
+ else:
+ sleep_interval = r_option.time
phydev_user_list = phydev_list if r_option.interface is None else r_option.interface
@@ -204,16 +225,20 @@ def main():
json_fp = phydev_json_load()
if r_option.sendlog_apm:
- for devsym in phydev_user_list:
- dump_apm_sendlog(json_fp, telegraf_client, devsym)
+ for devsym in phydev_user_list:
+ last_metrics = lasttime_metrics_dict.get(devsym, {})
+ this_metrics = dump_apm_sendlog(
+ json_fp, telegraf_client, devsym, last_metrics)
+ lasttime_metrics_dict[devsym] = this_metrics
+
else:
- for devsym in phydev_user_list:
- dump_human_table(json_fp, devsym, r_option.human_readable)
+ for devsym in phydev_user_list:
+ dump_human_table(json_fp, devsym, r_option.human_readable)
if not r_option.loop:
break
- time.sleep(r_option.time)
+ time.sleep(float(sleep_interval))
except KeyboardInterrupt:
pass
@@ -224,5 +249,6 @@ def main():
return 0
+
if __name__ == '__main__':
- main() \ No newline at end of file
+ main()