@cryptotaxi247 / netdata-1 / commits / a1f1b9b55

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;