4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 <meta name="description" content="">
9 <meta name="author" content="costa@tsaousis.gr">
11 <title>NetData</title>
13 <!-- Google AJAX API -->
14 <script type="text/javascript" src="https://www.google.com/jsapi"></script>
15 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
18 <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
19 <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css">
20 <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
21 <link href="/file/theme.css" rel="stylesheet">
24 <script type="text/javascript" src="/file/netdata.js"></script>
25 <script type="text/javascript" src="/file/jquery.visible.js"></script>
26 <script type="text/javascript">
28 // Set a callback to run when the Google Visualization API is loaded.
29 google.setOnLoadCallback(initCharts);
33 var mode; // one of the MODE_* values
35 var mycharts = new Array();
38 function chartIsLoadingHTML(width, height) { return "<table><tr><td align=\"center\" width=\"" + width + "\" height=\"" + height + "\"><h4><span class=\"glyphicon glyphicon-refresh\"></span><br/><br/>loading chart<br/><br/><span class=\"label label-default\">Please wait...</span></h4></td></tr></table>"; }
40 function showChartIsLoading(id, width, height) { document.getElementById(id).innerHTML = chartIsLoadingHTML(width, height); }
42 // copy the chart c to mainchart
43 // switch to main graphs screen
44 function mainChart(c) {
45 if(mainchart && mainchart.chart) mainchart.chart.clearChart();
47 mainchart = $.extend(true, {}, c);
49 mainchart.chart = null;
50 mainchart.chartOptions.width = Math.round((($(window).width() * 0.95) - 50) / 1);
51 mainchart.chartOptions.height = $(window).height() - 200;
52 if(mainchart.chartOptions.height < 300) mainchart.chartOptions.height = 300;
54 mainchart.thumbnail = false;
56 mainchart.group_method = "max";
57 mainchart.div = 'maingraph';
58 mainchart.last_updated = 0;
59 mainchart.explorer = false;
61 if(mainchart.type == "tc") {
63 mainchart.group_method = "average";
65 else if(mainchart.type == "ipv4" || mainchart.type == "conntrack" || mainchart.type == "ipvs") {
67 mainchart.group_method = "max";
70 // calculate the time to refresh each chart
71 mainchart.chart_update_every = mainchart.group * 1000; // milliseconds
73 // calculate how many point to show for each chart
74 mainchart.points_to_show = Math.round(mainchart.entries / mainchart.group) - 1;
76 // show max 10 mins of data
77 if(mainchart.points_to_show * mainchart.group > 1200) mainchart.points_to_show = 1200 / mainchart.group;
80 showChartIsLoading(mainchart.div, mainchart.chartOptions.width, mainchart.chartOptions.height);
82 document.getElementById('maingraph_title').innerHTML = " <b> " + mainchart.title + " </b> (as " + mainchart.group_method + " of every " + (mainchart.group * mainchart.update_every) + " seconds)";
87 function setMainChart(i) {
88 mainChart(mycharts[i]);
91 // refresh the main chart
92 // make sure it gets updated frequently
93 function mainChartRefresh() {
94 if(!mainchart || mode != MODE_MAIN) {
95 if(mainchart) mainchart.clearChart();
100 var now = new Date().getTime();
102 if((now - mainchart.last_updated) >= mainchart.chart_update_every) {
103 refreshChart(mainchart, triggerMainChartRefresh);
104 mainchart.last_updated = now;
106 else triggerMainChartRefresh();
109 // callback for refreshing the main chart
110 function triggerMainChartRefresh() {
111 if(mode == MODE_MAIN) setTimeout(mainChartRefresh, 500);
114 // calculate the proper width for the thumb charts
115 function thumbWidth() {
116 var items = Math.round((($(window).width() * 0.95) - 50) / 500);
117 if(items < 1) items = 1;
119 var width = Math.round((($(window).width() * 0.95) - 50) / items) - 1;
120 //console.log("window = " + (($(window).width() * 0.95) - 50) + ", items = " + items + ", width = " + width);
126 // if the thumb charts need resize in their width, reset them
127 function resizeCharts() {
128 var width = Math.round((($(window).width() * 0.95) - 50) / 1);
130 mainchart.chartOptions.width = Math.round((($(window).width() * 0.95) - 50) / 1);
131 mainchart.chartOptions.height = $(window).height() - 200;
132 mainchart.last_updated = 0;
135 width = thumbWidth();
136 $.each(mycharts, function(i, c) {
137 if(c.enabled && c.chartOptions.width != width) {
138 if(c.chart) c.chart.clearChart();
140 c.chartOptions.width = width;
141 showChartIsLoading(c.div, c.chartOptions.width, c.chartOptions.height);
147 // load the charts from the server
148 // generate html for the thumbgraphs to support them
149 function initCharts() {
150 var width = thumbWidth();
153 loadCharts(function(c) {
156 if(mycharts == null || mycharts.length == 0) {
157 alert("Cannot load data from server.");
161 var thumbsContainer = document.getElementById("graphs");
162 if(!thumbsContainer) {
163 alert("Cannot find the thumbsContainer");
167 function chartssort(a, b) {
168 if(a.userpriority < b.userpriority) return -1;
171 mycharts.sort(chartssort);
173 document.getElementById('hostname_id').innerHTML = mycharts[0].hostname;
174 document.title = mycharts[0].hostname;
176 // create an array for grouping all same-type graphs together
177 var categories = new Array();
178 $.each(mycharts, function(i, c) {
180 c.chartOptions.width = width;
181 c.chartOptions.height = height;
185 c.glyphicon = "glyphicon-transfer";
187 c.group_method = "average";
191 c.glyphicon = "glyphicon-cloud";
193 c.group_method = "max";
197 c.glyphicon = "glyphicon-resize-full";
199 c.group_method = "max";
203 c.glyphicon = "glyphicon-eye-open";
205 c.group_method = "max";
209 c.glyphicon = "glyphicon-sort";
211 c.group_method = "max";
215 c.glyphicon = "glyphicon-floppy-disk";
217 c.group_method = "max";
221 c.glyphicon = "glyphicon-search";
223 c.group_method = "max";
227 // calculate the time to refresh each chart
228 c.chart_update_every = c.group * 1000; // milliseconds
230 // calculate how many point to show for each chart
231 c.points_to_show = Math.round(c.entries / c.group) - 1;
233 // show max 10 mins of data
234 if(c.points_to_show * c.group > 600) c.points_to_show = 600 / c.group;
238 var h = "<div class=\"thumbgraph\"><table><tr><td><div class=\"thumbgraph\" id=\"" + c.div + "\">" + chartIsLoadingHTML(c.chartOptions.width, c.chartOptions.height) + "</div></td></tr><tr><td align=\"center\"><div class=\"btn-group-xs\"><button type=\"button\" class=\"btn btn-default\" onclick=\"setMainChart(" + i +");\"> select " + c.name + " for zoom </button></div></td></tr></table></div>";
240 // find the categories object for this type
241 for(j = 0; j < categories.length ;j++) {
242 if(categories[j].name == c.type) {
243 categories[j].html += h;
244 categories[j].count++;
249 if(j == categories.length) {
250 var t = "(as " + c.group_method + " every " + (c.group*c.update_every) + " seconds)";
251 categories.push({name: c.type, title: c.category, description: t, priority: 0, count: 1, glyphicon: c.glyphicon, html: h});
256 $.each(categories, function(i, a) {
257 if(a.name == "net") a.priority = 1;
258 else if(a.name == "tc") a.priority = 2;
259 else if(a.name == "conntrack") a.priority = 3;
260 else if(a.name == "ipvs") a.priority = 4;
261 else if(a.name == "ipv4") a.priority = 5;
262 else if(a.name == "disk") a.priority = 6;
265 a.html = "<tr><td><ol class=\"breadcrumb graphs\"><li class=\"active\"><span class=\"glyphicon " + a.glyphicon + "\"></span> <a id=\"" + a.name + "\" href=\"#" + a.name + "\"><b>" + a.title + "</b> " + a.description + " </a></li></ol></td></tr><tr><td><div class=\"thumbgraphs\">" + a.html + "</td></tr>";
268 function categoriessort(a, b) {
269 if(a.priority < b.priority) return -1;
272 categories.sort(categoriessort);
274 // combine all the htmls into one
275 var allcategories = "<table width=\"100%\">";
276 $.each(categories, function(i, a) {
277 allcategories += a.html;
279 allcategories += "</table>";
281 thumbsContainer.innerHTML = allcategories;
287 function thumbChartsRefreshInternal(howmany) {
288 if(mycharts.length == 0 || mode != MODE_THUMBS) return;
290 var now = new Date().getTime();
292 // refresh the mini charts
293 var wanted = howmany;
295 var count = mycharts.length - 1;
296 while(did < wanted && count >= 0) {
299 if(last_mini >= mycharts.length) last_mini = 0;
301 if(!mycharts[last_mini].enabled) continue;
302 if((now - mycharts[last_mini].last_updated) < mycharts[last_mini].chart_update_every) continue;
304 if(mycharts[last_mini].chart != null)
305 if(mycharts[last_mini].chart.getSelection()[0]) continue;
307 if($('#' + mycharts[last_mini].div).visible(true) == false) continue;
309 refreshChart(mycharts[last_mini], triggerThumbChartsRefreshFast);
310 mycharts[last_mini].last_updated = now;
315 if(did == 0) triggerThumbChartsRefresh();
318 function triggerThumbChartsRefresh() {
319 setTimeout(thumbChartsRefresh, 200);
322 function triggerThumbChartsRefreshFast() {
323 thumbChartsRefresh();
326 function thumbChartsRefresh() {
327 if(mode == MODE_THUMBS) thumbChartsRefreshInternal(1);
330 // setInterval(myChartsRefresh, 500);
332 window.onresize = function(event) {
336 function showMainGraph() {
337 if(!mainchart) return;
340 document.getElementById('maingraph_container').style.display = 'block';
341 document.getElementById('thumbgraphs_container').style.display = 'none';
346 function showThumbGraphs() {
349 document.getElementById('maingraph_container').style.display = 'none';
350 document.getElementById('thumbgraphs_container').style.display = 'block';
353 if(mainchart.chart) mainchart.chart.clearChart();
357 thumbChartsRefresh(1);
363 <body role="document">
364 <div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
365 <div class="container">
366 <div class="navbar-header">
367 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
368 <span class="sr-only">Toggle navigation</span>
369 <span class="icon-bar"></span>
370 <span class="icon-bar"></span>
371 <span class="icon-bar"></span>
373 <a class="navbar-brand" href="#" id="hostname_id">NetData</a>
375 <div class="collapse navbar-collapse">
376 <ul class="nav navbar-nav">
377 <li class="active"><a href="#">Home</a></li>
378 <li><a href="#net">Network</a></li>
379 <li><a href="#tc">QoS</a></li>
380 <li><a href="#conntrack">Netfilter</a></li>
381 <li><a href="#ipv4">IPv4</a></li>
382 <li><a href="#ipvs">IPVS</a></li>
383 <li><a href="#disk">Disk</a></li>
385 </div><!--/.nav-collapse -->
389 <div class="container graphs" id="maingraph_container" style="display: none">
391 <tr><td><ol class="breadcrumb graphs"><li class="active"><a id="maingraph_title" href="#maingraph"><b> Maingraph </b></a></li></ol></td></tr>
393 <div class="maingraph">
395 <tr><td><div class="maingraph" id="maingraph"></div></td></tr>
396 <tr><td align="center"><div class="btn-group"><button type="button" onclick="showThumbGraphs();" class="btn btn-default"> close main graph </button></div></td></tr>
398 </div><!-- /.maingraph -->
403 <div class="container graphs" id="thumbgraphs_container">
404 <div class="allgraphs" id="graphs">
405 <table width="100%"><tr><td align="center"><p/> <p/> <p/> <h1><span class="glyphicon glyphicon-refresh"></span><br/><br/>loading charts<br/><br/><span class="label label-default">Please wait...</span></h1></td></tr></table>