blob: d1ba6f2578869663e07147f4f777ad3fb0313e90 [file] [log] [blame]
Brad Bishop6e60e8b2018-02-01 10:27:11 -05001<!DOCTYPE html>
2<html lang="en">
3<head>
4{# Scripts, for visualization#}
5<!--START-OF-SCRIPTS-->
6<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
7<script type="text/javascript">
8google.charts.load('current', {'packages':['corechart']});
9var chartsDrawing = 0;
10</script>
11
12{# Render measurement result charts #}
13{% for test in test_data %}
14 {% if test.status == 'SUCCESS' %}
15 {% for measurement in test.measurements %}
16 {% set chart_elem_id = test.name + '_' + measurement.name + '_chart' %}
17 {% include 'measurement_chart.html' %}
18 {% endfor %}
19 {% endif %}
20{% endfor %}
21
22<!--END-OF-SCRIPTS-->
23
24{# Styles #}
25<style>
26.meta-table {
27 font-size: 14px;
28 text-align: left;
29 border-collapse: collapse;
30}
31.meta-table tr:nth-child(even){background-color: #f2f2f2}
32meta-table th, .meta-table td {
33 padding: 4px;
34}
35.summary {
36 margin: 0;
37 font-size: 14px;
38 text-align: left;
39 border-collapse: collapse;
40}
41summary th, .meta-table td {
42 padding: 4px;
43}
44.measurement {
45 padding: 8px 0px 8px 8px;
46 border: 2px solid #f0f0f0;
47 margin-bottom: 10px;
48}
49.details {
50 margin: 0;
51 font-size: 12px;
52 text-align: left;
53 border-collapse: collapse;
54}
55.details th {
Brad Bishop6e60e8b2018-02-01 10:27:11 -050056 padding-right: 8px;
57}
Brad Bishopd7bf8c12018-02-25 22:55:05 -050058.details.plain th {
59 font-weight: normal;
60}
Brad Bishop6e60e8b2018-02-01 10:27:11 -050061.preformatted {
62 font-family: monospace;
63 white-space: pre-wrap;
64 background-color: #f0f0f0;
65 margin-left: 10px;
66}
67hr {
68 color: #f0f0f0;
69}
70h2 {
71 font-size: 20px;
72 margin-bottom: 0px;
73 color: #707070;
74}
75h3 {
76 font-size: 16px;
77 margin: 0px;
78 color: #707070;
79}
80</style>
81
82<title>{{ title }}</title>
83</head>
84
85{% macro poky_link(commit) -%}
86 <a href="http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?id={{ commit }}">{{ commit[0:11] }}</a>
87{%- endmacro %}
88
89<body><div style="width: 700px">
90 {# Test metadata #}
91 <h2>General</h2>
92 <hr>
93 <table class="meta-table" style="width: 100%">
94 <tr>
95 <th></th>
96 <th>Current commit</th>
97 <th>Comparing with</th>
98 </tr>
99 {% for key, item in metadata.items() %}
100 <tr>
101 <th>{{ item.title }}</th>
102 {%if key == 'commit' %}
103 <td>{{ poky_link(item.value) }}</td>
104 <td>{{ poky_link(item.value_old) }}</td>
105 {% else %}
106 <td>{{ item.value }}</td>
107 <td>{{ item.value_old }}</td>
108 {% endif %}
109 </tr>
110 {% endfor %}
111 </table>
112
113 {# Test result summary #}
114 <h2>Test result summary</h2>
115 <hr>
116 <table class="summary" style="width: 100%">
117 {% for test in test_data %}
118 {% if loop.index is even %}
119 {% set row_style = 'style="background-color: #f2f2f2"' %}
120 {% else %}
121 {% set row_style = 'style="background-color: #ffffff"' %}
122 {% endif %}
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500123 {% if test.status == 'SUCCESS' %}
124 {% for measurement in test.measurements %}
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500125 <tr {{ row_style }}>
126 {% if loop.index == 1 %}
127 <td>{{ test.name }}: {{ test.description }}</td>
128 {% else %}
129 {# add empty cell in place of the test name#}
130 <td></td>
131 {% endif %}
132 {% if measurement.absdiff > 0 %}
133 {% set result_style = "color: red" %}
134 {% elif measurement.absdiff == measurement.absdiff %}
135 {% set result_style = "color: green" %}
136 {% else %}
137 {% set result_style = "color: orange" %}
138 {%endif %}
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800139 {% if measurement.reldiff|abs > 2 %}
140 {% set result_style = result_style + "; font-weight: bold" %}
141 {% endif %}
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500142 <td>{{ measurement.description }}</td>
143 <td style="font-weight: bold">{{ measurement.value.mean }}</td>
144 <td style="{{ result_style }}">{{ measurement.absdiff_str }}</td>
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800145 <td style="{{ result_style }}">{{ measurement.reldiff_str }}</td>
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500146 </tr>
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500147 {% endfor %}
148 {% else %}
149 <td style="font-weight: bold; color: red;">{{test.status }}</td>
150 <td></td> <td></td> <td></td> <td></td>
151 {% endif %}
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500152 {% endfor %}
153 </table>
154
155 {# Detailed test results #}
156 {% for test in test_data %}
157 <h2>{{ test.name }}: {{ test.description }}</h2>
158 <hr>
159 {% if test.status == 'SUCCESS' %}
160 {% for measurement in test.measurements %}
161 <div class="measurement">
162 <h3>{{ measurement.description }}</h3>
163 <div style="font-weight:bold;">
164 <span style="font-size: 23px;">{{ measurement.value.mean }}</span>
165 <span style="font-size: 20px; margin-left: 12px">
166 {% if measurement.absdiff > 0 %}
167 <span style="color: red">
168 {% elif measurement.absdiff == measurement.absdiff %}
169 <span style="color: green">
170 {% else %}
171 <span style="color: orange">
172 {% endif %}
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800173 {{ measurement.absdiff_str }} ({{measurement.reldiff_str}})
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500174 </span></span>
175 </div>
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500176 {# Table for trendchart and the statistics #}
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500177 <table style="width: 100%">
178 <tr>
179 <td style="width: 75%">
180 {# Linechart #}
181 <div id="{{ test.name }}_{{ measurement.name }}_chart"></div>
182 </td>
183 <td>
184 {# Measurement statistics #}
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500185 <table class="details plain">
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500186 <tr>
187 <th>Test runs</th><td>{{ measurement.value.sample_cnt }}</td>
188 </tr><tr>
189 <th>-/+</th><td>-{{ measurement.value.minus }} / +{{ measurement.value.plus }}</td>
190 </tr><tr>
191 <th>Min</th><td>{{ measurement.value.min }}</td>
192 </tr><tr>
193 <th>Max</th><td>{{ measurement.value.max }}</td>
194 </tr><tr>
195 <th>Stdev</th><td>{{ measurement.value.stdev }}</td>
196 </tr><tr>
197 <th><div id="{{ test.name }}_{{ measurement.name }}_chart_png"></div></th>
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500198 <td></td>
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500199 </tr>
200 </table>
201 </td>
202 </tr>
203 </table>
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500204
205 {# Task and recipe summary from buildstats #}
206 {% if 'buildstats' in measurement %}
207 Task resource usage
208 <table class="details" style="width:100%">
209 <tr>
210 <th>Number of tasks</th>
211 <th>Top consumers of cputime</th>
212 </tr>
213 <tr>
214 <td style="vertical-align: top">{{ measurement.buildstats.tasks.count }} ({{ measurement.buildstats.tasks.change }})</td>
215 {# Table of most resource-hungry tasks #}
216 <td>
217 <table class="details plain">
218 {% for diff in measurement.buildstats.top_consumer|reverse %}
219 <tr>
220 <th>{{ diff.pkg }}.{{ diff.task }}</th>
221 <td>{{ '%0.0f' % diff.value2 }} s</td>
222 </tr>
223 {% endfor %}
224 </table>
225 </td>
226 </tr>
227 <tr>
228 <th>Biggest increase in cputime</th>
229 <th>Biggest decrease in cputime</th>
230 </tr>
231 <tr>
232 {# Table biggest increase in resource usage #}
233 <td>
234 <table class="details plain">
235 {% for diff in measurement.buildstats.top_increase|reverse %}
236 <tr>
237 <th>{{ diff.pkg }}.{{ diff.task }}</th>
238 <td>{{ '%+0.0f' % diff.absdiff }} s</td>
239 </tr>
240 {% endfor %}
241 </table>
242 </td>
243 {# Table biggest decrease in resource usage #}
244 <td>
245 <table class="details plain">
246 {% for diff in measurement.buildstats.top_decrease %}
247 <tr>
248 <th>{{ diff.pkg }}.{{ diff.task }}</th>
249 <td>{{ '%+0.0f' % diff.absdiff }} s</td>
250 </tr>
251 {% endfor %}
252 </table>
253 </td>
254 </tr>
255 </table>
256
257 {# Recipe version differences #}
258 {% if measurement.buildstats.ver_diff %}
259 <div style="margin-top: 16px">Recipe version changes</div>
260 <table class="details">
261 {% for head, recipes in measurement.buildstats.ver_diff.items() %}
262 <tr>
263 <th colspan="2">{{ head }}</th>
264 </tr>
265 {% for name, info in recipes|sort %}
266 <tr>
267 <td>{{ name }}</td>
268 <td>{{ info }}</td>
269 </tr>
270 {% endfor %}
271 {% endfor %}
272 </table>
273 {% else %}
274 <div style="margin-top: 16px">No recipe version changes detected</div>
275 {% endif %}
276 {% endif %}
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500277 </div>
278 {% endfor %}
279 {# Unsuccessful test #}
280 {% else %}
281 <span style="font-size: 150%; font-weight: bold; color: red;">{{ test.status }}
282 {% if test.err_type %}<span style="font-size: 75%; font-weight: normal">({{ test.err_type }})</span>{% endif %}
283 </span>
284 <div class="preformatted">{{ test.message }}</div>
285 {% endif %}
286 {% endfor %}
287</div></body>
288</html>
289