added support for giving duration in microseconds per plugin
Costa Tsaousis (ktsaou) committed
May 12, 2014 at 01:17 UTC
6b21dd924c3f9fa908551e92db26dcd781894281
4 files changed
+169
-100
apps_plugin.c
+59
-46
@@ -869,12 +869,44 @@ void update_statistics(void)
869
}
870
}
871
872
+unsigned long long usecdiff(struct timeval *now, struct timeval *last) {
873
+ return ((((now->tv_sec * 1000000ULL) + now->tv_usec) - ((last->tv_sec * 1000000ULL) + last->tv_usec)));
874
+}
875
876
void show_dimensions(void)
877
{
878
+ static struct timeval last = { 0, 0 };
879
+ static struct rusage me_last;
880
+
881
struct target *w;
882
+ struct timeval now;
883
+ struct rusage me;
884
+
885
+ unsigned long long usec;
886
+ unsigned long long cpuuser;
887
+ unsigned long long cpusyst;
888
+
889
+ if(!last.tv_sec) {
890
+ gettimeofday(&last, NULL);
891
+ getrusage(RUSAGE_SELF, &me_last);
892
+
893
+ usec = update_every * 1000000ULL;
894
+ cpuuser = 0;
895
+ cpusyst = 0;
896
+ }
897
+ else {
898
+ gettimeofday(&now, NULL);
899
+ getrusage(RUSAGE_SELF, &me);
900
+
901
+ usec = usecdiff(&now, &last);
902
+ cpuuser = me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec;
903
+ cpusyst = me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec;
904
+
905
+ bcopy(&now, &last, sizeof(struct timeval));
906
+ bcopy(&me, &me_last, sizeof(struct rusage));
907
+ }
908
877
- fprintf(stdout, "BEGIN apps.cpu\n");
909
+ fprintf(stdout, "BEGIN apps.cpu %llu\n", usec);
910
for (w = target_root; w ; w = w->next) {
911
if(w->target || (!w->processes && !w->exposed)) continue;
912
@@ -882,7 +914,7 @@ void show_dimensions(void)
914
}
915
fprintf(stdout, "END\n");
916
885
- fprintf(stdout, "BEGIN apps.cpu_user\n");
917
+ fprintf(stdout, "BEGIN apps.cpu_user %llu\n", usec);
918
for (w = target_root; w ; w = w->next) {
919
if(w->target || (!w->processes && !w->exposed)) continue;
920
@@ -890,7 +922,7 @@ void show_dimensions(void)
922
}
923
fprintf(stdout, "END\n");
924
893
- fprintf(stdout, "BEGIN apps.cpu_system\n");
925
+ fprintf(stdout, "BEGIN apps.cpu_system %llu\n", usec);
926
for (w = target_root; w ; w = w->next) {
927
if(w->target || (!w->processes && !w->exposed)) continue;
928
@@ -898,7 +930,7 @@ void show_dimensions(void)
930
}
931
fprintf(stdout, "END\n");
932
901
- fprintf(stdout, "BEGIN apps.threads\n");
933
+ fprintf(stdout, "BEGIN apps.threads %llu\n", usec);
934
for (w = target_root; w ; w = w->next) {
935
if(w->target || (!w->processes && !w->exposed)) continue;
936
@@ -906,7 +938,7 @@ void show_dimensions(void)
938
}
939
fprintf(stdout, "END\n");
940
909
- fprintf(stdout, "BEGIN apps.processes\n");
941
+ fprintf(stdout, "BEGIN apps.processes %llu\n", usec);
942
for (w = target_root; w ; w = w->next) {
943
if(w->target || (!w->processes && !w->exposed)) continue;
944
@@ -914,7 +946,7 @@ void show_dimensions(void)
946
}
947
fprintf(stdout, "END\n");
948
917
- fprintf(stdout, "BEGIN apps.mem\n");
949
+ fprintf(stdout, "BEGIN apps.mem %llu\n", usec);
950
for (w = target_root; w ; w = w->next) {
951
if(w->target || (!w->processes && !w->exposed)) continue;
952
@@ -922,7 +954,7 @@ void show_dimensions(void)
954
}
955
fprintf(stdout, "END\n");
956
925
- fprintf(stdout, "BEGIN apps.minor_faults\n");
957
+ fprintf(stdout, "BEGIN apps.minor_faults %llu\n", usec);
958
for (w = target_root; w ; w = w->next) {
959
if(w->target || (!w->processes && !w->exposed)) continue;
960
@@ -930,7 +962,7 @@ void show_dimensions(void)
962
}
963
fprintf(stdout, "END\n");
964
933
- fprintf(stdout, "BEGIN apps.major_faults\n");
965
+ fprintf(stdout, "BEGIN apps.major_faults %llu\n", usec);
966
for (w = target_root; w ; w = w->next) {
967
if(w->target || (!w->processes && !w->exposed)) continue;
968
@@ -938,7 +970,7 @@ void show_dimensions(void)
970
}
971
fprintf(stdout, "END\n");
972
941
- fprintf(stdout, "BEGIN apps.lreads\n");
973
+ fprintf(stdout, "BEGIN apps.lreads %llu\n", usec);
974
for (w = target_root; w ; w = w->next) {
975
if(w->target || (!w->processes && !w->exposed)) continue;
976
@@ -946,7 +978,7 @@ void show_dimensions(void)
978
}
979
fprintf(stdout, "END\n");
980
949
- fprintf(stdout, "BEGIN apps.lwrites\n");
981
+ fprintf(stdout, "BEGIN apps.lwrites %llu\n", usec);
982
for (w = target_root; w ; w = w->next) {
983
if(w->target || (!w->processes && !w->exposed)) continue;
984
@@ -954,7 +986,7 @@ void show_dimensions(void)
986
}
987
fprintf(stdout, "END\n");
988
957
- fprintf(stdout, "BEGIN apps.preads\n");
989
+ fprintf(stdout, "BEGIN apps.preads %llu\n", usec);
990
for (w = target_root; w ; w = w->next) {
991
if(w->target || (!w->processes && !w->exposed)) continue;
992
@@ -962,7 +994,7 @@ void show_dimensions(void)
994
}
995
fprintf(stdout, "END\n");
996
965
- fprintf(stdout, "BEGIN apps.pwrites\n");
997
+ fprintf(stdout, "BEGIN apps.pwrites %llu\n", usec);
998
for (w = target_root; w ; w = w->next) {
999
if(w->target || (!w->processes && !w->exposed)) continue;
1000
@@ -970,6 +1002,14 @@ void show_dimensions(void)
1002
}
1003
fprintf(stdout, "END\n");
1004
1005
+ fprintf(stdout, "BEGIN netdata.apps_cpu %llu\n", usec);
1006
+ fprintf(stdout, "SET user = %llu\n", cpuuser);
1007
+ fprintf(stdout, "SET system = %llu\n", cpusyst);
1008
+ fprintf(stdout, "END\n");
1009
+ fprintf(stdout, "BEGIN netdata.apps_files %llu\n", usec);
1010
+ fprintf(stdout, "SET files = %llu\n", file_counter);
1011
+ fprintf(stdout, "END\n");
1012
+
1013
fflush(stdout);
1014
}
1015
@@ -1074,6 +1114,13 @@ void show_charts(void)
1114
fprintf(stdout, "DIMENSION %s '' incremental 1 1024\n", w->name);
1115
}
1116
1117
+ fprintf(stdout, "CHART netdata.apps_cpu '' 'Apps Plugin CPU' 'milliseconds/s' netdata netdata stacked 10000 %d\n", update_every);
1118
+ fprintf(stdout, "DIMENSION user '' incremental 1 1000\n");
1119
+ fprintf(stdout, "DIMENSION system '' incremental 1 1000\n");
1120
+
1121
+ fprintf(stdout, "CHART netdata.apps_files '' 'Apps Plugin Files' 'files/s' netdata netdata line 10001 %d\n", update_every);
1122
+ fprintf(stdout, "DIMENSION files '' incremental 1 1\n");
1123
+
1124
fflush(stdout);
1125
}
1126
@@ -1130,10 +1177,6 @@ long get_pid_max(void)
1177
return mpid;
1178
}
1179
1133
-unsigned long long usecdiff(struct timeval *now, struct timeval *last) {
1134
- return ((((now->tv_sec * 1000000ULL) + now->tv_usec) - ((last->tv_sec * 1000000ULL) + last->tv_usec)));
1135
-}
1136
-
1180
int main(int argc, char **argv)
1181
{
1182
Hertz = get_hertz();
@@ -1149,13 +1192,10 @@ int main(int argc, char **argv)
1192
exit(1);
1193
}
1194
1152
- int created_usage_chart = 0;
1153
- struct rusage me, me_last;
1195
unsigned long long counter = 1;
1196
unsigned long long usec = 0, susec = 0;
1197
struct timeval last, now;
1198
gettimeofday(&last, NULL);
1158
- getrusage(RUSAGE_SELF, &me_last);
1199
1200
for(;1; counter++) {
1201
if(!update_from_proc()) {
@@ -1168,37 +1208,10 @@ int main(int argc, char **argv)
1208
show_charts(); // this is smart enough to show only newly added apps, when needed
1209
show_dimensions();
1210
1171
- if(getrusage(RUSAGE_SELF, &me) == 0) {
1172
- unsigned long long cpuuser = me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec;
1173
- unsigned long long cpusyst = me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec;
1174
-
1175
- if(!created_usage_chart) {
1176
- created_usage_chart = 1;
1177
- fprintf(stdout, "CHART netdata.apps_cpu '' 'Apps Plugin CPU' 'milliseconds/s' netdata netdata stacked 10000 %d\n", update_every);
1178
- fprintf(stdout, "DIMENSION user '' incremental 1 1000\n");
1179
- fprintf(stdout, "DIMENSION system '' incremental 1 1000\n");
1180
-
1181
- fprintf(stdout, "CHART netdata.apps_files '' 'Apps Plugin Files' 'files/s' netdata netdata line 10001 %d\n", update_every);
1182
- fprintf(stdout, "DIMENSION files '' incremental 1 1\n");
1183
- }
1184
-
1185
- fprintf(stdout, "BEGIN netdata.apps_cpu\n");
1186
- fprintf(stdout, "SET user = %llu\n", cpuuser);
1187
- fprintf(stdout, "SET system = %llu\n", cpusyst);
1188
- fprintf(stdout, "END\n");
1189
-
1190
- fprintf(stdout, "BEGIN netdata.apps_files\n");
1191
- fprintf(stdout, "SET files = %llu\n", file_counter);
1192
- fprintf(stdout, "END\n");
1193
-
1194
- bcopy(&me, &me_last, sizeof(struct rusage));
1195
- }
1196
-
1211
if(debug) fprintf(stderr, "Done Loop No %llu\n", counter);
1212
fflush(NULL);
1213
1214
gettimeofday(&now, NULL);
1201
-
1215
usec = usecdiff(&now, &last) - susec;
1216
if(debug) fprintf(stderr, "last loop took %llu usec (worked for %llu, sleeped for %llu).\n", usec + susec, usec, susec);
1217
charts.d/squid.chart.sh
+4
-4
@@ -49,24 +49,24 @@ squid_update() {
49
50
# write the result of the work.
51
cat <<VALUESEOF
52
-BEGIN squid.clients_net
52
+BEGIN squid.clients_net $1
53
SET client_http_kbytes_in = $client_http_kbytes_in
54
SET client_http_kbytes_out = $client_http_kbytes_out
55
SET client_http_hit_kbytes_out = $client_http_hit_kbytes_out
56
END
57
58
-BEGIN squid.clients_requests
58
+BEGIN squid.clients_requests $1
59
SET client_http_requests = $client_http_requests
60
SET client_http_hits = $client_http_hits
61
SET client_http_errors = $client_http_errors
62
END
63
64
-BEGIN squid.servers_net
64
+BEGIN squid.servers_net $1
65
SET server_all_kbytes_in = $server_all_kbytes_in
66
SET server_all_kbytes_out = $server_all_kbytes_out
67
END
68
69
-BEGIN squid.servers_requests
69
+BEGIN squid.servers_requests $1
70
SET server_all_requests = $server_all_requests
71
SET server_all_errors = $server_all_errors
72
END
netdata.c
+71
-31
@@ -1039,6 +1039,7 @@ struct rrd_stats {
1039
1040
pthread_mutex_t mutex;
1041
unsigned long counter; // the number of times we added values to this rrd
1042
+ unsigned long counter_since_reload; // the number of times we added values to this rrd
1043
1044
int mapped; // if set to 1, this is memory mapped
1045
unsigned long memsize; // how much mem we have allocated for this (without dimensions)
@@ -1056,6 +1057,7 @@ struct rrd_stats {
1057
int update_every; // every how many seconds is this updated?
1058
unsigned long long first_entry_t; // the timestamp (in microseconds) of the oldest entry in the db
1059
struct timeval last_updated; // when this data set was last updated
1060
+ struct timeval next_update;
1061
unsigned long long usec_since_last_update;
1062
1063
total_number absolute_total;
@@ -1226,6 +1228,12 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name,
1228
st->priority = config_get_number(st->id, "priority", priority);
1229
st->enabled = enabled;
1230
1231
+ st->debug = 0;
1232
+ st->counter_since_reload = 0;
1233
+
1234
+ // initialize the next update
1235
+ if(!st->next_update.tv_sec) gettimeofday(&st->next_update, NULL);
1236
+
1237
pthread_mutex_init(&st->mutex, NULL);
1238
pthread_mutex_lock(&root_mutex);
1239
@@ -1477,7 +1485,7 @@ int rrd_stats_dimension_set(RRD_STATS *st, char *id, collected_number value)
1485
return 0;
1486
}
1487
1480
-void rrd_stats_next(RRD_STATS *st)
1488
+void rrd_stats_next_usec(RRD_STATS *st, unsigned long long microseconds)
1489
{
1490
// lock it to work with the dimensions
1491
pthread_mutex_lock(&st->mutex);
@@ -1495,16 +1503,48 @@ void rrd_stats_next(RRD_STATS *st)
1503
st->absolute_total = 0;
1504
st->current_entry = ((st->current_entry + 1) >= st->entries) ? 0 : st->current_entry + 1;
1505
1506
+ st->usec_since_last_update = microseconds;
1507
+ if(!st->last_updated.tv_sec) gettimeofday(&st->next_update, NULL);
1508
+ else {
1509
+ unsigned long long usec = st->last_updated.tv_sec * 1000000ULL + st->last_updated.tv_usec;
1510
+ usec += microseconds;
1511
+
1512
+ st->next_update.tv_sec = usec / 1000000ULL;
1513
+ st->next_update.tv_usec = usec % 1000000ULL;
1514
+
1515
+ }
1516
+
1517
pthread_mutex_unlock(&st->mutex);
1518
1519
return;
1520
}
1521
1503
-unsigned long long rrd_stats_done(RRD_STATS *st)
1522
+void rrd_stats_next(RRD_STATS *st)
1523
+{
1524
+ if(st->last_updated.tv_sec) {
1525
+ struct timeval now;
1526
+ gettimeofday(&now, NULL);
1527
+ unsigned long long microseconds = usecdiff(&now, &st->last_updated);
1528
+
1529
+ unsigned long long min_microseconds = st->update_every * 1000000ULL / 2ULL;
1530
+ if(microseconds < min_microseconds) {
1531
+ debug(D_RRD_STATS, "Chart %s is being updated too early (after %llu, expected %llu microseconds). Assuming default.", st->name, microseconds, min_microseconds);
1532
+ microseconds = st->update_every * 1000000ULL;
1533
+ }
1534
+
1535
+ rrd_stats_next_usec(st, microseconds);
1536
+ }
1537
+ else
1538
+ rrd_stats_next_usec(st, st->update_every * 1000000ULL);
1539
+}
1540
+
1541
+void rrd_stats_next_plugins(RRD_STATS *st)
1542
{
1505
- struct timeval now;
1506
- gettimeofday(&now, NULL);
1543
+ rrd_stats_next_usec(st, st->update_every * 1000000ULL);
1544
+}
1545
1546
+unsigned long long rrd_stats_done(RRD_STATS *st)
1547
+{
1548
pthread_mutex_lock(&st->mutex);
1549
1550
RRD_DIMENSION *rd, *last;
@@ -1549,9 +1589,6 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1589
1590
// if this is the second+ value we collect
1591
if(st->counter) {
1552
-
1553
- st->usec_since_last_update = usecdiff(&now, &st->last_updated);
1554
- if(!st->usec_since_last_update) st->usec_since_last_update = 1;
1592
if(st->debug) debug(D_RRD_STATS, "microseconds since last update: %llu", st->usec_since_last_update);
1593
1594
// x 10
@@ -1662,6 +1699,8 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1699
break;
1700
}
1701
1702
+ if(!st->counter_since_reload) rd->calculated_value = 0;
1703
+
1704
// store the calculated value
1705
rd->values[st->current_entry] = (storage_number)
1706
( rd->calculated_value
@@ -1685,7 +1724,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1724
1725
if(!st->first_entry_t) {
1726
// this is the first entry in the database
1688
- st->first_entry_t = now.tv_sec * 1000000ULL + now.tv_usec;
1727
+ st->first_entry_t = st->next_update.tv_sec * 1000000ULL + st->next_update.tv_usec;
1728
}
1729
else {
1730
if(st->counter > (unsigned long long)st->entries) {
@@ -1697,11 +1736,11 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
1736
// store the time difference to the last entry
1737
st->timediff[st->current_entry] = st->usec_since_last_update;
1738
}
1700
- else st->usec_since_last_update = st->update_every * 1000000ULL;
1739
1702
- st->last_updated.tv_sec = now.tv_sec;
1703
- st->last_updated.tv_usec = now.tv_usec;
1740
+ st->last_updated.tv_sec = st->next_update.tv_sec;
1741
+ st->last_updated.tv_usec = st->next_update.tv_usec;
1742
st->counter++;
1743
+ st->counter_since_reload++;
1744
1745
pthread_mutex_unlock(&st->mutex);
1746
@@ -5558,11 +5597,8 @@ void *proc_main(void *ptr)
5597
usec = usecdiff(&now, &last) - susec;
5598
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec);
5599
5561
- if(usec < (update_every * 1000000ULL)) susec = (update_every * 1000000ULL) - usec;
5562
- else susec = 0;
5563
-
5564
- // make sure we will wait at least 100ms
5565
- if(susec < 100000) susec = 100000;
5600
+ if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec;
5601
+ else susec = update_every * 1000000ULL / 2ULL;
5602
5603
// --------------------------------------------------------------------
5604
@@ -5718,7 +5754,7 @@ void tc_device_commit(struct tc_device *d)
5754
}
5755
}
5756
else {
5721
- rrd_stats_next(st);
5757
+ rrd_stats_next_plugins(st);
5758
5759
if(strcmp(d->id, d->name) != 0) rrd_stats_set_name(st, d->name);
5760
}
@@ -5986,7 +6022,7 @@ void *cpuidlejitter_main(void *ptr)
6022
6023
rrd_stats_dimension_add(st, "jitter", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
6024
}
5989
- else rrd_stats_next(st);
6025
+ else rrd_stats_next_usec(st, susec);
6026
6027
rrd_stats_dimension_set(st, "jitter", usec);
6028
rrd_stats_done(st);
@@ -6115,6 +6151,8 @@ void *pluginsd_worker_thread(void *arg)
6151
}
6152
else if(!strcmp(s, "BEGIN")) {
6153
char *id = qstrsep(&p);
6154
+ char *microseconds_txt = qstrsep(&p);
6155
+
6156
if(!id) {
6157
error("PLUGINSD: '%s' is requesting a BEGIN without a chart id. Disabling it.", cd->fullfilename);
6158
cd->enabled = 0;
@@ -6129,7 +6167,13 @@ void *pluginsd_worker_thread(void *arg)
6167
kill(cd->pid, SIGTERM);
6168
break;
6169
}
6132
- if(st->counter) rrd_stats_next(st);
6170
+
6171
+ if(st->counter) {
6172
+ unsigned long long microseconds = 0;
6173
+ if(microseconds_txt && *microseconds_txt) microseconds = strtoull(microseconds_txt, NULL, 10);
6174
+ if(microseconds) rrd_stats_next_usec(st, microseconds);
6175
+ else rrd_stats_next_plugins(st);
6176
+ }
6177
}
6178
else if(!strcmp(s, "END")) {
6179
if(!st) {
@@ -6141,16 +6185,7 @@ void *pluginsd_worker_thread(void *arg)
6185
6186
if(st->debug) debug(D_PLUGINSD, "PLUGINSD: '%s' is requesting a END on chart %s", cd->fullfilename, st->id);
6187
6144
- unsigned long long usec_since_last_update = rrd_stats_done(st);
6145
- if((time(NULL) - cd->started_t) > 10) {
6146
- if(usec_since_last_update < (cd->update_every * 1000000ULL / 10)) {
6147
- error("PLUGINSD: '%s' (up for %lu secs) updates charts too frequently. Chart %s updated after %llu microseconds, expected %llu microseconds.", cd->fullfilename, time(NULL) - cd->started_t, st->id, usec_since_last_update, cd->update_every * 1000000ULL);
6148
- //cd->enabled = 0;
6149
- //kill(cd->pid, SIGTERM);
6150
- //break;
6151
- }
6152
- }
6153
-
6188
+ rrd_stats_done(st);
6189
st = NULL;
6190
}
6191
else if(!strcmp(s, "FLUSH")) {
@@ -6290,8 +6325,8 @@ void *pluginsd_worker_thread(void *arg)
6325
// second+ run
6326
usec = usecdiff(&now, &last) - susec;
6327
error("PLUGINSD: %s last loop took %llu usec (worked for %llu, sleeped for %llu).\n", cd->fullfilename, usec + susec, usec, susec);
6293
- if(usec < (update_every * 1000000ULL)) susec = (update_every * 1000000ULL) - usec;
6294
- else susec = 100000ULL;
6328
+ if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec;
6329
+ else susec = update_every * 1000000ULL / 2ULL;
6330
}
6331
6332
error("PLUGINSD: %s sleeping for %llu. Will kill with SIGCONT pid %d to wake it up.\n", cd->fullfilename, susec, cd->pid);
@@ -6452,6 +6487,11 @@ void sig_handler(int signo)
6487
exit(1);
6488
break;
6489
6490
+ case SIGPIPE:
6491
+ error("Ignoring signal %d. Errno: %d (%s)", signo, errno, strerror(errno));
6492
+ break;
6493
+
6494
+
6495
case SIGCHLD:
6496
error("Received SIGCHLD (signal %d).", signo);
6497
siginfo_t info;
plugins.d/charts.d.plugin
+35
-19
@@ -275,28 +275,44 @@ done
275
276
# -----------------------------------------------------------------------------
277
# update dimensions
278
-while [ 1 ]
279
-do
280
- now_charts=$run_charts
281
- run_charts=
282
-
283
- for chart in $now_charts
278
+global_update() {
279
+ while [ 1 ]
280
do
285
- $chart$charts_update
286
- if [ $? -eq 0 ]
281
+ local now_charts=$run_charts
282
+ local run_charts=
283
+
284
+ local chart=
285
+ for chart in $now_charts
286
+ do
287
+ local d=`date +'%s.%N'`
288
+ local s=`echo $d | cut -d '.' -f 1`
289
+ local m=`echo $d | cut -d '.' -f 2 | cut -b 1-3`
290
+ local now="$s$m" # milliseconds since epoch (1-1-1970)
291
+
292
+ eval "local last=\$last_update_$chart"
293
+ test -z "$last" && local last=$((now - 1000))
294
+
295
+ local dt=$(( (now - last) * 1000 ))
296
+ eval "last_update_$chart=$now"
297
+
298
+ $chart$charts_update $dt
299
+ if [ $? -eq 0 ]
300
+ then
301
+ run_charts="$run_charts $chart"
302
+ else
303
+ echo >&2 "charts.d: chart '$chart' update() function reports failure. Disabling it."
304
+ fi
305
+ done
306
+
307
+ if [ "$pause_method" = "suspend" ]
308
then
288
- run_charts="$run_charts $chart"
309
+ echo "STOPPING_WAKE_ME_UP_PLEASE"
310
+ suspend || ( echo >&2 "suspend returned error $?, falling back to sleep."; loopsleepms $debug_time $update_every )
311
else
290
- echo >&2 "charts.d: chart '$chart' update() function reports failure. Disabling it."
312
+ # wait the time you are required to
313
+ loopsleepms $debug_time $update_every
314
fi
315
done
316
+}
317
294
- if [ "$pause_method" = "suspend" ]
295
- then
296
- echo "STOPPING_WAKE_ME_UP_PLEASE"
297
- suspend || ( echo >&2 "suspend returned error $?, falling back to sleep."; loopsleepms $debug_time $update_every )
298
- else
299
- # wait the time you are required to
300
- loopsleepms $debug_time $update_every
301
- fi
302
-done
318
+global_update