diff --git a/atdb_statistics/atdb_plot.py b/atdb_statistics/atdb_plot.py index a95ce42d006292f37743461f3014050361af5f3e..45b3ca603cb65ba4f4152f6f131fb1078c53a278 100644 --- a/atdb_statistics/atdb_plot.py +++ b/atdb_statistics/atdb_plot.py @@ -223,7 +223,7 @@ def do_speed_plot(title, y_axis_title, subtitle, annotate, datapoints): :return: """ - print('do_speed_plot()') + #print('do_speed_plot()') fig = plt.figure(figsize=(12,6)) #fig, ax = plt.subplots() @@ -243,7 +243,8 @@ def do_speed_plot(title, y_axis_title, subtitle, annotate, datapoints): observing_y = [] ingesting_x = [] ingesting_y = [] - + ingest_error_x = [] + ingest_error_y = [] i = 0 for datapoint in datapoints: @@ -254,8 +255,8 @@ def do_speed_plot(title, y_axis_title, subtitle, annotate, datapoints): observing_y.append(datapoint['speed_bps']) # plot start and end points - plt.plot(datapoint['timestamp'], datapoint['speed_bps'], 'r.', - datapoint['timestamp_end'], datapoint['speed_bps'], 'r.') + plt.plot(datapoint['timestamp'], datapoint['speed_bps'], 'b.', + datapoint['timestamp_end'], datapoint['speed_bps'], 'b.') if annotate is not None: plt.text(datapoint['timestamp'], datapoint['speed_bps'], datapoint[annotate]+'...', rotation='vertical', fontsize=8) @@ -271,17 +272,28 @@ def do_speed_plot(title, y_axis_title, subtitle, annotate, datapoints): if annotate is not None: plt.text(datapoint['timestamp'], datapoint['speed_bps'], datapoint[annotate]+'...', rotation='vertical', fontsize=8) + + if datapoint['type'] == 'ingest_error': + ingest_error_x.append(datapoint['timestamp']) + ingest_error_x.append(datapoint['speed_bps']) + + plt.plot(datapoint['timestamp'], datapoint['speed_bps'], 'r.') + if annotate is not None: + plt.text(datapoint['timestamp'], datapoint['speed_bps'], datapoint[annotate] + '...', + rotation='vertical', fontsize=8) + # plot lines # connect a line for i in range(0,len(observing_x),2): - plt.plot(observing_x[i:i + 2], observing_y[i:i + 2], 'r:') + plt.plot(observing_x[i:i + 2], observing_y[i:i + 2], 'b:') for i in range(0,len(ingesting_x),2): plt.plot(ingesting_x[i:i + 2], ingesting_y[i:i + 2], 'g-') # legend - plt.plot(observing_x[i:i + 2], observing_y[i:i + 2], 'r:',label='Observing') + plt.plot(observing_x[i:i + 2], observing_y[i:i + 2], 'b:',label='Observing') plt.plot(ingesting_x[i:i + 2], ingesting_y[i:i + 2], 'g-',label='Ingesting') + #plt.plot(ingest_error_x[i:i], 'r.',label='ingest error') plt.legend(loc='upper right') plt.show() diff --git a/atdb_stats.py b/atdb_stats.py index 26e8b6c4ae1b07c3ac421f815fe97cac4c1fca25..82b2af0929e6df695b0c4d9f1f8f4486953ecff6 100644 --- a/atdb_stats.py +++ b/atdb_stats.py @@ -21,6 +21,7 @@ import os import sys import datetime +import time import plotly import requests @@ -47,6 +48,21 @@ ALTA_API_PROD = "https://alta.astron.nl/altapi" TIME_FORMAT = "%Y-%m-%d %H:%M" #--- common functions --- +# this is a decorator that can be put in front (around) a function all to measure its execution time +def timeit(method): + def timed(*args, **kw): + ts = time.time() + result = method(*args, **kw) + te = time.time() + if 'log_time' in kw: + name = kw.get('log_name', method.__name__.upper()) + kw['log_time'][name] = int((te - ts) * 1000) + else: + print('execution time: %r %2.2f ms' % \ + (method.__name__, (te - ts) * 1000)) + return result + return timed + def isCalibrator(name): """ check if the provided name is in the (hardcoded) list of defined Apertif Calibrators @@ -244,8 +260,8 @@ def do_sky(args, starttime, endtime): connection.close() print('Database connection closed.') - -def do_ingest_speeds(args, starttime, endtime, plot_engine='plotly'): +@timeit +def do_ingest_speeds(args): # The request header ATDB_HEADER = { @@ -255,9 +271,6 @@ def do_ingest_speeds(args, starttime, endtime, plot_engine='plotly'): } # input parameters - starttime = datetime.datetime.strptime(args.starttime, '%Y-%m-%d %H:%M') - endtime = datetime.datetime.strptime(args.endtime, '%Y-%m-%d %H:%M') - url = args.atdb_host + "/times?" + str(args.query) @@ -289,7 +302,7 @@ def do_ingest_speeds(args, starttime, endtime, plot_engine='plotly'): datapoint['timestamp_end'] = timestamp + datetime.timedelta(seconds=result['duration']) datapoint['speed_bps'] = result['write_speed'] * 8 / 1000 datapoints.append(datapoint) - print(datapoint) + #print(datapoint) if result['ingest_speed'] is not None: datapoint = {} @@ -302,8 +315,20 @@ def do_ingest_speeds(args, starttime, endtime, plot_engine='plotly'): datapoint['timestamp_end'] = timestamp + datetime.timedelta(seconds=result['ingest_duration']) datapoint['speed_bps'] = result['ingest_speed'] * 8 / 1000 datapoints.append(datapoint) + + prev_ingest_speed = datapoint['speed_bps'] # print(datapoint) + if result['timestamp_ingest_error'] is not None: + datapoint = {} + datapoint['taskid'] = result['taskID'] + nofrag,frag = result['timestamp_ingest_error'].split('.') + timestamp = datetime.datetime.strptime(nofrag, '%Y-%m-%dT%H:%M:%S') + datapoint['timestamp'] = timestamp + datapoint['type'] = 'ingest_error' + datapoint['speed_bps'] = prev_ingest_speed + datapoints.append(datapoint) + sorted_datapoints = sorted(datapoints, key=lambda k: k['timestamp']) # plot the results @@ -496,7 +521,7 @@ def main(): do_sky(args, starttime, endtime) elif presentation=="ingest_speed": - do_ingest_speeds(args, starttime, endtime) + do_ingest_speeds(args) if args.remote_post_command != None: execute_remote_command(args.atdb_host, args.remote_post_command) diff --git a/data/ingest_speed_imaging.args b/data/ingest_speed_imaging.args index e94892c6a3ef0a39e97ceb3a09d9ea1c66cf3b1a..b65bcd45e2383246bae339ddec78bdc3b9b6ebe1 100644 --- a/data/ingest_speed_imaging.args +++ b/data/ingest_speed_imaging.args @@ -1,11 +1,10 @@ --presentation=ingest_speed ---atdb_host=http://192.168.22.22/atdb +--atdb_host=http://atdb.astron.nl/atdb --title=I/O speeds on wcudata1 from ATDB --observing_mode=imaging --y_axis_title=I/O Speed in Gbps --starttime=2019-06-08 00:00 --endtime=2019-06-09 00:00 --query=taskID__contains=190608 ---query=starttime__gt=2019-06-07T00:00:00Z&starttime__lt=2019-06-10T00:00:00Z ---annotate=taskid +--query=starttime__gt=2019-06-06T00:00:00Z&starttime__lt=2019-06-11T00:00:00Z --plot_engine=mathplotlib \ No newline at end of file diff --git a/data/ingest_speed_test_system.args b/data/ingest_speed_test_system.args new file mode 100644 index 0000000000000000000000000000000000000000..f8adc65b9c0787373ca5a75f3a5c65c52470cb61 --- /dev/null +++ b/data/ingest_speed_test_system.args @@ -0,0 +1,10 @@ +--presentation=ingest_speed +--atdb_host=http://atdb-test/atdb +--title=I/O speeds on wcudata1 from ATDB +--observing_mode=imaging +--y_axis_title=I/O Speed in Gbps +--starttime=2019-06-08 00:00 +--endtime=2019-06-09 00:00 +--query=taskID__contains=190608 +--query=starttime__gt=2019-05-01T00:00:00Z&starttime__lt=2019-05-02T00:00:00Z +--plot_engine=mathplotlib \ No newline at end of file diff --git a/data/ingest_speed_today_prod.args b/data/ingest_speed_today_prod.args new file mode 100644 index 0000000000000000000000000000000000000000..77aa669fb9f84a598ccb08e6326a3ccaff57dbaa --- /dev/null +++ b/data/ingest_speed_today_prod.args @@ -0,0 +1,7 @@ +--presentation=ingest_speed +--atdb_host=http://atdb.astron.nl/atdb +--title=I/O speeds on wcudata1 from ATDB +--y_axis_title=I/O Speed in Gbps +--query=taskID__contains=190608 +--query=starttime__gt=2019-06-09T00:00:00Z&starttime__lt=2019-06-13T00:00:00Z +--plot_engine=mathplotlib diff --git a/data/ingest_speed_today_vm.args b/data/ingest_speed_today_vm.args new file mode 100644 index 0000000000000000000000000000000000000000..ab15f524b6f961fa91a57157af59b366245658e4 --- /dev/null +++ b/data/ingest_speed_today_vm.args @@ -0,0 +1,6 @@ +--presentation=ingest_speed +--atdb_host=http://192.168.22.22/atdb +--title=I/O speeds on wcudata1 from ATDB +--y_axis_title=I/O Speed in Gbps +--query=taskID__contains=190607 +--plot_engine=mathplotlib