| <!DOCTYPE html> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js"></script> |
| <select id="graphs"></select> |
| <script> |
| function transformData(data, path) { |
| console.log(path); |
| var pathParts = path.split('!'); |
| var name = pathParts[pathParts.length - 1]; |
| var transformed = []; |
| for (const report of data.map(d => d.report)) { |
| var subData = findData(report, path); |
| transformed.push(subData.amount); |
| } |
| console.log(transformed); |
| return [{ |
| label: 'Usage in MiB', |
| data: transformed, |
| fill: false, |
| }]; |
| } |
| |
| function findData(data, parent) { |
| parent = parent.split('!'); |
| parent.reverse(); |
| while (parent.length) { |
| var next = parent.pop(); |
| console.log(next); |
| if ('children' in data) { |
| data = data.children; |
| } |
| data = data[next]; |
| } |
| return data; |
| } |
| |
| function makeOptions(data, initial) { |
| var sel = document.querySelector('#graphs'); |
| sel.innerHTML = ''; |
| // TODO: add support for labels that are not present in initial report. |
| var rootData = data[0].report; |
| console.log(Object.keys(rootData)); |
| var remaining = Object.keys(rootData).map(k => [k, rootData[k], k]); |
| remaining.reverse(); |
| while (remaining.length) { |
| var next = remaining.pop(); |
| var children = Object.keys(next[1].children).map(k => [k, next[1].children[k], next[2] + '!' + k]); |
| children.reverse(); |
| remaining.push.apply(remaining, children); |
| |
| var opt = sel.appendChild(document.createElement('option')); |
| opt.innerText = '-'.repeat((next[2].match(/!/g) || []).length) + next[0]; |
| opt.fullPath = next[2]; |
| } |
| sel.onchange = function() { |
| var title = sel.value; |
| while (title[0] == '-') { |
| title = title.slice(1); |
| } |
| makeChart({ |
| 'labels': data.map(d => d.seconds + 's'), |
| 'datasets': transformData(data, sel.selectedOptions[0].fullPath), |
| }, title); |
| }; |
| sel.value = initial; |
| sel.onchange(); |
| } |
| |
| function makeChart(data, title) { |
| var canvas = document.querySelector('#myChart'); |
| if (canvas) { |
| canvas.remove(); |
| } |
| canvas = document.body.appendChild(document.createElement('canvas')); |
| canvas.id = 'myChart'; |
| canvas.width = 800; |
| canvas.height = 600; |
| var ctx = canvas.getContext('2d'); |
| var myChart = new Chart(ctx, { |
| type: 'line', |
| data: { |
| labels: data['labels'], |
| datasets: data['datasets'] |
| }, |
| options: { |
| title: { |
| display: true, |
| text: title, |
| }, |
| responsive: false, |
| animation: { |
| duration: 0 |
| }, |
| elements: { |
| line: { |
| tension: 0 |
| } |
| }, |
| scales: { |
| yAxes: [{ |
| ticks: { |
| beginAtZero:true |
| } |
| }] |
| } |
| } |
| }); |
| } |
| |
| var data = [/* json data */]; |
| var initialGraph = "explicit"; |
| makeOptions(data, initialGraph); |
| </script> |