pass microseconds to central netdata; fix unittest not initializing properly
Costa Tsaousis (ktsaou) committed
Feb 21, 2017 at 21:29 UTC
a1f1b9b55b937c5a0e4b482bbf1d0e827836c1df
2 files changed
+68
-29
src/main.c
+15
-7
@@ -355,6 +355,16 @@ static const char *verify_required_directory(const char *dir) {
355
return dir;
356
}
357
358
+static void get_netdata_configured_directories() {
359
+ netdata_configured_config_dir = config_get("global", "config directory", CONFIG_DIR);
360
+ netdata_configured_log_dir = config_get("global", "log directory", LOG_DIR);
361
+ netdata_configured_plugins_dir = config_get("global", "plugins directory", PLUGINS_DIR);
362
+ netdata_configured_web_dir = config_get("global", "web files directory", WEB_DIR);
363
+ netdata_configured_cache_dir = config_get("global", "cache directory", CACHE_DIR);
364
+ netdata_configured_varlib_dir = config_get("global", "lib directory", VARLIB_DIR);
365
+ netdata_configured_home_dir = config_get("global", "home directory", CACHE_DIR);
366
+}
367
+
368
int main(int argc, char **argv) {
369
char *hostname = "localhost";
370
int i, check_config = 0;
@@ -464,6 +474,10 @@ int main(int argc, char **argv) {
474
char* debug_flags_string = "debug_flags=";
475
if(strcmp(optarg, "unittest") == 0) {
476
default_rrd_update_every = 1;
477
+ if(!config_loaded) load_config(NULL, 0);
478
+ get_netdata_configured_directories();
479
+ registry_init();
480
+ rrd_init("unittest");
481
if(run_all_mockup_tests()) exit(1);
482
if(unit_test_storage()) exit(1);
483
fprintf(stderr, "\n\nALL TESTS PASSED\n\n");
@@ -555,13 +569,7 @@ int main(int argc, char **argv) {
569
570
// prepare configuration environment variables for the plugins
571
558
- netdata_configured_config_dir = config_get("global", "config directory", CONFIG_DIR);
559
- netdata_configured_log_dir = config_get("global", "log directory", LOG_DIR);
560
- netdata_configured_plugins_dir = config_get("global", "plugins directory", PLUGINS_DIR);
561
- netdata_configured_web_dir = config_get("global", "web files directory", WEB_DIR);
562
- netdata_configured_cache_dir = config_get("global", "cache directory", CACHE_DIR);
563
- netdata_configured_varlib_dir = config_get("global", "lib directory", VARLIB_DIR);
564
- netdata_configured_home_dir = config_get("global", "home directory", CACHE_DIR);
572
+ get_netdata_configured_directories();
573
574
setenv("NETDATA_CONFIG_DIR" , verify_required_directory(netdata_configured_config_dir), 1);
575
setenv("NETDATA_PLUGINS_DIR", verify_required_directory(netdata_configured_plugins_dir), 1);
src/rrdset.c
+53
-22
@@ -495,16 +495,23 @@ RRDSET *rrdset_create(RRDHOST *host, const char *type, const char *id, const cha
495
// ----------------------------------------------------------------------------
496
// RRDSET - data collection iteration control
497
498
-void rrdset_next_usec_unfiltered(RRDSET *st, usec_t microseconds) {
499
- if(unlikely(!st->last_collected_time.tv_sec || !microseconds)) {
498
+inline void rrdset_next_usec_unfiltered(RRDSET *st, usec_t microseconds) {
499
+
500
+ if(unlikely(!st->last_collected_time.tv_sec)) {
501
// the first entry
502
microseconds = st->update_every * USEC_PER_SEC;
503
}
504
+ else if(unlikely(!microseconds)) {
505
+ // no dt given by the plugin
506
+ struct timeval now;
507
+ now_realtime_timeval(&now);
508
+ microseconds = dt_usec(&now, &st->last_collected_time);
509
+ }
510
+
511
st->usec_since_last_update = microseconds;
512
}
513
506
-void rrdset_next_usec(RRDSET *st, usec_t microseconds)
507
-{
514
+inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
515
struct timeval now;
516
now_realtime_timeval(&now);
517
@@ -556,10 +563,46 @@ void rrdset_next_usec(RRDSET *st, usec_t microseconds)
563
// ----------------------------------------------------------------------------
564
// RRDSET - process the collected values for all dimensions of a chart
565
566
+static inline void rrdset_init_last_collected_time(RRDSET *st) {
567
+ now_realtime_timeval(&st->last_collected_time);
568
+ timeval_align(&st->last_collected_time, st->update_every);
569
+}
570
+
571
+static inline usec_t rrdset_update_last_collected_time(RRDSET *st) {
572
+ usec_t last_collect_ut = st->last_collected_time.tv_sec * USEC_PER_SEC + st->last_collected_time.tv_usec;
573
+ usec_t ut = last_collect_ut + st->usec_since_last_update;
574
+ st->last_collected_time.tv_sec = (time_t) (ut / USEC_PER_SEC);
575
+ st->last_collected_time.tv_usec = (suseconds_t) (ut % USEC_PER_SEC);
576
+ return last_collect_ut;
577
+}
578
+
579
+static inline void rrdset_init_last_updated_time(RRDSET *st) {
580
+ // copy the last collected time to last updated time
581
+ memcpy(&st->last_updated, &st->last_collected_time, sizeof(struct timeval));
582
+ timeval_align(&st->last_updated, st->update_every);
583
+ st->last_updated.tv_usec = 0;
584
+}
585
+
586
+static inline void rrdset_done_push_int(RRDSET *st) {
587
+ if(unlikely(!st->last_collected_time.tv_sec)) {
588
+ // it is the first entry
589
+ // set the last_collected_time to now
590
+ rrdset_init_last_collected_time(st);
591
+ }
592
+ else {
593
+ // it is not the first entry
594
+ // calculate the proper last_collected_time, using usec_since_last_update
595
+ rrdset_update_last_collected_time(st);
596
+ }
597
+
598
+ rrdset_done_push(st);
599
+}
600
+
601
void rrdset_done(RRDSET *st) {
602
if(unlikely(netdata_exit)) return;
603
+
604
if(unlikely(central_netdata_to_push_data)) {
562
- rrdset_done_push(st);
605
+ rrdset_done_push_int(st);
606
return;
607
}
608
@@ -611,8 +654,7 @@ void rrdset_done(RRDSET *st) {
654
if(unlikely(!st->last_collected_time.tv_sec)) {
655
// it is the first entry
656
// set the last_collected_time to now
614
- now_realtime_timeval(&st->last_collected_time);
615
- timeval_align(&st->last_collected_time, st->update_every);
657
+ rrdset_init_last_collected_time(st);
658
659
last_collect_ut = st->last_collected_time.tv_sec * USEC_PER_SEC + st->last_collected_time.tv_usec - update_every_ut;
660
@@ -626,10 +668,7 @@ void rrdset_done(RRDSET *st) {
668
else {
669
// it is not the first entry
670
// calculate the proper last_collected_time, using usec_since_last_update
629
- last_collect_ut = st->last_collected_time.tv_sec * USEC_PER_SEC + st->last_collected_time.tv_usec;
630
- usec_t ut = last_collect_ut + st->usec_since_last_update;
631
- st->last_collected_time.tv_sec = (time_t) (ut / USEC_PER_SEC);
632
- st->last_collected_time.tv_usec = (suseconds_t) (ut % USEC_PER_SEC);
671
+ last_collect_ut = rrdset_update_last_collected_time(st);
672
}
673
674
// if this set has not been updated in the past
@@ -637,32 +676,24 @@ void rrdset_done(RRDSET *st) {
676
if(unlikely(!st->last_updated.tv_sec)) {
677
// it has never been updated before
678
// set a fake last_updated, in the past using usec_since_last_update
640
- usec_t ut = st->last_collected_time.tv_sec * USEC_PER_SEC + st->last_collected_time.tv_usec - st->usec_since_last_update;
641
- st->last_updated.tv_sec = (time_t) (ut / USEC_PER_SEC);
642
- st->last_updated.tv_usec = (suseconds_t) (ut % USEC_PER_SEC);
679
+ rrdset_init_last_updated_time(st);
680
681
// the first entry should not be stored
682
store_this_entry = 0;
683
first_entry = 1;
684
685
if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_DEBUG)))
649
- debug(D_RRD_STATS, "%s: initializing last_updated to now - %llu microseconds (%0.3Lf). Will not store the next entry.", st->name, st->usec_since_last_update, (long double)ut/1000000.0);
686
+ debug(D_RRD_STATS, "%s: initializing last_updated to last_collected_time - %llu microseconds. Will not store the next entry.", st->name, st->usec_since_last_update);
687
}
688
689
// check if we will re-write the entire data set
690
if(unlikely(dt_usec(&st->last_collected_time, &st->last_updated) > st->entries * update_every_ut)) {
691
info("%s: too old data (last updated at %ld.%ld, last collected at %ld.%ld). Resetting it. Will not store the next entry.", st->name, st->last_updated.tv_sec, st->last_updated.tv_usec, st->last_collected_time.tv_sec, st->last_collected_time.tv_usec);
692
rrdset_reset(st);
693
+ rrdset_init_last_updated_time(st);
694
695
st->usec_since_last_update = update_every_ut;
696
659
- now_realtime_timeval(&st->last_collected_time);
660
- timeval_align(&st->last_collected_time, st->update_every);
661
-
662
- usec_t ut = st->last_collected_time.tv_sec * USEC_PER_SEC + st->last_collected_time.tv_usec - st->usec_since_last_update;
663
- st->last_updated.tv_sec = (time_t) (ut / USEC_PER_SEC);
664
- st->last_updated.tv_usec = (suseconds_t) (ut % USEC_PER_SEC);
665
-
697
// the first entry should not be stored
698
store_this_entry = 0;
699
first_entry = 1;