| |
| <script type="text/javascript" src="//www.google.com/jsapi"></script> |
| <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css"> |
| <script type="text/javascript"> |
| google.load('visualization', '1', {'packages' : ['controls','table','corechart','geochart']}); |
| </script> |
| |
| <script type="text/javascript"> |
| var queryString = encodeURIComponent("SELECT MINUTE(time) as Time, city, s8 as Node, REGEXP_REPLACE(s8,r'node[0-9]+\.(.*)\.vicci\.org',r'\\1') as Site, AVG(i0) as Cpu, AVG(i1) as Requests FROM [vicci.demoevents] WHERE i0 is not null AND s8 contains 'vicci.org' and not city IN ('princeton','Unknown') and city is not null GROUP BY Time,city,Site,Node ORDER BY Time;"); |
| var serverPart = "http://cloud-scrutiny.appspot.com/command?action=send_query&force=ColumnChart&q=" |
| var dataSourceUrl = serverPart + queryString; |
| var query; |
| |
| var options = { |
| width: 600, |
| height: 400, |
| showRowNumber: false, |
| pages:true, |
| numRows:9, |
| backgroundColor: "black" |
| }; |
| |
| google.setOnLoadCallback(function() { sendAndDraw(dataSourceUrl); }); |
| |
| function showNodeAgg(dt) { |
| var tab = new google.visualization.ChartWrapper({ |
| 'chartType': 'Table', |
| 'containerId': 'chart3', |
| 'options': { |
| 'width': 300, |
| 'height': 300, |
| 'title': 'Network-wide usage', |
| 'page': 'enable', |
| 'pageSize': 10 |
| }, |
| 'view': {'columns': [0, 1, 2]} |
| }); |
| |
| tab.setDataTable(dt); |
| tab.draw(); |
| } |
| |
| function showSiteTimeAgg(dt) { |
| var lineChart = new google.visualization.ChartWrapper({ |
| 'chartType': 'LineChart', |
| 'containerId': 'chart4', |
| 'options': { |
| 'width': 300, |
| 'height': 300, |
| 'title': 'Network-wide usage', |
| 'pages': true, |
| 'numRows': 9 |
| }, |
| 'view': {'columns': [0, 1, 2]} |
| }); |
| lineChart.setDataTable(dt); |
| lineChart.draw(); |
| /* |
| var scatterChart = new google.visualization.ChartWrapper({ |
| 'chartType': 'ScatterChart', |
| 'containerId': 'chart5', |
| 'options': { |
| 'width': 300, |
| 'height': 300, |
| }, |
| // from the 'data' DataTable. |
| 'view': {'columns': [1, 2]} |
| }); |
| scatterChart.setDataTable(dt); |
| scatterChart.draw();*/ |
| } |
| function showSiteAgg(dt) { |
| var barChart = new google.visualization.ChartWrapper({ |
| 'chartType': 'ColumnChart', |
| 'containerId': 'chart1', |
| 'options': { |
| 'width': 300, |
| 'height': 300, |
| 'title': 'Site-wise usage', |
| 'pages': true, |
| 'numRows': 9 |
| }, |
| // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten) |
| // from the 'data' DataTable. |
| 'view': {'columns': [1, 2, 3]} |
| }); |
| barChart.setDataTable(dt); |
| barChart.draw(); |
| var geoChart = new google.visualization.ChartWrapper({ |
| 'chartType': 'GeoChart', |
| 'containerId': 'chart2', |
| 'options': { |
| 'width': 300, |
| 'height': 300, |
| 'displayMode': 'markers', |
| 'region':'021', |
| 'title': 'Usage map', |
| colorAxis: {colors: ['green', 'purple', 'red']} |
| }, |
| // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten) |
| // from the 'data' DataTable. |
| 'view': {'columns': [0, 2,3]} |
| }); |
| geoChart.setDataTable(dt); |
| geoChart.draw(); |
| |
| var histogram = new google.visualization.ChartWrapper({ |
| 'chartType': 'Histogram', |
| 'containerId': 'chart6', |
| 'options': { |
| 'width': 300, |
| 'height': 300, |
| }, |
| 'title': 'Sites by load', |
| // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten) |
| // from the 'data' DataTable. |
| 'view': {'columns': [1, 2]} |
| }); |
| histogram.setDataTable(dt); |
| histogram.draw(); |
| |
| } |
| |
| function handleResponse(response) { |
| var supportedClasses = { |
| 'Table':google.visualization.Table, |
| 'LineChart':google.visualization.LineChart, |
| 'ScatterChart':google.visualization.ScatterChart, |
| 'ColumnChart':google.visualization.ColumnChart, |
| 'GeoChart':google.visualization.GeoChart, |
| 'PieChart':google.visualization.PieChart, |
| 'Histogram':google.visualization.Histogram |
| }; |
| |
| /*var slider2 = new google.visualization.ControlWrapper({ |
| 'controlType': 'NumberRangeFilter', |
| 'containerId': 'control3', |
| 'options': { |
| 'filterColumnLabel': 'Cpu', |
| minValue: 0, |
| maxValue: 100, |
| ui: { ticks: 10} |
| } |
| });*/ |
| |
| var timeSlider = new google.visualization.ControlWrapper({ |
| 'controlType': 'NumberRangeFilter', |
| 'containerId': 'control1', |
| 'options': { |
| 'filterColumnLabel': 'Time', |
| ui: { ticks: 10} |
| } |
| }); |
| |
| // Define a bar chart |
| var barChart = new google.visualization.ChartWrapper({ |
| 'chartType': 'BarChart', |
| 'containerId': 'chart1', |
| 'options': { |
| 'width': 400, |
| 'height': 300, |
| 'hAxis': {'minValue': 0, 'maxValue': 60}, |
| 'chartArea': {top: 0, right: 0, bottom: 0} |
| } |
| }); |
| |
| var categoryPicker = new google.visualization.ControlWrapper({ |
| 'controlType': 'CategoryFilter', |
| 'allowMultiple': true, |
| 'containerId': 'control2', |
| 'options': { |
| 'filterColumnLabel': 'Site', |
| 'ui': { |
| 'labelStacking': 'vertical', |
| 'allowTyping': false |
| } |
| } |
| }); |
| //var container = document.getElementById('datatable'); |
| //var table = new google.visualization.LineChart(container); |
| //var table = new google.visualization.ColumnChart(container); |
| |
| var proxy = new google.visualization.ChartWrapper({ |
| 'chartType': 'Table', |
| 'containerId': 'chart7', |
| 'options': { |
| 'width': 800, |
| 'height': 300, |
| pageSize:5, |
| page:'enable', |
| 'legend': 'none', |
| 'title': 'Nodes' |
| }, |
| // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten) |
| // from the 'data' DataTable. |
| 'view': {'columns': [0,1,2,3,4,5]} |
| }); |
| |
| function core_sum(arr) { |
| var ret = 0; |
| for (var i = 0; i < arr.length; i++) { |
| ret+=arr[i]/1000; |
| } |
| return ret; |
| } |
| |
| function scaled_sum(arr) { |
| var ret = 0; |
| for (var i = 0; i < arr.length; i++) { |
| ret+=arr[i]/1000; |
| } |
| return ret; |
| } |
| |
| function count_uniq(arr) { |
| var counts = {}; |
| var ret = 0; |
| console.log('Starting ret '+ret); |
| for (var i = 0; i < arr.length; i++) { |
| if (!counts[arr[i]]) ret+=1; |
| counts[arr[i]] = 1; |
| } |
| return ret; |
| } |
| google.visualization.events.addListener(proxy, 'ready', function () { |
| // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes |
| var dt = proxy.getDataTable(); |
| var groupedData1 = google.visualization.data.group(dt, [0], [{ |
| column: 4, |
| type: 'number', |
| label: dt.getColumnLabel(4), |
| aggregation: google.visualization.data.sum |
| },{ |
| column: 5, |
| type: 'number', |
| label: dt.getColumnLabel(5), |
| aggregation: google.visualization.data.sum |
| }]); |
| |
| showSiteTimeAgg(groupedData1); |
| }); |
| |
| /*google.visualization.events.addListener(proxy, 'ready', function () { |
| // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes |
| var dt = proxy.getDataTable(); |
| var groupedData0 = google.visualization.data.group(dt, [2], [{ |
| column: 4, |
| type: 'number', |
| label: dt.getColumnLabel(4), |
| aggregation: google.visualization.data.sum |
| },{ |
| column: 5, |
| type: 'number', |
| label: dt.getColumnLabel(5), |
| aggregation: google.visualization.data.sum |
| }]); |
| // after grouping, the data will be sorted by column 0, then 1, then 2 |
| // if you want a different order, you have to re-sort |
| showNodeAgg(groupedData0); |
| });*/ |
| |
| google.visualization.events.addListener(proxy, 'ready', function () { |
| // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes |
| var dt = proxy.getDataTable(); |
| var groupedData0 = google.visualization.data.group(dt, [1,3], [{ |
| column: 4, |
| type: 'number', |
| label: 'Cores', |
| aggregation: core_sum |
| },{ |
| column: 5, |
| type: 'number', |
| label: dt.getColumnLabel(5), |
| aggregation: scaled_sum |
| }]); |
| // after grouping, the data will be sorted by column 0, then 1, then 2 |
| // if you want a different order, you have to re-sort |
| showSiteAgg(groupedData0); |
| }); |
| |
| data = response.getDataTable(); |
| new google.visualization.Dashboard(document.getElementById('dashboard')). |
| // Establish bindings, declaring the both the slider and the category |
| // picker will drive both charts. |
| bind([categoryPicker,timeSlider], [proxy]). |
| // Draw the entire dashboard. |
| draw(data); |
| |
| } |
| function sendAndDraw(queryString) { |
| query = new google.visualization.Query(queryString) |
| query && query.abort(); |
| query.send(function(response) {handleResponse(response);}); |
| } |
| |
| |
| </script> |
| <div id="dashboard" class="container"> |
| <div class="row"> |
| <div class="col-md-8"> |
| <div class="col-md-4" id="control2"></div> |
| <div class="col-md-4" id="control1"></div> |
| <!--<div class="col-md-4" id="control3"></div>--> |
| </div> |
| </div> |
| <div class="row"> |
| <div class="col-md-8"> |
| <div class="col-md-4" id="chart1"> |
| </div> |
| <div class="col-md-4" id="chart2"> |
| </div> |
| <!-- |
| <div class="col-md-4" id="chart3"> |
| </div>--> |
| </div> |
| </div> |
| <div class="row"> |
| <div class="col-md-8"> |
| <div class="col-md-4" id="chart4"> |
| </div> |
| <!-- |
| <div class="col-md-4" id="chart5"> |
| </div>--> |
| <div class="col-md-4" id="chart6"> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div id="chart7" style="display:none"></div> |