[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
Thu Aug 23 22:31:14 PDT 2012
Response to comments:
On Aug 16, 2012, at 10:15 AM, Daniel Dunbar <daniel at zuster.org> wrote:
> Awesome!
>
> Some comments inline (and apologies if they get fixed up in later
> commits, I am FIFO)...
>
> On Mon, Aug 13, 2012 at 5:25 PM, Michael Gottesman <mgottesman at apple.com> wrote:
>> 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 %}
>
> We should move the title computation into a property on the field
> object (.title), which eventually should become metadata.
Fixed in r162537.
>
>> +{% 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>
>
> This shouldn't hard code field names or IDs. This is only going to be
> right for one kind of test suite, and that can change.
This was removed in the overview page rewrite.
>
>> {# 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 = []
>> -
>> +
>
> Please try and commit whitespace changes in independent code
> separately, they make content-ful patches harder to read.
Ok.
>
> - Daniel
>
>> # 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):
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list