[llvm-commits] [LNT] r161813 - in /lnt/trunk/lnt/server/ui: static/v4_global_status.css templates/v4_global_status.html templates/v4_overview.html views.py
Michael Gottesman
mgottesman at apple.com
Mon Aug 13 17:25:56 PDT 2012
Author: mgottesman
Date: Mon Aug 13 19:25:56 2012
New Revision: 161813
URL: http://llvm.org/viewvc/llvm-project?rev=161813&view=rev
Log:
[LNT] Commit of initial version of global status page.
This page shows the performance change of all tests on all machines from the previous day against a particular baseline.
Added:
lnt/trunk/lnt/server/ui/static/v4_global_status.css
lnt/trunk/lnt/server/ui/templates/v4_global_status.html
Modified:
lnt/trunk/lnt/server/ui/templates/v4_overview.html
lnt/trunk/lnt/server/ui/views.py
Added: lnt/trunk/lnt/server/ui/static/v4_global_status.css
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/static/v4_global_status.css?rev=161813&view=auto
==============================================================================
--- lnt/trunk/lnt/server/ui/static/v4_global_status.css (added)
+++ lnt/trunk/lnt/server/ui/static/v4_global_status.css Mon Aug 13 19:25:56 2012
@@ -0,0 +1,47 @@
+
+table#data-table tr {
+ width: 100%;
+}
+
+table#data-table th {
+ outline: rgba(0, 0, 0, 0.3) solid 1px;
+}
+
+/* Turn off text select */
+table#data-table {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+ margin-right: 10px;
+ cursor: default;
+}
+
+table#data-table td {
+ border: rgba(0, 0, 0, 0.3) solid 1px;
+}
+
+table#data-table td.data-cell, table#data-table th {
+ text-align: center;
+}
+
+table#data-table td.data-cell, table#data-table th.data-header {
+ min-width: 15em;
+ max-width: 15em;
+ width: 15em;
+}
+
+table#data-table td.row-head {
+ min-width: 30em;
+ max-width: 30em;
+ width: 30em;
+}
+
+table#data-table th.label-header {
+ width: auto;
+}
+
+table#data-table td.row-head {
+ text-align: left;
+ overflow: hidden;
+}
Added: lnt/trunk/lnt/server/ui/templates/v4_global_status.html
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/templates/v4_global_status.html?rev=161813&view=auto
==============================================================================
--- lnt/trunk/lnt/server/ui/templates/v4_global_status.html (added)
+++ lnt/trunk/lnt/server/ui/templates/v4_global_status.html Mon Aug 13 19:25:56 2012
@@ -0,0 +1,37 @@
+{% import "v4_utils.html" as v4_utils %}
+{% import "utils.html" as utils %}
+
+{% extends "layout.html" %}
+{% set components = [(ts.name, v4_url_for("v4_global_status"))] %}
+{% block head %}
+ <link type="text/css" rel="stylesheet"
+ href="{{ url_for('.static', filename='v4_global_status.css') }}"></link>
+ <script async src="{{ url_for('.static', filename='popup.js') }}"></script>
+ <script async src="{{ url_for('.static', filename='sorttable.js') }}"></script>
+{% endblock %}
+
+{% block title %}Global Status - {{
+ selected_field.name.replace("_", " ").title() }}{% endblock %}
+
+{% block body %}
+<table id="data-table" class="sortable_rev">
+ <tr id="data-table-header">
+ <th class="label-header">Test</th>
+ <th id="worst-time-header" class="data-header worst-time">Worst Time</th>
+ {% for m in machines %}
+ <th class="data-header">{{ m.name }}</th>
+ {% endfor %}
+ </tr>
+ {% for row in tests %}
+ <tr>
+ <td class="row-head">
+ {{ row[0] }}
+ </td>
+ {{ row[1]|aspctcell("data-cell worst-time")|safe }}
+ {% for cr in row[2:] %}
+ {{ cr.pct_delta|aspctcell("data-cell worst-time")|safe }}
+ {% endfor %}
+ </tr>
+ {% endfor %}
+</table>
+{% endblock %}
Modified: lnt/trunk/lnt/server/ui/templates/v4_overview.html
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/templates/v4_overview.html?rev=161813&r1=161812&r2=161813&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/templates/v4_overview.html (original)
+++ lnt/trunk/lnt/server/ui/templates/v4_overview.html Mon Aug 13 19:25:56 2012
@@ -5,6 +5,10 @@
{% block title %}Overview{% endblock %}
{% block body %}
+<center><h3>Compiler Status Pages</h3></center>
+<a href="{{ v4_url_for('v4_global_status', field=2) }}">Compile Time</a>
+<a href="{{ v4_url_for('v4_global_status', field=3) }}">Execution Time</a>
+
{# Find recent runs. #}
<center><h3>Submission Overview</h3></center>
<table width="100%%">
Modified: lnt/trunk/lnt/server/ui/views.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/views.py?rev=161813&r1=161812&r2=161813&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/views.py (original)
+++ lnt/trunk/lnt/server/ui/views.py Mon Aug 13 19:25:56 2012
@@ -3,6 +3,9 @@
import re
import tempfile
import time
+import csv
+import cStringIO
+import json
import flask
from flask import abort
@@ -14,6 +17,8 @@
from flask import request
from flask import url_for
+import sqlalchemy.sql
+
import lnt.util
import lnt.util.ImportData
import lnt.util.stats
@@ -21,6 +26,7 @@
import lnt.server.reporting.analysis
import lnt.server.reporting.runs
from lnt.server.ui.decorators import frontend, db_route, v4_route
+import lnt.server.ui.util
###
# Root-Only Routes
@@ -492,7 +498,7 @@
errorbar_data = []
points_data = []
pts = []
-
+
# Create region of interest for run data region if
# we are performing a comparison.
if compare_to:
@@ -502,7 +508,7 @@
convert_revision(start_rev),
convert_revision(end_rev)
)
-
+
if normalize_by_median:
normalize_by = 1.0/stats.median([min(values)
for _,values in data])
@@ -572,14 +578,14 @@
style = "new Graph2D_LinePlotStyle(2, %r)" % (reglin_col,)
graph_plots.append("graph.addPlot([%s], %s);" % (
pts,style))
-
- # If we are comparing two revisions,
+
+ # If we are comparing two revisions,
if compare_to:
reg_col = [0.0, 0.0, 1.0]
graph_plots.append("graph.addPlot([%i, %i],%s);" % (
revision_range_region[0], revision_range_region[1],
"new Graph2D_RangePlotStyle(%r)" % reg_col))
-
+
# Add the points plot, if used.
if points_data:
pts_col = (0,0,0)
@@ -623,6 +629,97 @@
return redirect(v4_url_for("v4_daily_report",
year=date.year, month=date.month, day=date.day))
+ at v4_route("/global_status")
+def v4_global_status():
+ from lnt.server.ui import util
+
+ ts = request.get_testsuite()
+
+ # Get the latest run.
+ latest = ts.query(ts.Run.start_time).\
+ order_by(ts.Run.start_time.desc()).first()
+
+ # If we found an entry, use that.
+ if latest is not None:
+ latest_date, = latest
+ else:
+ # Otherwise, just use today.
+ latest_date = datetime.date.today()
+
+ # Create a datetime for the day before the most recent run.
+ yesterday = latest_date - datetime.timedelta(days=1)
+
+ # Get the revision number for a nondefault baseline if we
+ # are given one.
+ revision = ts.Machine.DEFAULT_BASELINE_REVISION
+ field = ts.Sample.get_primary_fields().next()
+
+ # Get the list of all runs we might be interested in.
+ recent_runs = ts.query(ts.Run).filter(ts.Run.start_time > yesterday).all()
+
+ # Aggregate the runs by machine.
+ recent_runs_by_machine = util.multidict()
+ for run in recent_runs:
+ recent_runs_by_machine[run.machine] = run
+
+ # Get a sorted list of recent machines.
+ recent_machines = sorted(recent_runs_by_machine.keys(),
+ key=lambda m: m.name)
+
+ # For each machine, build a table of the machine, the baseline run, and the
+ # most recent run. We also computed a list of all the runs we are reporting
+ # over.
+ machine_run_info = []
+ reported_run_ids = []
+ for machine in recent_machines:
+ runs = recent_runs_by_machine[machine]
+
+ # Get the baseline run for this machine.
+ baseline = machine.get_baseline_run(revision)
+
+ # Choose the "best" run to report on. We want the most recent one with
+ # the most recent order.
+ run = max(runs, key=lambda r: (r.order, r.start_time))
+
+ machine_run_info.append((baseline, run))
+ reported_run_ids.append(baseline.id)
+ reported_run_ids.append(run.id)
+
+ # Get the set all tests reported in the recent runs.
+ reported_tests = ts.query(ts.Test.id, ts.Test.name).filter(
+ sqlalchemy.sql.exists('*', sqlalchemy.sql.and_(
+ ts.Sample.run_id.in_(reported_run_ids),
+ ts.Sample.test_id == ts.Test.id))).all()
+
+ # Load all of the runs we are interested in.
+ runinfo = lnt.server.reporting.analysis.RunInfo(ts, reported_run_ids)
+
+ # Build the test matrix. This is a two dimensional table index by
+ # (machine-index, test-index), where each entry is the percent change.
+ test_table = []
+ for i,(test_id,test_name) in enumerate(reported_tests):
+ # Create the row, starting with the test name and worst entry.
+ row = [test_name, None]
+
+ # Compute comparison results for each machine.
+ row.extend(runinfo.get_run_comparison_result(run, baseline, test_id,
+ field)
+ for baseline,run in machine_run_info)
+
+ # Compute the worst cell value.
+ row[1] = max(cr.pct_delta
+ for cr in row[2:])
+
+ test_table.append(row)
+
+ # Order the table by worst regression.
+ test_table.sort(key = lambda row: row[1], reverse=True)
+
+ return render_template("v4_global_status.html",
+ ts=ts,
+ tests=test_table,
+ machines=recent_machines,
+ selected_field=field)
@v4_route("/daily_report/<int:year>/<int:month>/<int:day>")
def v4_daily_report(year, month, day):
More information about the llvm-commits
mailing list