"use strict"; function setNightModeChart(night) { if(night) { Chart.defaults.global.defaultFontColor = "#fff"; Chart.defaults.scale.gridLines.color = "#444" } else { Chart.defaults.global.defaultFontColor = "#222"; Chart.defaults.scale.gridLines.color = "#ddd" } } function drawLatency(canvas, sw, chart, callback) { var q = encodeURIComponent('SELECT mean("latency") AS "mean_latency" FROM "ping" WHERE time > now() - 1h AND "switch"=\''+sw+'\' GROUP BY time(60s), "version" fill(null)'); var dataset = []; $.getJSON( "/query?db=gondul&q="+q, function( results ) { try { results['results'][0]['series'].forEach(function(serie) { var data = []; serie['values'].forEach(function(element) { data.push({t: new Date(element[0]), y: element[1]}); }); var borderColor = "rgba(0,155,200,255)"; if(serie['tags']['version'] === "v6") { borderColor = "rgba(100,155,100,255)"; } dataset.push({data: data, fill:false, borderColor:borderColor, label:serie['tags']['version'] }); }); if(chart != false) { chart.data.datasets = dataset; chart.update(); return; } var ctx = document.getElementById(canvas).getContext('2d'); var myChart = new Chart(ctx, { type: 'line', data: { datasets: dataset }, options: { legend: { display: false }, scales: { xAxes:[{ type: 'time', time: { parser: "HH:mm", unit: 'minute', tooltipFormat: 'HH:mm', displayFormats: { 'minute': 'HH:mm', 'hour': 'HH:mm', min: '00:00', max: '23:59' }, } }], yAxes: [{ ticks: { beginAtZero: true } }] }, responsive: true, animation: false, elements: { line: { tension: 0.05 } } } }); } catch(e) { } if(callback != undefined) { callback(myChart); } }); } function drawSumOfPorts(canvas, sw) { var kilobit = 1024; var megabit = kilobit * 1024; var gigabit = megabit * 1024; var terabit = gigabit * 1024; var q = encodeURIComponent('SELECT non_negative_derivative(first("ifHCInOctets"), 1s) * 8 AS "ifHCInOctets", non_negative_derivative(first("ifHCOutOctets"), 1s) * 8 AS "ifHCOutOctets" FROM "ports" WHERE time > now() - 30m AND "switch"=\''+sw+'\' GROUP BY time(90s),"interface" fill(null)'); var dataset = []; $.getJSON( "/query?db=gondul&q="+q, function( results ) { var bits_in = []; var bits_out = []; results['results'][0]['series'].forEach(function(serie) { // Bytes in serie['values'].forEach(function(element) { bits_in.push(element[1]); }); // Bytes out serie['values'].forEach(function(element) { bits_out.push(element[2]); }); }); var bits_in_size = bitToSize(Math.max.apply( Math, bits_in )); var bits_out_size = bitToSize(Math.max.apply( Math, bits_out )); var size = 0; if(bits_in_size >= bits_out_size) { size = bits_in_size; } else { size = bits_out_size; } var size_divider; switch (size) { case 0: size_divider = 1; break; case 1: size_divider = kilobit; break; case 2: size_divider = megabit; break; case 3: size_divider = gigabit; break; case 4: size_divider = terabit; break; } results['results'][0]['series'].forEach(function(serie) { // Bytes in var data = []; serie['values'].forEach(function(element) { data.push({t: new Date(element[0]), y: element[1] / size_divider }); }); dataset.push({data: data, backgroundColor:'rgba(58,125,48,200)', label:'Traffic in (' + sizeToText(size)+')'}); // Bytes out data = []; serie['values'].forEach(function(element) { data.push({t: new Date(element[0]), y: -Math.abs(element[2] / size_divider) }); }); dataset.push({data: data, backgroundColor:'rgba(84,84,142,225)', label:'Traffic out (' + sizeToText(size)+')'}); }); // Draw the chart var ctx = document.getElementById(canvas).getContext('2d'); var myChart = new Chart(ctx, { type: 'line', data: { datasets: dataset }, options: { legend: { display: false }, scales: { xAxes:[{ type: 'time', time: { parser: "HH:mm", unit: 'minute', tooltipFormat: 'HH:mm', displayFormats: { 'minute': 'HH:mm', 'hour': 'HH:mm', min: '00:00', max: '23:59' }, } }], yAxes: [{ stacked: true, ticks: { callback: function(label, index, labels) { return Math.abs(label)+' '+sizeToText(size); } }, scaleLabel: { display: true, labelString: sw+' - All ports' } }] }, responsive: true, animation: false, elements: { point: { radius: 0 }, line: { tension: 0 } } } }); }); } function drawPort(canvas, sw, port) { var kilobit = 1024; var megabit = kilobit * 1024; var gigabit = megabit * 1024; var terabit = gigabit * 1024; var q = encodeURIComponent('SELECT non_negative_derivative(first("ifHCInOctets"), 1s) * 8 AS "ifHCInOctets", non_negative_derivative(first("ifHCOutOctets"), 1s) * 8 AS "ifHCOutOctets" FROM "ports" WHERE time > now() - 30m AND "switch"=\''+sw+'\' AND "interface"=\''+port+'\' GROUP BY time(30s) fill(null)'); var dataset = []; $.getJSON( "/query?db=gondul&q="+q, function( results ) { var serie = results['results'][0]['series'][0]; var bits_in = []; var bits_out = []; // Bytes in serie['values'].forEach(function(element) { bits_in.push(element[1]); }); // Bytes out serie['values'].forEach(function(element) { bits_out.push(element[2]); }); var bits_in_size = bitToSize(Math.max.apply( Math, bits_in )); var bits_out_size = bitToSize(Math.max.apply( Math, bits_out )); var size = 0; if(bits_in_size >= bits_out_size) { size = bits_in_size; } else { size = bits_out_size; } var size_divider; switch (size) { case 0: size_divider = 1; break; case 1: size_divider = kilobit; break; case 2: size_divider = megabit; break; case 3: size_divider = gigabit; break; case 4: size_divider = terabit; break; } // Bytes in var data = []; serie['values'].forEach(function(element) { data.push({t: new Date(element[0]), y: element[1] / size_divider }); }); dataset.push({data: data, backgroundColor:'rgba(58,125,48,200)', label:'Traffic in (' + sizeToText(size)+')'}); // Bytes out data = []; serie['values'].forEach(function(element) { data.push({t: new Date(element[0]), y: -Math.abs(element[2] / size_divider) }); }); dataset.push({data: data, backgroundColor:'rgba(84,84,142,225)', label:'Traffic out (' + sizeToText(size)+')'}); // Draw the chart var ctx = document.getElementById(canvas).getContext('2d'); var myChart = new Chart(ctx, { type: 'line', data: { datasets: dataset }, options: { scales: { xAxes:[{ type: 'time', time: { parser: "HH:mm", unit: 'minute', tooltipFormat: 'HH:mm', displayFormats: { 'minute': 'HH:mm', 'hour': 'HH:mm', min: '00:00', max: '23:59' }, } }], yAxes: [{ ticks: { callback: function(label, index, labels) { return Math.abs(label)+' '+sizeToText(size); } }, scaleLabel: { display: true, labelString: sw+' - '+port } }] }, responsive: true, animation: false, elements: { line: { tension: 0 } } } }); }); } function bitToSize(bits) { var kilobit = 1024; var megabit = kilobit * 1024; var gigabit = megabit * 1024; var terabit = gigabit * 1024; if(bits >= 0 && bits < kilobit) { return 0; } else if(bits >= kilobit && bits < megabit){ return 1; } else if(bits >= megabit && bits < gigabit){ return 2; } else if(bits >= gigabit && bits < terabit){ return 3; } else if(bits >= terabit) { return 4; } } function sizeToText(size) { switch(size) { case 0: return 'bit/s'; break; case 1: return 'Kb/s'; break; case 2: return 'Mb/s'; break; case 3: return 'Gb/s'; break; case 4: return 'Tb/s'; break; } }