@cryptotaxi247 / netdata-1 / commits / 6b21dd924

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