This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
spark-art-dashboard/chart.js

156 lines
3.8 KiB
JavaScript
Raw Normal View History

2018-09-07 18:20:45 +01:00
// SLA Data
var sla = null;
const request = async () => {
const response = await fetch('sla');
const json = await response.json();
sla = json[0];
console.log("sla data: ");
console.log(sla);
}
request();
const chartColors = [
(a=1) => `rgba( 54, 162, 235, ${a})`,
(a=1) => `rgba( 75, 192, 192, ${a})`,
(a=1) => `rgba(201, 203, 207, ${a})`,
(a=1) => `rgba(255, 159, 64, ${a})`,
(a=1) => `rgba(153, 102, 255, ${a})`,
(a=1) => `rgba(255, 99, 132, ${a})`,
(a=1) => `rgba(255, 205, 86, ${a})`
]
fetch('top.csv') // Open log
.then(response => response.text()) // Read it
.then(data => data.split('\n').map(x => x.split(','))) // Split in lines and split lines in columns
.then(data => {
const n = 100 // Number of dots
const headers = data[0].slice(1) // Remove the first header column (timestamp)
// Remove headers line and the empty last one and grab the first 100
data = data.slice(1, -1).slice(-n)
// Time will be shown in seconds then we divide it by 1000
// before building the X axis
const start = Math.round(data[0][0]/1000)
const xAxis = data.map(row => Math.round(row[0]/1000) - start)
// We will create a chart for each header:
const charts = headers.map((header, index) => {
const canvas = document.getElementById('chart-'+header)
if (!canvas) return null
const color = chartColors[index % chartColors.length]
const options = {
type: 'line',
responsive: true,
data: {
labels: xAxis,
datasets: [{
label: header,
data: data.map(row => row[index+1]), // Y axis
backgroundColor: color(0.5),
borderColor: color(),
borderWidth: 1,
pointRadius: 2 // Size of the dots
}]
},
options: {
legend: {
display: false
},
scales: {
xAxes: [{
ticks: {
autoSkip: true,
maxTicksLimit: 15,
},
scaleLabel: {
display: true,
labelString: 'seconds'
}
}],
yAxes: [{
ticks: {
autoSkip: true,
maxTicksLimit: 8
},
scaleLabel: {
display: true,
labelString: header
}
}]
},
animation: {
onComplete: function(animation) {
plot_lines(animation)
}
}
}
}
// If we have more than 200 dots then we deactivate lines and animations
// to avoid slowing or crashing the dashboard
if (n > 199) {
options.options.elements = {
line: {
tension: 0
}
},
options.options.animation = {
duration: 0
},
options.options.hover = {
animationDuration: 0
},
options.options.responsiveAnimationDuration = 0
}
return new Chart(canvas.getContext('2d'), options)
})
var charts_loaded = true;
return charts
})
.then(charts => {
console.log('done', charts)
})
.catch(error => {
console.error('An error ocurred:', error)
})
function plot_lines (animation) {
var execTime_line = new Graph({
canvasId: 'chart-execTime (ms)',
minX: -10,
minY: -10,
maxX: 10,
maxY: 10,
unitsPerTick: 1
});
execTime_line.drawEquation(function(x) {
return sla.maxExecTime;
}, 'green', 1);
var accuracy_line = new Graph({
canvasId: 'chart-Accuracy (%)',
minX: -10,
minY: -10,
maxX: 10,
maxY: 10,
unitsPerTick: 1
});
accuracy_line.drawEquation(function(x) {
return sla.minAccuracy;
}, 'green', 1);
var cost_line = new Graph({
canvasId: 'chart-cost',
minX: -10,
minY: -10,
maxX: 10,
maxY: 10,
unitsPerTick: 1
});
cost_line.drawEquation(function(x) {
return sla.maxCost;
}, 'green', 1);
}