diff --git a/server/website/website/static/js/timeline.js b/server/website/website/static/js/timeline.js index a2b00f2..c45636c 100644 --- a/server/website/website/static/js/timeline.js +++ b/server/website/website/static/js/timeline.js @@ -58,6 +58,10 @@ function renderPlot(data, div_id) { }, cursor: {show: true, zoom:true, showTooltip:false, clickReset:true} }; + if (data.print_metric.endsWith("DB Time")) { + plotoptions.axes.yaxis.max = 20000; + } + //Render plot $.jqplot(div_id + '_plot', plotdata, plotoptions); } diff --git a/server/website/website/templates/project_sessions.html b/server/website/website/templates/project_sessions.html index 44e3785..9c8344a 100644 --- a/server/website/website/templates/project_sessions.html +++ b/server/website/website/templates/project_sessions.html @@ -11,22 +11,22 @@ {{ labels.name }} {{ labels.dbms }} - {{ labels.hardware }} - {{ labels.tuning_session }} + {{ labels.description }} + {{ labels.result_count }} {{ labels.algorithm }} - {{ labels.last_update }} + {% for session in sessions %} {{ session.name }} {{ session.dbms.full_name }} - {{ session.hardware }} - {{ session.session_type_name }} + {{ session.description }} + {{ session.result_count }} {{ session.algorithm_name }} - {{ session.last_update }} + {% endfor %} diff --git a/server/website/website/templates/result.html b/server/website/website/templates/result.html index 9fb7b5d..f12a114 100644 --- a/server/website/website/templates/result.html +++ b/server/website/website/templates/result.html @@ -16,6 +16,18 @@
{{ labels.creation_time }}
{{ result.creation_time }} + +
{{ labels.observation_start_time }}
+ {{ result.observation_start_time }} + + +
{{ labels.observation_end_time }}
+ {{ result.observation_end_time }} + + +
{{ labels.observation_time }} seconds
+ {{ obs_fmt }} +
{{ labels.session }}
{{ result.session.name }} diff --git a/server/website/website/views.py b/server/website/website/views.py index 070d4f7..e1a49eb 100644 --- a/server/website/website/views.py +++ b/server/website/website/views.py @@ -197,7 +197,7 @@ def delete_project(request): @login_required(login_url=reverse_lazy('login')) def project_sessions_view(request, project_id): - sessions = Session.objects.filter(project=project_id) + sessions = Session.objects.filter(project=project_id).order_by('-name') project = Project.objects.get(pk=project_id) form_labels = Session.get_labels() form_labels.update(LabelUtil.style_labels({ @@ -205,9 +205,12 @@ def project_sessions_view(request, project_id): 'button_create': 'create a new session', })) form_labels['title'] = "Your Sessions" + form_labels['description'] = "description" + form_labels['result_count'] = "# result" for session in sessions: session.session_type_name = Session.TUNING_OPTIONS[session.tuning_session] session.algorithm_name = AlgorithmType.name(session.algorithm) + session.result_count = len(Result.objects.filter(session=session)) context = { "sessions": sessions, @@ -276,7 +279,7 @@ def session_view(request, project_id, session_id): 'workloads': workloads, 'results_per_page': [10, 50, 100, 500, 1000], 'default_dbms': session.dbms.key, - 'default_results_per_page': 10, + 'default_results_per_page': 1000, 'default_equidistant': "on", 'default_workload': default_workload, 'defaultspe': default_confs, @@ -439,6 +442,12 @@ def result_view(request, project_id, session_id, result_id): LOG.exception("Failed to format the next config (type=%s): %s.\n\n%s\n", type(cfg), cfg, e) + obs_fmt = target.observation_time + if obs_fmt > 60: + obs_fmt = '{} minutes'.format(round(obs_fmt / 60., 1)) + else: + obs_fmt = '{} seconds'.format(int(obs_fmt)) + form_labels = Result.get_labels() form_labels.update(LabelUtil.style_labels({ 'status': 'status', @@ -453,7 +462,8 @@ def result_view(request, project_id, session_id, result_id): 'next_conf': next_conf, 'labels': form_labels, 'project_id': project_id, - 'session_id': session_id + 'session_id': session_id, + 'obs_fmt': obs_fmt, } return render(request, 'result.html', context) @@ -1059,7 +1069,6 @@ def download_debug_info(request, project_id, session_id): # pylint: disable=unu return response -@login_required(login_url=reverse_lazy('login')) def download_objectives(request, project_id, session_id): # pylint: disable=unused-argument session = Session.objects.get(pk=session_id) response = HttpResponse(content_type='text/csv') @@ -1067,9 +1076,13 @@ def download_objectives(request, project_id, session_id): # pylint: disable=unu writer = csv.writer(response) objectives = target_objectives.get_all(session.dbms.pk) + requested_metrics = ['global.dba_hist_osstat.iowait_time', 'global.dba_hist_osstat.busy_time', + 'global.dba_hist_sys_time_model.db cpu'] labels = ['id'] for objective_name in objectives.keys(): labels.append(objective_name) + for metric_name in requested_metrics: + labels.append(metric_name) writer.writerow(labels) metric_files = MetricData.objects.filter(session=session) row_cnt = 0 @@ -1079,6 +1092,8 @@ def download_objectives(request, project_id, session_id): # pylint: disable=unu row_data = [str(row_cnt)] for objective_name in objectives.keys(): row_data.append(metric_data.get(objective_name, -1)) + for metric_name in requested_metrics: + row_data.append(metric_data.get(metric_name, -1)) writer.writerow(row_data) row_cnt += 1 return response @@ -1457,6 +1472,22 @@ def alt_get_info(request, name): # pylint: disable=unused-argument info['hostname'] = socket.gethostname() info['git_commit_hash'] = utils.git_hash() msg = "Successfully retrieved info for '{}'.".format(name) + elif name == 'sessions': + sessions = Session.objects.filter() + for session in sessions: + if 'notuning' in session.name: + continue + results = Result.objects.filter(session=session) + if len(results) < 30: + continue + session_info = {} + session_info['name'] = session.name + session_info['project'] = session.project.pk + session_info['algorithm'] = session.name.split('_')[-2] + session_info['target_objective'] = session.target_objective + session_info['knob_count'] = int(session.name.split('_')[-1]) + session_info['vm'] = session.name.split('_')[-3] + info[session.pk] = session_info elif name in app_models.__dict__ and hasattr(app_models.__dict__[name], 'objects'): data = {k: v[0] for k, v in request.POST.lists()} require_exists = data.pop('require_exists', False) @@ -1639,6 +1670,7 @@ def alt_create_or_edit_session(request): session_knobs = data.pop('session_knobs', None) disable_others = data.pop('disable_others', False) hyperparams = data.pop('hyperparameters', None) + description = data.pop('description', None) return_ddpg_model = data.pop('return_ddpg_model', False) ts = now() @@ -1697,6 +1729,9 @@ def alt_create_or_edit_session(request): session_knobs = JSONUtil.loads(session_knobs) SessionKnob.objects.set_knob_min_max_tunability( session, session_knobs, disable_others=disable_others) + if description is not None: + session.description = description + session.save() if hyperparams: hyperparams = JSONUtil.loads(hyperparams)