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 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 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 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 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 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