summaryrefslogtreecommitdiffstats
path: root/scripts/lib/build_perf/html/measurement_chart.html
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/lib/build_perf/html/measurement_chart.html')
-rw-r--r--scripts/lib/build_perf/html/measurement_chart.html214
1 files changed, 166 insertions, 48 deletions
diff --git a/scripts/lib/build_perf/html/measurement_chart.html b/scripts/lib/build_perf/html/measurement_chart.html
index 65f1a227ad..86435273cf 100644
--- a/scripts/lib/build_perf/html/measurement_chart.html
+++ b/scripts/lib/build_perf/html/measurement_chart.html
@@ -1,50 +1,168 @@
1<script type="text/javascript"> 1<script type="module">
2 chartsDrawing += 1; 2 // Get raw data
3 google.charts.setOnLoadCallback(drawChart_{{ chart_elem_id }}); 3 const rawData = [
4 function drawChart_{{ chart_elem_id }}() { 4 {% for sample in measurement.samples %}
5 var data = new google.visualization.DataTable(); 5 [{{ sample.commit_num }}, {{ sample.mean.gv_value() }}, {{ sample.start_time }}, '{{sample.commit}}'],
6 6 {% endfor %}
7 // Chart options 7 ];
8 var options = { 8
9 theme : 'material', 9 const convertToMinute = (time) => {
10 legend: 'none', 10 return time[0]*60 + time[1] + time[2]/60 + time[3]/3600;
11 hAxis: { format: '', title: 'Commit number', 11 }
12 minValue: {{ chart_opts.haxis.min }}, 12
13 maxValue: {{ chart_opts.haxis.max }} }, 13 // Update value format to either minutes or leave as size value
14 {% if measurement.type == 'time' %} 14 const updateValue = (value) => {
15 vAxis: { format: 'h:mm:ss' }, 15 // Assuming the array values are duration in the format [hours, minutes, seconds, milliseconds]
16 {% else %} 16 return Array.isArray(value) ? convertToMinute(value) : value
17 vAxis: { format: '' }, 17 }
18 {% endif %} 18
19 pointSize: 5, 19 // Convert raw data to the format: [time, value]
20 chartArea: { left: 80, right: 15 }, 20 const data = rawData.map(([commit, value, time]) => {
21 }; 21 return [
22 22 // The Date object takes values in milliseconds rather than seconds. So to use a Unix timestamp we have to multiply it by 1000.
23 // Define data columns 23 new Date(time * 1000).getTime(),
24 data.addColumn('number', 'Commit'); 24 // Assuming the array values are duration in the format [hours, minutes, seconds, milliseconds]
25 data.addColumn('{{ measurement.value_type.gv_data_type }}', 25 updateValue(value)
26 '{{ measurement.value_type.quantity }}'); 26 ]
27 // Add data rows 27 });
28 data.addRows([ 28
29 {% for sample in measurement.samples %} 29 const commitCountList = rawData.map(([commit, value, time]) => {
30 [{{ sample.commit_num }}, {{ sample.mean.gv_value() }}], 30 return commit
31 {% endfor %} 31 });
32 ]); 32
33 33 const commitCountData = rawData.map(([commit, value, time]) => {
34 // Finally, draw the chart 34 return updateValue(value)
35 chart_div = document.getElementById('{{ chart_elem_id }}'); 35 });
36 var chart = new google.visualization.LineChart(chart_div); 36
37 google.visualization.events.addListener(chart, 'ready', function () { 37 // Set chart options
38 //chart_div = document.getElementById('{{ chart_elem_id }}'); 38 const option_start_time = {
39 //chart_div.innerHTML = '<img src="' + chart.getImageURI() + '">'; 39 tooltip: {
40 png_div = document.getElementById('{{ chart_elem_id }}_png'); 40 trigger: 'axis',
41 png_div.outerHTML = '<a id="{{ chart_elem_id }}_png" href="' + chart.getImageURI() + '">PNG</a>'; 41 enterable: true,
42 console.log("CHART READY: {{ chart_elem_id }}"); 42 position: function (point, params, dom, rect, size) {
43 chartsDrawing -= 1; 43 return [point[0], '0%'];
44 if (chartsDrawing == 0) 44 },
45 console.log("ALL CHARTS READY"); 45 formatter: function (param) {
46 const value = param[0].value[1]
47 const sample = rawData.filter(([commit, dataValue]) => updateValue(dataValue) === value)
48 const formattedDate = new Date(sample[0][2] * 1000).toString().replace(/GMT[+-]\d{4}/, '').replace(/\(.*\)/, '(CEST)');
49
50 // Add commit hash to the tooltip as a link
51 const commitLink = `https://git.yoctoproject.org/poky/commit/?id=${sample[0][3]}`
52 if ('{{ measurement.value_type.quantity }}' == 'time') {
53 const hours = Math.floor(value/60)
54 const minutes = Math.floor(value % 60)
55 const seconds = Math.floor((value * 60) % 60)
56 return `<strong>Duration:</strong> ${hours}:${minutes}:${seconds}, <strong>Commit number:</strong> <a href="${commitLink}" target="_blank" rel="noreferrer noopener">${sample[0][0]}</a>, <br/> <strong>Start time:</strong> ${formattedDate}`
57 }
58 return `<strong>Size:</strong> ${value.toFixed(2)} MB, <strong>Commit number:</strong> <a href="${commitLink}" target="_blank" rel="noreferrer noopener">${sample[0][0]}</a>, <br/> <strong>Start time:</strong> ${formattedDate}`
59 ;}
60 },
61 xAxis: {
62 type: 'time',
63 },
64 yAxis: {
65 name: '{{ measurement.value_type.quantity }}' == 'time' ? 'Duration in minutes' : 'Disk size in MB',
66 type: 'value',
67 min: function(value) {
68 return Math.round(value.min - 0.5);
69 },
70 max: function(value) {
71 return Math.round(value.max + 0.5);
72 }
73 },
74 dataZoom: [
75 {
76 type: 'slider',
77 xAxisIndex: 0,
78 filterMode: 'none'
79 },
80 ],
81 series: [
82 {
83 name: '{{ measurement.value_type.quantity }}',
84 type: 'line',
85 symbol: 'none',
86 data: data
87 }
88 ]
89 };
90
91 const option_commit_count = {
92 tooltip: {
93 trigger: 'axis',
94 enterable: true,
95 position: function (point, params, dom, rect, size) {
96 return [point[0], '0%'];
97 },
98 formatter: function (param) {
99 const value = param[0].value
100 const sample = rawData.filter(([commit, dataValue]) => updateValue(dataValue) === value)
101 const formattedDate = new Date(sample[0][2] * 1000).toString().replace(/GMT[+-]\d{4}/, '').replace(/\(.*\)/, '(CEST)');
102 // Add commit hash to the tooltip as a link
103 const commitLink = `https://git.yoctoproject.org/poky/commit/?id=${sample[0][3]}`
104 if ('{{ measurement.value_type.quantity }}' == 'time') {
105 const hours = Math.floor(value/60)
106 const minutes = Math.floor(value % 60)
107 const seconds = Math.floor((value * 60) % 60)
108 return `<strong>Duration:</strong> ${hours}:${minutes}:${seconds}, <strong>Commit number:</strong> <a href="${commitLink}" target="_blank" rel="noreferrer noopener">${sample[0][0]}</a>, <br/> <strong>Start time:</strong> ${formattedDate}`
109 }
110 return `<strong>Size:</strong> ${value.toFixed(2)} MB, <strong>Commit number:</strong> <a href="${commitLink}" target="_blank" rel="noreferrer noopener">${sample[0][0]}</a>, <br/> <strong>Start time:</strong> ${formattedDate}`
111 ;}
112 },
113 xAxis: {
114 name: 'Commit count',
115 type: 'category',
116 data: commitCountList
117 },
118 yAxis: {
119 name: '{{ measurement.value_type.quantity }}' == 'time' ? 'Duration in minutes' : 'Disk size in MB',
120 type: 'value',
121 min: function(value) {
122 return Math.round(value.min - 0.5);
123 },
124 max: function(value) {
125 return Math.round(value.max + 0.5);
126 }
127 },
128 dataZoom: [
129 {
130 type: 'slider',
131 xAxisIndex: 0,
132 filterMode: 'none'
133 },
134 ],
135 series: [
136 {
137 name: '{{ measurement.value_type.quantity }}',
138 type: 'line',
139 symbol: 'none',
140 data: commitCountData
141 }
142 ]
143 };
144
145 // Draw chart
146 const draw_chart = (chart_id, option) => {
147 let chart_name
148 const chart_div = document.getElementById(chart_id);
149 // Set dark mode
150 if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
151 chart_name= echarts.init(chart_div, 'dark', {
152 height: 320
153 });
154 } else {
155 chart_name= echarts.init(chart_div, null, {
156 height: 320
157 });
158 }
159 // Change chart size with browser resize
160 window.addEventListener('resize', function() {
161 chart_name.resize();
46 }); 162 });
47 chart.draw(data, options); 163 return chart_name.setOption(option);
48} 164 }
49</script>
50 165
166 draw_chart('{{ chart_elem_start_time_id }}', option_start_time)
167 draw_chart('{{ chart_elem_commit_count_id }}', option_commit_count)
168</script>