diff options
| -rw-r--r-- | tools/monit_device/monit_device.py | 148 |
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() |
