@cryptotaxi247 / netdata-1 / commits / 6c751d34c

minor modification for clean exit; dashboard fixes for inheriting chart colors on gauge and easypiechart; added demo2.html

Costa Tsaousis (ktsaou) committed Jan 16, 2016 at 04:26 UTC 6c751d34c3e0ebc9cb5fb0a6648b02e46cd920a2
10 files changed +189 -71
src/common.c
+4 -1
@@ -146,8 +146,11 @@ void *mymmap(const char *filename, size_t size, int flags, int ksm)
146 error("Cannot seek to beginning of file '%s'.", filename);
147
148 // don't use MADV_SEQUENTIAL|MADV_DONTFORK, they disable MADV_MERGEABLE
149 + if(madvise(mem, size, MADV_SEQUENTIAL|MADV_DONTFORK) != 0)
150 + error("Cannot advise the kernel about the memory usage (MADV_SEQUENTIAL|MADV_DONTFORK) of file '%s'.", filename);
151 +
152 if(madvise(mem, size, MADV_MERGEABLE) != 0)
150 - error("Cannot advise the kernel about the memory usage of file '%s'.", filename);
153 + error("Cannot advise the kernel about the memory usage (MADV_MERGEABLE) of file '%s'.", filename);
154 }
155 else
156 error("Cannot allocate PRIVATE ANONYMOUS memory for KSM for file '%s'.", filename);
src/plugin_nfacct.c
+2
@@ -119,6 +119,8 @@ void *nfacct_main(void *ptr) {
119 // ------------------------------------------------------------------------
120
121 while(1) {
122 + if(unlikely(netdata_exit)) break;
123 +
124 seq++;
125
126 nlh = nfacct_nlmsg_build_hdr(buf, NFNL_MSG_ACCT_GET, NLM_F_DUMP, seq);
src/plugin_proc.c
+4
@@ -13,6 +13,7 @@
13 #include "log.h"
14 #include "rrd.h"
15 #include "plugin_proc.h"
16 +#include "main.h"
17
18 void *proc_main(void *ptr)
19 {
@@ -59,6 +60,7 @@ void *proc_main(void *ptr)
60
61 unsigned long long usec = 0, susec = 0;
62 for(;1;) {
63 + if(unlikely(netdata_exit)) break;
64
65 // BEGIN -- the job to be done
66
@@ -129,6 +131,8 @@ void *proc_main(void *ptr)
131
132 // END -- the job is done
133
134 + if(unlikely(netdata_exit)) break;
135 +
136 // find the time to sleep in order to wait exactly update_every seconds
137 gettimeofday(&now, NULL);
138 usec = usecdiff(&now, &last) - susec;
src/plugin_tc.c
+3 -1
@@ -509,6 +509,8 @@ void *tc_main(void *ptr)
509 uint32_t first_hash;
510
511 for(;1;) {
512 + if(unlikely(netdata_exit)) break;
513 +
514 FILE *fp;
515 struct tc_device *device = NULL;
516 struct tc_class *class = NULL;
@@ -523,7 +525,7 @@ void *tc_main(void *ptr)
525 }
526
527 while(fgets(buffer, TC_LINE_MAX, fp) != NULL) {
526 - if(netdata_exit) break;
528 + if(unlikely(netdata_exit)) break;
529
530 buffer[TC_LINE_MAX] = '\0';
531 // debug(D_TC_LOOP, "TC: read '%s'", buffer);
src/plugins_d.c
+5 -3
@@ -125,6 +125,8 @@ void *pluginsd_worker_thread(void *arg)
125 #endif
126
127 while(likely(1)) {
128 + if(unlikely(netdata_exit)) break;
129 +
130 FILE *fp = mypopen(cd->cmd, &cd->pid);
131 if(unlikely(!fp)) {
132 error("Cannot popen(\"%s\", \"r\").", cd->cmd);
@@ -139,7 +141,7 @@ void *pluginsd_worker_thread(void *arg)
141 uint32_t hash;
142
143 while(likely(fgets(line, PLUGINSD_LINE_MAX, fp) != NULL)) {
142 - if(netdata_exit) break;
144 + if(unlikely(netdata_exit)) break;
145
146 line[PLUGINSD_LINE_MAX] = '\0';
147
@@ -439,7 +441,7 @@ void *pluginsd_main(void *ptr)
441 if(scan_frequency < 1) scan_frequency = 1;
442
443 while(likely(1)) {
442 - if(netdata_exit) break;
444 + if(unlikely(netdata_exit)) break;
445
446 dir = opendir(dir_name);
447 if(unlikely(!dir)) {
@@ -448,7 +450,7 @@ void *pluginsd_main(void *ptr)
450 }
451
452 while(likely((file = readdir(dir)))) {
451 - if(netdata_exit) break;
453 + if(unlikely(netdata_exit)) break;
454
455 debug(D_PLUGINSD, "PLUGINSD: Examining file '%s'", file->d_name);
456
web/Makefile.am
+1
@@ -7,6 +7,7 @@ dist_web_DATA = \
7 robots.txt \
8 index.html \
9 demo.html \
10 + demo2.html \
11 dashboard.html \
12 dashboard.js \
13 dashboard.css \
web/dashboard.html
+7 -7
@@ -598,7 +598,7 @@ C3 charts are not usable in large scale. They suffer from the following issues:
598 <li>lack of a <code>raw</code> data format, so every time a chart is updated, data convertion in javascript is required</li>
599 <li>lack of <code>stacked</code> charts support</li>
600 </ul>
601 -So, we avoid flashing the charts, here we destroy and re-create the charts on each update. Also, since they manipulate the data with javascript we were forced to lower the detail they render to get acceptable results.
601 +So, to avoid flashing the charts, we destroy and re-create the charts on each update. Also, since they manipulate the data with javascript we were forced to lower the detail they render to get acceptable speeds.
602 <br/>
603 <div style="width: 33%; display: inline-block;">
604 <div data-netdata="system.processes"
@@ -606,10 +606,10 @@ So, we avoid flashing the charts, here we destroy and re-create the charts on ea
606 data-width="100%"
607 data-height="200"
608 data-after="-300"
609 - data-dt-element-name="time701"
609 + data-dt-element-name="time801"
610 ></div>
611 <br/>
612 - <small>rendered in <span id="time701">X</span> ms</small>
612 + <small>rendered in <span id="time801">X</span> ms</small>
613 </div>
614 <div style="width: 33%; display: inline-block;">
615 <div data-netdata="system.ipv4"
@@ -617,10 +617,10 @@ So, we avoid flashing the charts, here we destroy and re-create the charts on ea
617 data-width="100%"
618 data-height="200"
619 data-after="-300"
620 - data-dt-element-name="time702"
620 + data-dt-element-name="time802"
621 ></div>
622 <br/>
623 - <small>rendered in <span id="time702">X</span> ms</small>
623 + <small>rendered in <span id="time802">X</span> ms</small>
624 </div>
625 <div style="width: 33%; display: inline-block;">
626 <div data-netdata="system.cpu"
@@ -628,10 +628,10 @@ So, we avoid flashing the charts, here we destroy and re-create the charts on ea
628 data-width="100%"
629 data-height="200"
630 data-after="-300"
631 - data-dt-element-name="time703"
631 + data-dt-element-name="time803"
632 ></div>
633 <br/>
634 - <small>rendered in <span id="time703">X</span> ms</small>
634 + <small>rendered in <span id="time803">X</span> ms</small>
635 </div>
636
637
web/dashboard.js
+66 -51
@@ -216,6 +216,8 @@
216
217 smooth_plot: true, // enable smooth plot, where possible
218
219 + charts_selection_animation_delay: 50, // delay to animate charts when syncing selection
220 +
221 color_fill_opacity_line: 1.0,
222 color_fill_opacity_area: 0.2,
223 color_fill_opacity_stacked: 0.8,
@@ -1886,7 +1888,7 @@
1888 }
1889
1890 var show_undefined = true;
1889 - if(Math.abs(this.data.last_entry - this.data.before) <= this.data.view_update_every)
1891 + if(Math.abs(this.netdata_last - this.view_before) <= this.data_update_every)
1892 show_undefined = false;
1893
1894 if(show_undefined) {
@@ -1894,7 +1896,7 @@
1896 return;
1897 }
1898
1897 - this.legendSetDate(this.data.before * 1000);
1899 + this.legendSetDate(this.view_before);
1900
1901 var labels = this.data.dimension_names;
1902 var i = labels.length;
@@ -1944,17 +1946,24 @@
1946
1947 this.colors = new Array();
1948 this.colors_available = new Array();
1947 - // this.colors_assigned = {};
1949
1950 var c = $(this.element).data('colors');
1951 + // this.log('read colors: ' + c);
1952 if(typeof c !== 'undefined' && c !== null) {
1953 if(typeof c !== 'string') {
1954 this.log('invalid color given: ' + c + ' (give a space separated list of colors)');
1955 }
1956 else {
1957 c = c.split(' ');
1956 - for(var i = 0, len = c.length; i < len ; i++)
1957 - this.colors_available.push(c[i]);
1958 + var added = 0;
1959 +
1960 + while(added < 20) {
1961 + for(var i = 0, len = c.length; i < len ; i++) {
1962 + added++;
1963 + this.colors_available.push(c[i]);
1964 + // this.log('adding color: ' + c[i]);
1965 + }
1966 + }
1967 }
1968 }
1969
@@ -1996,9 +2005,9 @@
2005
2006 // do we have to update the current values?
2007 // we do this, only when the visible chart is current
1999 - if(Math.abs(this.data.last_entry - this.data.before) <= this.data.view_update_every) {
2008 + if(Math.abs(this.netdata_last - this.view_before) <= this.data_update_every) {
2009 if(this.debug === true)
2001 - this.log('chart in running... updating values on legend...');
2010 + this.log('chart is in latest position... updating values on legend...');
2011
2012 //var labels = this.data.dimension_names;
2013 //var i = labels.length;
@@ -2015,6 +2024,7 @@
2024 this._chartDimensionColor(this.chart.dimensions[dim].name);
2025 }
2026 // we will re-generate the colors for the chart
2027 + // based on the selected dimensions
2028 this.colors = null;
2029
2030 if(this.debug === true)
@@ -2332,12 +2342,12 @@
2342
2343 if(NETDATA.options.current.pan_and_zoom_data_padding === true && this.requested_padding !== null) {
2344 if(this.view_after < this.data_after) {
2335 - console.log('adusting view_after from ' + this.view_after + ' to ' + this.data_after);
2345 + // console.log('adusting view_after from ' + this.view_after + ' to ' + this.data_after);
2346 this.view_after = this.data_after;
2347 }
2348
2349 if(this.view_before > this.data_before) {
2340 - console.log('adusting view_before from ' + this.view_before + ' to ' + this.data_before);
2350 + // console.log('adusting view_before from ' + this.view_before + ' to ' + this.data_before);
2351 this.view_before = this.data_before;
2352 }
2353 }
@@ -3273,14 +3283,14 @@
3283 }
3284
3285 return true;
3276 - }
3286 + };
3287
3288 NETDATA.dygraphClearSelection = function(state, t) {
3289 if(typeof state.dygraph_instance !== 'undefined') {
3290 state.dygraph_instance.clearSelection();
3291 }
3292 return true;
3283 - }
3293 + };
3294
3295 NETDATA.dygraphSmoothInitialize = function(callback) {
3296 $.ajax({
@@ -3521,14 +3531,11 @@
3531 if(NETDATA.options.debug.dygraph === true)
3532 state.log('dygraphDrawCallback()');
3533
3524 - var first = state.data.first_entry * 1000;
3525 - var last = state.data.last_entry * 1000;
3526 -
3534 var x_range = dygraph.xAxisRange();
3535 var after = Math.round(x_range[0]);
3536 var before = Math.round(x_range[1]);
3537
3531 - if(before <= last && after >= first)
3538 + if(before <= state.netdata_last && after >= state.netdata_first)
3539 state.updateChartPanOrZoom(after, before);
3540 }
3541 },
@@ -3739,8 +3746,8 @@
3746 var after = new_x_range[0];
3747 var before = new_x_range[1];
3748
3742 - var first = (state.data.first_entry + state.data.view_update_every) * 1000;
3743 - var last = (state.data.last_entry + state.data.view_update_every) * 1000;
3749 + var first = state.netdata_first + state.data_update_every;
3750 + var last = state.netdata_last + state.data_update_every;
3751
3752 if(before > last) {
3753 after -= (before - last);
@@ -4319,10 +4326,10 @@
4326 };
4327
4328 NETDATA.easypiechartSetSelection = function(state, t) {
4322 - if(t < state.data_after || t > state.data_before)
4329 + if(state.timeIsVisible(t) !== true)
4330 return NETDATA.easypiechartClearSelection(state);
4331
4325 - var slot = Math.floor(state.data.result.length - 1 - (t - state.data_after) / state.data_update_every);
4332 + var slot = state.calculateRowForTime(t);
4333 if(slot < 0 || slot >= state.data.result.length)
4334 return NETDATA.easypiechartClearSelection(state);
4335
@@ -4334,7 +4341,7 @@
4341 };
4342 }
4343
4337 - var value = state.data.result[slot];
4344 + var value = state.data.result[state.data.result.length - 1 - slot];
4345 var max = (state.easyPieChartMax === null)?state.data.max:state.easyPieChartMax;
4346 var pcent = NETDATA.percentFromValueMax(value, max);
4347
@@ -4348,7 +4355,7 @@
4355 state.easyPieChartEvent.timer = setTimeout(function() {
4356 state.easyPieChartEvent.timer = null;
4357 state.easyPieChart_instance.update(state.easyPieChartEvent.pcent);
4351 - }, 100);
4358 + }, NETDATA.options.current.charts_selection_animation_delay);
4359 }
4360
4361 return true;
@@ -4507,26 +4514,25 @@
4514 if(typeof max !== 'number') max = 0;
4515 if(value > max) max = value;
4516 if(value < min) min = value;
4517 + if(min > max) {
4518 + var t = min;
4519 + min = max;
4520 + max = t;
4521 + }
4522 + else if(min == max)
4523 + max = min + 1;
4524
4511 - var dvalue = state.gauge_instance.displayedValue;
4525 + // gauge.js has an issue if the needle
4526 + // is smaller than min or larger than max
4527 + // when we set the new values
4528 + // the needle will go crazy
4529
4513 - if(dvalue >= min && dvalue <= max) {
4514 - state.gauge_instance.minValue = min;
4515 - state.gauge_instance.maxValue = max;
4516 - state.gauge_instance.set(value);
4517 - }
4518 - else {
4519 - // the current display value of the gauge
4520 - // is outside min-max.
4521 - // we have to disable animation
4522 - // otherwise, the gauge will go crazy
4523 - var old_speed = state.___gaugeOld__.speed;
4524 - NETDATA.gaugeAnimation(state, false);
4525 - state.gauge_instance.minValue = min;
4526 - state.gauge_instance.maxValue = max;
4527 - state.gauge_instance.set(value);
4528 - NETDATA.gaugeAnimation(state, old_speed);
4529 - }
4530 + // to prevent it, we always feed it
4531 + // with a percentage, so that the needle
4532 + // is always between min and max
4533 + var pcent = (value - min) * 100 / (max - min);
4534 +
4535 + state.gauge_instance.set(pcent);
4536
4537 state.___gaugeOld__.value = value;
4538 state.___gaugeOld__.min = min;
@@ -4570,10 +4576,10 @@
4576 };
4577
4578 NETDATA.gaugeSetSelection = function(state, t) {
4573 - if(t < state.data_after || t > state.data_before)
4579 + if(state.timeIsVisible(t) !== true)
4580 return NETDATA.gaugeClearSelection(state);
4581
4576 - var slot = Math.floor(state.data.result.length - 1 - (t - state.data_after) / state.data_update_every);
4582 + var slot = state.calculateRowForTime(t);
4583 if(slot < 0 || slot >= state.data.result.length)
4584 return NETDATA.gaugeClearSelection(state);
4585
@@ -4586,7 +4592,7 @@
4592 };
4593 }
4594
4589 - var value = state.data.result[slot];
4595 + var value = state.data.result[state.data.result.length - 1 - slot];
4596 var max = (state.gaugeMax === null)?state.data.max:state.gaugeMax;
4597 var min = 0;
4598
@@ -4601,7 +4607,7 @@
4607 state.gaugeEvent.timer = setTimeout(function() {
4608 state.gaugeEvent.timer = null;
4609 NETDATA.gaugeSet(state, state.gaugeEvent.value, state.gaugeEvent.min, state.gaugeEvent.max);
4604 - }, 100);
4610 + }, NETDATA.options.current.charts_selection_animation_delay);
4611 }
4612
4613 return true;
@@ -4635,7 +4641,12 @@
4641 var value = data.result[0];
4642 var max = self.data('gauge-max-value') || null;
4643 var adjust = self.data('gauge-adjust') || null;
4638 -
4644 + var pointerColor = self.data('gauge-pointer-color') || '#C0C0C0';
4645 + var strokeColor = self.data('gauge-stroke-color') || '#F0F0F0';
4646 + var startColor = self.data('gauge-start-color') || state.chartColors()[0];
4647 + var stopColor = self.data('gauge-stop-color') || void 0;
4648 + var generateGradient = self.data('gauge-generate-gradient') || false;
4649 +
4650 if(max === null) {
4651 max = data.max;
4652 state.gaugeMax = null;
@@ -4661,13 +4672,13 @@
4672 pointer: {
4673 length: 0.8, // 0.9 The radius of the inner circle
4674 strokeWidth: 0.035, // The rotation offset
4664 - color: '#C0C0C0' // Fill color
4675 + color: pointerColor // Fill color
4676 },
4666 - colorStart: state.chartColors()[0], // Colors
4667 - colorStop: void 0, // just experiment with them
4668 - strokeColor: '#F0F0F0', // to see which ones work best for you
4677 + colorStart: startColor, // Colors
4678 + colorStop: stopColor, // just experiment with them
4679 + strokeColor: strokeColor, // to see which ones work best for you
4680 limitMax: true,
4670 - generateGradient: false,
4681 + generateGradient: generateGradient,
4682 gradientType: 0,
4683 percentColors: [
4684 [0.0, NETDATA.colorLuminance(state.chartColors()[0], (lum_d * 10) - (lum_d * 0))],
@@ -4742,6 +4753,10 @@
4753 maxLabel: null
4754 };
4755
4756 + // we will always feed a percentage
4757 + state.gauge_instance.minValue = 0;
4758 + state.gauge_instance.maxValue = 100;
4759 +
4760 NETDATA.gaugeAnimation(state, animate);
4761 NETDATA.gaugeSet(state, value, 0, max);
4762 NETDATA.gaugeSetLabels(state, value, 0, max);
@@ -4927,7 +4942,7 @@
4942 legend: function(state) { return null; },
4943 autoresize: function(state) { return false; },
4944 max_updates_to_recreate: function(state) { return 5000; },
4930 - track_colors: function(state) { return false; },
4945 + track_colors: function(state) { return true; },
4946 pixels_per_point: function(state) { return 3; },
4947 aspect_ratio: 100
4948 },
@@ -4945,7 +4960,7 @@
4960 legend: function(state) { return null; },
4961 autoresize: function(state) { return false; },
4962 max_updates_to_recreate: function(state) { return 5000; },
4948 - track_colors: function(state) { return false; },
4963 + track_colors: function(state) { return true; },
4964 pixels_per_point: function(state) { return 3; },
4965 aspect_ratio: 70
4966 }
web/demo2.html new
+97
@@ -0,0 +1,97 @@
1 +<!DOCTYPE html>
2 +<html lang="en">
3 +<head>
4 + <title>NetData Dashboard</title>
5 +
6 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7 + <meta charset="utf-8">
8 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
9 + <meta name="viewport" content="width=device-width, initial-scale=1">
10 + <meta name="apple-mobile-web-app-capable" content="yes">
11 + <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
12 + <meta name="author" content="costa@tsaousis.gr">
13 +
14 + <style>
15 + .easyPieChartLabel {
16 + color: #222 !important;
17 + font-weight: normal;
18 + text-shadow: #333 0px 0px 1px !important;
19 + -webkit-font-smoothing: none;
20 + }
21 + </style>
22 +
23 + <script type="text/javascript" src="dashboard.js"></script>
24 +</head>
25 +<body style="background-color: #444;">
26 +
27 +<div style="width: 100%; padding-top: 10px; text-align: center; color: #AAA">
28 + <div style="font-size: 8vw;">why netdata?</div>
29 + <br/>
30 + <div style="font-size: 2vw;">These charts update the same data...</div>
31 + <div data-netdata="example.random"
32 + data-dimensions="random1"
33 + data-chart-library="easypiechart"
34 + data-easypiechart-max-value="100"
35 + data-width="25%"
36 + data-after="-600"
37 + data-points="600"
38 + data-title="1/second (netdata&nbsp;default)"
39 + data-units="something"
40 + data-colors="#CCC"
41 + data-easypiechart-trackcolor="#555"
42 + data-easypiechart-scalecolor="#555"
43 + ></div>
44 + <div data-netdata="example.random"
45 + data-dimensions="random1"
46 + data-chart-library="easypiechart"
47 + data-easypiechart-max-value="100"
48 + data-width="20%"
49 + data-after="-600"
50 + data-points="300"
51 + data-title="Updates Every 2&nbsp;Seconds"
52 + data-units="something"
53 + data-colors="#AAA"
54 + data-easypiechart-trackcolor="#555"
55 + data-easypiechart-scalecolor="#555"
56 + ></div>
57 + <div data-netdata="example.random"
58 + data-dimensions="random1"
59 + data-chart-library="easypiechart"
60 + data-easypiechart-max-value="100"
61 + data-width="17.5%"
62 + data-after="-600"
63 + data-points="120"
64 + data-title="Updates Every 5&nbsp;Seconds"
65 + data-units="something"
66 + data-colors="#999"
67 + data-easypiechart-trackcolor="#555"
68 + data-easypiechart-scalecolor="#555"
69 + ></div>
70 + <div data-netdata="example.random"
71 + data-dimensions="random1"
72 + data-chart-library="easypiechart"
73 + data-easypiechart-max-value="100"
74 + data-width="15%"
75 + data-after="-600"
76 + data-points="10"
77 + data-title="Updates Every 1&nbsp;Minute"
78 + data-units="something"
79 + data-colors="#888"
80 + data-easypiechart-trackcolor="#555"
81 + data-easypiechart-scalecolor="#555"
82 + ></div>
83 + <div style="font-size: 2vw;">Hover on the peaks and the lows of the chart below, to see the diff on the charts above!</div>
84 + <div data-netdata="example.random"
85 + data-dimensions="random1"
86 + data-dygraph-theme="sparkline"
87 + data-width="90%"
88 + data-height="20vh"
89 + data-after="-600"
90 + data-points="600"
91 + data-title="1/second (netdata&nbsp;default)"
92 + data-units="something"
93 + data-colors="#CCC"
94 + ></div>
95 +</div>
96 +</body>
97 +</html>
web/index.html
-8
@@ -979,7 +979,6 @@ function prepareScreen(data) {
979 + ' data-before="0"'
980 + ' data-after="-' + duration.toString() + '"'
981 + ' data-points="' + duration.toString() + '"'
982 - + ' data-colors="' + NETDATA.colors[0] + '"'
982 + ' role="application"></div>';
983
984 head += '<div data-netdata="' + f.id + '"'
@@ -991,7 +990,6 @@ function prepareScreen(data) {
990 + ' data-before="0"'
991 + ' data-after="-' + duration.toString() + '"'
992 + ' data-points="' + duration.toString() + '"'
994 - + ' data-colors="' + NETDATA.colors[1] + '"'
993 + ' role="application"></div>';
994 break;
995
@@ -1063,7 +1061,6 @@ function prepareScreen(data) {
1061 + ' data-before="0"'
1062 + ' data-after="-' + duration.toString() + '"'
1063 + ' data-points="' + duration.toString() + '"'
1066 - + ' data-colors="' + NETDATA.colors[0] + '"'
1064 + ' role="application"></div>';
1065
1066 head += '<div data-netdata="' + f.id + '"'
@@ -1075,7 +1072,6 @@ function prepareScreen(data) {
1072 + ' data-before="0"'
1073 + ' data-after="-' + duration.toString() + '"'
1074 + ' data-points="' + duration.toString() + '"'
1078 - + ' data-colors="' + NETDATA.colors[1] + '"'
1075 + ' role="application"></div>';
1076 break;
1077 case 'disk_backlog': c = '#DD4477'; break;
@@ -1159,7 +1155,6 @@ function prepareScreen(data) {
1155 + ' data-before="0"'
1156 + ' data-after="-' + duration.toString() + '"'
1157 + ' data-points="' + duration.toString() + '"'
1162 - + ' data-colors="' + NETDATA.colors[0] + '"'
1158 + ' role="application"></div>';
1159
1160 head += '<div style="margin-right: 10px;" data-netdata="system.io"'
@@ -1171,7 +1166,6 @@ function prepareScreen(data) {
1166 + ' data-before="0"'
1167 + ' data-after="-' + duration.toString() + '"'
1168 + ' data-points="' + duration.toString() + '"'
1174 - + ' data-colors="' + NETDATA.colors[1] + '"'
1169 + ' role="application"></div>';
1170 }
1171
@@ -1197,7 +1191,6 @@ function prepareScreen(data) {
1191 + ' data-before="0"'
1192 + ' data-after="-' + duration.toString() + '"'
1193 + ' data-points="' + duration.toString() + '"'
1200 - + ' data-colors="' + NETDATA.colors[0] + '"'
1194 + ' role="application"></div>';
1195
1196 head += '<div style="margin-right: 10px;" data-netdata="system.ipv4"'
@@ -1209,7 +1202,6 @@ function prepareScreen(data) {
1202 + ' data-before="0"'
1203 + ' data-after="-' + duration.toString() + '"'
1204 + ' data-points="' + duration.toString() + '"'
1212 - + ' data-colors="' + NETDATA.colors[1] + '"'
1205 + ' role="application"></div>';
1206 }
1207