summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorAndrew Gerrand <adg@golang.org>2010-04-05 07:34:27 +1000
committerAndrew Gerrand <adg@golang.org>2010-04-05 07:34:27 +1000
commit90d93daef9205b3792a14eeb2623372ca350c5f9 (patch)
tree6ed91cc7b45382b1c04dd032e0d9bb5663d6df11 /misc
parent56c98e63d8b2a4b63af9a4c2f044a6948d6373e9 (diff)
downloadgolang-90d93daef9205b3792a14eeb2623372ca350c5f9.tar.gz
godashboard: fix benchmarks page (first pass)
R=rsc CC=golang-dev http://codereview.appspot.com/844044
Diffstat (limited to 'misc')
-rw-r--r--misc/dashboard/godashboard/benchmark1.html68
-rw-r--r--misc/dashboard/godashboard/benchmarks.html76
-rw-r--r--misc/dashboard/godashboard/gobuild.py60
3 files changed, 72 insertions, 132 deletions
diff --git a/misc/dashboard/godashboard/benchmark1.html b/misc/dashboard/godashboard/benchmark1.html
index e174b2499..66e9830a2 100644
--- a/misc/dashboard/godashboard/benchmark1.html
+++ b/misc/dashboard/godashboard/benchmark1.html
@@ -1,68 +1,22 @@
<!DOCTYPE HTML>
<html>
<head>
- <title>Go benchmarks</title>
-
- <style>
- h1 {
- font-size: 1em;
- font-weight: bold;
- }
- h2 {
- font-size: 1em;
- font-weight: bold;
- }
- table.alternate {
- white-space: nowrap;
- }
- table.alternate tr td {
- padding-right: 10px;
- }
- table.alternate tr td:last-child {
- padding-right: 0;
- }
- table.alternate tr:nth-child(2n) {
- background-color: #f8f8f8;
- }
- td.revision {
- }
- span.hash {
- font-family: monospace;
- font-size: small;
- color: #aaa;
- }
- span.nodeseq {
- }
- td.user {
- font-size: small;
- }
- td.date {
- color: #aaa;
- font-size: small;
- }
- td.result {
- text-align: center;
- }
- span.ok {
- }
- td.desc {
- font-size: small;
- font-family: sans-serif;
- }
- th.builder {
- font-weight: bold;
- padding-right: 0.5em;
- }
- </style>
+ <title>{{benchmark}} - Benchmarks - Go Dashboard</title>
+ <link rel="stylesheet" type="text/css" href="/static/style.css">
</head>
<body>
- <h1>Go dashboard - {{benchmark}}</h1>
-
- <a href="/">build status</a> <br>
- <a href="/benchmarks">benchmarks</a>
+ <ul class="menu">
+ <li><a href="/">Build Status</a></li>
+ <li><a href="/package">Packages</a></li>
+ <li><a href="/benchmarks">Benchmarks</a></li>
+ <li><a href="http://golang.org/">golang.org</a></li>
+ </ul>
+
+ <h1>Go Dashboard</h1>
<h2>{{benchmark}}</h2>
+
<a href="{{benchmark}}?fmt=json">json</a>
{% for g in graphs %}
diff --git a/misc/dashboard/godashboard/benchmarks.html b/misc/dashboard/godashboard/benchmarks.html
index 044bccc05..14026f5da 100644
--- a/misc/dashboard/godashboard/benchmarks.html
+++ b/misc/dashboard/godashboard/benchmarks.html
@@ -1,62 +1,22 @@
<!DOCTYPE HTML>
<html>
<head>
- <title>Go benchmarks</title>
-
- <style>
- h1 {
- font-size: 1em;
- font-weight: bold;
- }
- h2 {
- font-size: 1em;
- font-weight: bold;
- }
- table.alternate {
- white-space: nowrap;
- }
- table.alternate tr td {
- padding-right: 10px;
- }
- table.alternate tr td:last-child {
- padding-right: 0;
- }
- table.alternate tr:nth-child(2n) {
- background-color: #f8f8f8;
- }
- td.revision {
- }
- span.nodeseq {
- }
- td.user {
- font-size: small;
- }
- td.date {
- color: #aaa;
- font-size: small;
- }
- td.result {
- text-align: center;
- }
- span.ok {
- }
- td.desc {
- font-size: small;
- font-family: sans-serif;
- }
- th.builder {
- font-weight: bold;
- padding-right: 0.5em;
- }
- </style>
+ <title>Benchmarks - Go Dashboard</title>
+ <link rel="stylesheet" type="text/css" href="/static/style.css">
</head>
<body>
- <h1>Go dashboard - benchmarks</h1>
-
- <a href="/">build status</a>
+ <ul class="menu">
+ <li><a href="/">Build Status</a></li>
+ <li><a href="/package">Packages</a></li>
+ <li>Benchmarks</li>
+ <li><a href="http://golang.org/">golang.org</a></li>
+ </ul>
+ <h1>Go Dashboard</h1>
+
<h2>Benchmarks</h2>
+
<table class="alternate" cellpadding="0" cellspacing="0">
<tr>
<th></th>
@@ -65,15 +25,17 @@
{% endfor %}
</tr>
- {% for m in benchmarks %}
+ {% for bm in rows %}
<tr>
- <td class="name"><a href="/benchmarks/{{m.name}}">{{m.name}}</a></td>
+ <td class="name"><a href="/benchmarks/{{bm.name}}">{{bm.name}}</a></td>
- {% for b in m.builds %}
+ {% for bl in bm.builders %}
<td class="result">
- {% if b.url %}
- <img src="{{b.url}}&chs=80x20&chf=bg,s,00000000&chco=000000ff&chls=1,1,0">
- {% endif %}
+ {% if bl.url %}
+ <img src="{{bl.url}}" />
+ {% else %}
+ <img src="/benchmarks/single?benchmark={{bm.name}}&builder={{bl.name}}" />
+ {% endif %}
</td>
{% endfor %}
</tr>
diff --git a/misc/dashboard/godashboard/gobuild.py b/misc/dashboard/godashboard/gobuild.py
index 2dfba433b..58c7cd196 100644
--- a/misc/dashboard/godashboard/gobuild.py
+++ b/misc/dashboard/godashboard/gobuild.py
@@ -388,25 +388,20 @@ class Benchmarks(webapp.RequestHandler):
def compute(self, num):
benchmarks, builders = benchmark_list()
-
- # Build empty grid, to be filled in.
- rows = [{"name": bm, "builds": [{"url": ""} for b in builders]} for bm in benchmarks]
- for i in range(len(rows)):
- benchmark = benchmarks[i]
- builds = rows[i]["builds"]
- minr, maxr, bybuilder = benchmark_data(benchmark)
- for j in range(len(builders)):
- builder = builders[j]
- cell = builds[j]
- if len(bybuilder) > 0 and builder == bybuilder[0][0]:
- cell["url"] = benchmark_sparkline(bybuilder[0][2])
- bybuilder = bybuilder[1:]
+ rows = []
+ for bm in benchmarks:
+ row = {'name':bm, 'builders': []}
+ for bl in builders:
+ key = "single-%s-%s" % (bm, bl)
+ url = memcache.get(key)
+ row['builders'].append({'name': bl, 'url': url})
+ rows.append(row)
path = os.path.join(os.path.dirname(__file__), 'benchmarks.html')
data = {
- "benchmarks": rows,
- "builders": [builderInfo(b) for b in builders]
+ "builders": [builderInfo(b) for b in builders],
+ "rows": rows,
}
return template.render(path, data)
@@ -464,6 +459,34 @@ class Benchmarks(webapp.RequestHandler):
self.response.set_status(200)
+class SingleBenchmark(webapp.RequestHandler):
+ """
+ Fetch data for single benchmark/builder combination
+ and return sparkline url as HTTP redirect, also set memcache entry.
+ """
+ def get(self):
+ benchmark = self.request.get('benchmark')
+ builder = self.request.get('builder')
+ key = "single-%s-%s" % (benchmark, builder)
+
+ url = memcache.get(key)
+
+ if url is None:
+ minr, maxr, bybuilder = benchmark_data(benchmark)
+ for bb in bybuilder:
+ if bb[0] != builder:
+ continue
+ url = benchmark_sparkline(bb[2])
+
+ if url is None:
+ self.response.set_status(500, "No data found")
+ return
+
+ memcache.set(key, url, 700) # slightly longer than bench timeout
+
+ self.response.set_status(302)
+ self.response.headers.add_header("Location", url)
+
def node(num):
q = Commit.all()
q.filter('num =', num)
@@ -535,19 +558,19 @@ def benchmark_sparkline(ns):
# Encoding is 0-61, which is fine enough granularity for our tiny graphs. _ means missing.
encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
s = ''.join([x < 0 and "_" or encoding[int((len(encoding)-1)*x/m)] for x in ns])
- url = "http://chart.apis.google.com/chart?cht=ls&chd=s:"+s
+ url = "http://chart.apis.google.com/chart?cht=ls&chd=s:"+s+"&chs=80x20&chf=bg,s,00000000&chco=000000ff&chls=1,1,0"
return url
def benchmark_list():
q = BenchmarkResults.all()
q.order('__key__')
q.filter('builder = ', u'darwin-amd64')
- benchmarks = [r.benchmark for r in q.fetch(1000)]
+ benchmarks = [r.benchmark for r in q]
q = BenchmarkResults.all()
q.order('__key__')
q.filter('benchmark =', u'math_test.BenchmarkSqrt')
- builders = [r.builder for r in q.fetch(100)]
+ builders = [r.builder for r in q.fetch(20)]
return benchmarks, builders
@@ -682,6 +705,7 @@ application = webapp.WSGIApplication(
('/init', Init),
('/build', Build),
('/benchmarks', Benchmarks),
+ ('/benchmarks/single', SingleBenchmark),
('/benchmarks/.*', GetBenchmarks),
], debug=True)