From: Costa Tsaousis (ktsaou) Date: Sun, 22 Mar 2015 18:48:18 +0000 (+0200) Subject: added libavl for supporting balanced binary trees - this improves search performance... X-Git-Tag: v0.2~55 X-Git-Url: https://arthur.barton.de/gitweb/?p=netdata.git;a=commitdiff_plain;h=6a9c3d217fc1a249fd12286d76387ef3a9f63163 added libavl for supporting balanced binary trees - this improves search performance in config, chart updates, etc. refactored several class names and global variables --- diff --git a/src/Makefile b/src/Makefile index ab3d9e6c..e282c529 100755 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ ifndef BIN_DIR -BIN_DIR = "$(PWD)" +BIN_DIR = "." endif ifndef CONFIG_DIR @@ -20,19 +20,21 @@ endif COMMON_FLAGS = BIN_DIR='$(BIN_DIR)' CONFIG_DIR='$(CONFIG_DIR)' LOG_DIR='$(LOG_DIR)' PLUGINS_DIR='$(PLUGINS_DIR)' +proc_sources = proc_net_dev.c proc_net_ip_vs_stats.c proc_diskstats.c proc_meminfo.c proc_net_netstat.c proc_net_snmp.c proc_net_stat_conntrack.c proc_stat.c proc_vmstat.c proc_net_rpc_nfsd.c +sources = avl.c procfile.c common.c log.c popen.c url.c config.c web_buffer.c storage_number.c web_client.c global_statistics.c rrd.c rrd2json.c web_server.c plugins_d.c daemon.c plugin_tc.c plugin_checks.c plugin_idlejitter.c plugin_proc.c unit_test.c main.c +libs = -pthread -lz + ifdef debug COMMON_FLAGS += debug=1 -CFLAGS = -Wall -Wextra -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' +CFLAGS = -Wall -Wextra -O -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fno-omit-frame-pointer +# CFLAGS := -Wall -Wextra -O -g -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fsanitize=thread -fno-omit-frame-pointer -fPIE +# libs += -pie -ltsan else -CFLAGS = -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' +CFLAGS := -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fomit-frame-pointer endif CC = gcc -proc_sources = proc_net_dev.c proc_net_ip_vs_stats.c proc_diskstats.c proc_meminfo.c proc_net_netstat.c proc_net_snmp.c proc_net_stat_conntrack.c proc_stat.c proc_vmstat.c proc_net_rpc_nfsd.c -sources = procfile.c common.c log.c popen.c url.c config.c web_buffer.c storage_number.c web_client.c global_statistics.c rrd.c rrd2json.c web_server.c plugins_d.c daemon.c plugin_tc.c plugin_checks.c plugin_idlejitter.c plugin_proc.c unit_test.c main.c -libs = -pthread -lz - ifdef STORAGE_WITH_MATH CFLAGS += -DSTORAGE_WITH_MATH=1 libs += -lm @@ -51,12 +53,10 @@ objects = $(patsubst %.c,%.o,$(sources) $(proc_sources)) all: show_options netdata plugins %.o: %.c ${headers} - @echo " $(CC) $<" - @$(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(CFLAGS) -c $< -o $@ netdata: $(objects) - @echo " $(CC) netdata" - @$(CC) -o netdata $(objects) $(libs) + $(CC) -o netdata $(objects) $(libs) show_options: @echo " COMPILING WITH OPTIONS: $(CFLAGS)" diff --git a/src/avl.c b/src/avl.c new file mode 100644 index 00000000..7b3d9427 --- /dev/null +++ b/src/avl.c @@ -0,0 +1,316 @@ +/* + * ANSI C Library for maintainance of AVL Balanced Trees + * + * ref.: + * G. M. Adelson-Velskij & E. M. Landis + * Doklady Akad. Nauk SSSR 146 (1962), 263-266 + * + * see also: + * D. E. Knuth: The Art of Computer Programming Vol.3 (Sorting and Searching) + * + * (C) 2000 Daniel Nagy, Budapest University of Technology and Economics + * Released under GNU General Public License (GPL) version 2 + * + */ + +#include "avl.h" + +/* Private methods */ + +/* Swing to the left + * Warning: no balance maintainance + */ +void avl_swl(avl** root) { + avl* a = *root; + avl* b = a->right; + *root = b; + a->right = b->left; + b->left = a; +} + +/* Swing to the right + * Warning: no balance maintainance + */ +void avl_swr(avl** root) { + avl* a = *root; + avl* b = a->left; + *root = b; + a->left = b->right; + b->right = a; +} + +/* Balance maintainance after especially nasty swings + */ +void avl_nasty(avl* root) { + switch (root->balance) { + case -1: + root->left->balance = 0; + root->right->balance = 1; + break; + case 1: + root->left->balance = -1; + root->right->balance = 0; + break; + case 0: + root->left->balance = 0; + root->right->balance = 0; + } + root->balance = 0; +} + +/* Public methods */ + +/* Insert element a into the AVL tree t + * returns 1 if the depth of the tree has grown + * Warning: do not insert elements already present + */ +int avl_insert(avl_tree* t, avl* a) { + /* initialize */ + a->left = 0; + a->right = 0; + a->balance = 0; + /* insert into an empty tree */ + if (!t->root) { + t->root = a; + return 1; + } + + if (t->compar(t->root, a) > 0) { + /* insert into the left subtree */ + if (t->root->left) { + avl_tree left_subtree; + left_subtree.root = t->root->left; + left_subtree.compar = t->compar; + if (avl_insert(&left_subtree, a)) { + switch (t->root->balance--) { + case 1: + return 0; + case 0: + return 1; + } + if (t->root->left->balance < 0) { + avl_swr(&(t->root)); + t->root->balance = 0; + t->root->right->balance = 0; + } else { + avl_swl(&(t->root->left)); + avl_swr(&(t->root)); + avl_nasty(t->root); + } + } else + t->root->left = left_subtree.root; + return 0; + } else { + t->root->left = a; + if (t->root->balance--) + return 0; + return 1; + } + } else { + /* insert into the right subtree */ + if (t->root->right) { + avl_tree right_subtree; + right_subtree.root = t->root->right; + right_subtree.compar = t->compar; + if (avl_insert(&right_subtree, a)) { + switch (t->root->balance++) { + case -1: + return 0; + case 0: + return 1; + } + if (t->root->right->balance > 0) { + avl_swl(&(t->root)); + t->root->balance = 0; + t->root->left->balance = 0; + } else { + avl_swr(&(t->root->right)); + avl_swl(&(t->root)); + avl_nasty(t->root); + } + } else + t->root->right = right_subtree.root; + return 0; + } else { + t->root->right = a; + if (t->root->balance++) + return 0; + return 1; + } + } +} + +/* Remove an element a from the AVL tree t + * returns -1 if the depth of the tree has shrunk + * Warning: if the element is not present in the tree, + * returns 0 as if it had been removed succesfully. + */ +int avl_remove(avl_tree* t, avl* a) { + int b; + if (t->root == a) + return avl_removeroot(t); + b = t->compar(t->root, a); + if (b >= 0) { + /* remove from the left subtree */ + int ch; + avl_tree left_subtree; + if ((left_subtree.root = t->root->left)) { + left_subtree.compar = t->compar; + ch = avl_remove(&left_subtree, a); + t->root->left = left_subtree.root; + if (ch) { + switch (t->root->balance++) { + case -1: + return -1; + case 0: + return 0; + } + switch (t->root->right->balance) { + case 0: + avl_swl(&(t->root)); + t->root->balance = -1; + t->root->left->balance = 1; + return 0; + case 1: + avl_swl(&(t->root)); + t->root->balance = 0; + t->root->left->balance = 0; + return -1; + } + avl_swr(&(t->root->right)); + avl_swl(&(t->root)); + avl_nasty(t->root); + return -1; + } + } + } + if (b <= 0) { + /* remove from the right subtree */ + int ch; + avl_tree right_subtree; + if ((right_subtree.root = t->root->right)) { + right_subtree.compar = t->compar; + ch = avl_remove(&right_subtree, a); + t->root->right = right_subtree.root; + if (ch) { + switch (t->root->balance--) { + case 1: + return -1; + case 0: + return 0; + } + switch (t->root->left->balance) { + case 0: + avl_swr(&(t->root)); + t->root->balance = 1; + t->root->right->balance = -1; + return 0; + case -1: + avl_swr(&(t->root)); + t->root->balance = 0; + t->root->right->balance = 0; + return -1; + } + avl_swl(&(t->root->left)); + avl_swr(&(t->root)); + avl_nasty(t->root); + return -1; + } + } + } + return 0; +} + +/* Remove the root of the AVL tree t + * Warning: dumps core if t is empty + */ +int avl_removeroot(avl_tree* t) { + int ch; + avl* a; + if (!t->root->left) { + if (!t->root->right) { + t->root = 0; + return -1; + } + t->root = t->root->right; + return -1; + } + if (!t->root->right) { + t->root = t->root->left; + return -1; + } + if (t->root->balance < 0) { + /* remove from the left subtree */ + a = t->root->left; + while (a->right) + a = a->right; + } else { + /* remove from the right subtree */ + a = t->root->right; + while (a->left) + a = a->left; + } + ch = avl_remove(t, a); + a->left = t->root->left; + a->right = t->root->right; + a->balance = t->root->balance; + t->root = a; + if (a->balance == 0) + return ch; + return 0; +} + +/* Iterate through elements in t from a range between a and b (inclusive) + * for each element calls iter(a) until it returns 0 + * returns the last value returned by iterator or 0 if there were no calls + * Warning: a<=b must hold + */ +int avl_range(avl_tree* t, avl* a, avl* b, int (*iter)(avl* a), avl** ret) { + int x, c = 0; + if (!t->root) + return 0; + x = t->compar(t->root, a); + if (a != b) { + if (x < 0) { + x = t->compar(t->root, b); + if (x > 0) + x = 0; + } + } + if (x >= 0) { + /* search in the left subtree */ + avl_tree left_subtree; + if ((left_subtree.root = t->root->left)) { + left_subtree.compar = t->compar; + if (!(c = avl_range(&left_subtree, a, b, iter, ret))) + if (x > 0) + return 0; + } + } + if (x == 0) { + if (!(c = iter(t->root))) { + if (ret) + *ret = t->root; + return 0; + } + } + if (x <= 0) { + /* search in the right subtree */ + avl_tree right_subtree; + if ((right_subtree.root = t->root->right)) { + right_subtree.compar = t->compar; + if (!(c = avl_range(&right_subtree, a, b, iter, ret))) + if (x < 0) + return 0; + } + } + return c; +} + +/* Iterate through elements in t equal to a + * for each element calls iter(a) until it returns 0 + * returns the last value returned by iterator or 0 if there were no calls + */ +int avl_search(avl_tree* t, avl* a, int (*iter)(avl* a), avl** ret) { + return avl_range(t, a, a, iter, ret); +} diff --git a/src/avl.h b/src/avl.h new file mode 100644 index 00000000..35823c49 --- /dev/null +++ b/src/avl.h @@ -0,0 +1,67 @@ +/* + * ANSI C Library for maintainance of AVL Balanced Trees + * + * ref.: + * G. M. Adelson-Velskij & E. M. Landis + * Doklady Akad. Nauk SSSR 146 (1962), 263-266 + * + * see also: + * D. E. Knuth: The Art of Computer Programming Vol.3 (Sorting and Searching) + * + * (C) 2000 Daniel Nagy, Budapest University of Technology and Economics + * Released under GNU General Public License (GPL) version 2 + * + */ + +#ifndef _AVL_H +#define _AVL_H 1 + +/* Data structures */ + +/* One element of the AVL tree */ +typedef struct avl { + struct avl* left; + struct avl* right; + signed char balance; +} avl; + +/* An AVL tree */ +typedef struct avl_tree { + avl* root; + int (*compar)(void* a, void* b); +} avl_tree; + +/* Public methods */ + +/* Insert element a into the AVL tree t + * returns 1 if the depth of the tree has grown + * Warning: do not insert elements already present + */ +int avl_insert(avl_tree* t, avl* a); + +/* Remove an element a from the AVL tree t + * returns -1 if the depth of the tree has shrunk + * Warning: if the element is not present in the tree, + * returns 0 as if it had been removed succesfully. + */ +int avl_remove(avl_tree* t, avl* a); + +/* Remove the root of the AVL tree t + * Warning: dumps core if t is empty + */ +int avl_removeroot(avl_tree* t); + +/* Iterate through elements in t from a range between a and b (inclusive) + * for each element calls iter(a) until it returns 0 + * returns the last value returned by iterator or 0 if there were no calls + * Warning: a<=b must hold + */ +int avl_range(avl_tree* t, avl* a, avl* b, int (*iter)(avl* a), avl** ret); + +/* Iterate through elements in t equal to a + * for each element calls iter(a) until it returns 0 + * returns the last value returned by iterator or 0 if there were no calls + */ +int avl_search(avl_tree* t, avl* a, int (*iter)(avl* a), avl** ret); + +#endif /* avl.h */ diff --git a/src/common.c b/src/common.c index 67473820..df85ee8f 100755 --- a/src/common.c +++ b/src/common.c @@ -9,12 +9,10 @@ #include #include #include -#include #include "log.h" #include "common.h" -#include "web_client.h" // http://stackoverflow.com/questions/7666509/hash-function-for-string unsigned long simple_hash(const char *name) @@ -159,23 +157,6 @@ int savememory(const char *filename, void *mem, unsigned long size) return ret; } -void log_allocations(void) -{ - static int mem = 0; - - struct mallinfo mi; - - mi = mallinfo(); - if(mi.uordblks > mem) { - int clients = 0; - struct web_client *w; - for(w = web_clients; w ; w = w->next) clients++; - - info("Allocated memory increased from %d to %d (increased by %d bytes). There are %d web clients connected.", mem, mi.uordblks, mi.uordblks - mem, clients); - mem = mi.uordblks; - } -} - int fd_is_valid(int fd) { return fcntl(fd, F_GETFD) != -1 || errno != EBADF; } diff --git a/src/common.h b/src/common.h index 2d720e9e..2340c015 100755 --- a/src/common.h +++ b/src/common.h @@ -13,8 +13,6 @@ extern char *trim(char *s); extern void *mymmap(const char *filename, unsigned long size, int flags); extern int savememory(const char *filename, void *mem, unsigned long size); -extern void log_allocations(void); - extern int fd_is_valid(int fd); #endif /* NETDATA_COMMON_H */ diff --git a/src/config.c b/src/config.c index c2fdb426..1afc0b8d 100755 --- a/src/config.c +++ b/src/config.c @@ -1,7 +1,9 @@ #include #include #include +#include +#include "avl.h" #include "common.h" #include "config.h" #include "log.h" @@ -10,31 +12,96 @@ pthread_rwlock_t config_rwlock = PTHREAD_RWLOCK_INITIALIZER; +// ---------------------------------------------------------------------------- +// definitions + +#define CONFIG_VALUE_LOADED 0x01 // has been loaded from the config +#define CONFIG_VALUE_USED 0x02 // has been accessed from the program +#define CONFIG_VALUE_CHANGED 0x04 // has been changed from the loaded value +#define CONFIG_VALUE_CHECKED 0x08 // has been checked if the value is different from the default + struct config_value { - char name[CONFIG_MAX_NAME + 1]; - char value[CONFIG_MAX_VALUE + 1]; + avl avl; unsigned long hash; // a simple hash to speed up searching // we first compare hashes, and only if the hashes are equal we do string comparisons - int loaded; // loaded from the user config - int used; // has been accessed from the program - int changed; // changed from the internal default + char name[CONFIG_MAX_NAME + 1]; + char value[CONFIG_MAX_VALUE + 1]; + + uint8_t flags; struct config_value *next; }; struct config { - char name[CONFIG_MAX_NAME + 1]; + avl avl; unsigned long hash; // a simple hash to speed up searching // we first compare hashes, and only if the hashes are equal we do string comparisons + char name[CONFIG_MAX_NAME + 1]; + struct config_value *values; + avl_tree values_index; struct config *next; } *config_root = NULL; + +// ---------------------------------------------------------------------------- +// config value + +static int config_value_iterator(avl *a) { if(a) {}; return 0; } + +static int config_value_compare(void* a, void* b) { + if(((struct config_value *)a)->hash < ((struct config_value *)b)->hash) return -1; + else if(((struct config_value *)a)->hash > ((struct config_value *)b)->hash) return 1; + else return strcmp(((struct config_value *)a)->name, ((struct config_value *)b)->name); +} + +#define config_value_index_add(co, cv) avl_insert(&((co)->values_index), (avl *)(cv)) +#define config_value_index_del(co, cv) avl_remove(&((co)->values_index), (avl *)(cv)) + +static struct config_value *config_value_index_find(struct config *co, const char *name, unsigned long hash) { + struct config_value *result = NULL, tmp; + tmp.hash = (hash)?hash:simple_hash(name); + strncpy(tmp.name, name, CONFIG_MAX_NAME); + tmp.name[CONFIG_MAX_NAME] = '\0'; + + avl_search(&(co->values_index), (avl *)&tmp, config_value_iterator, (avl **)&result); + return result; +} + +// ---------------------------------------------------------------------------- +// config + +static int config_iterator(avl *a) { if(a) {}; return 0; } + +static int config_compare(void* a, void* b) { + if(((struct config *)a)->hash < ((struct config *)b)->hash) return -1; + else if(((struct config *)a)->hash > ((struct config *)b)->hash) return 1; + else return strcmp(((struct config *)a)->name, ((struct config *)b)->name); +} + +avl_tree config_root_index = { + NULL, + config_compare +}; + +#define config_index_add(cfg) avl_insert(&config_root_index, (avl *)(cfg)) +#define config_index_del(cfg) avl_remove(&config_root_index, (avl *)(cfg)) + +static struct config *config_index_find(const char *name, unsigned long hash) { + struct config *result = NULL, tmp; + tmp.hash = (hash)?hash:simple_hash(name); + strncpy(tmp.name, name, CONFIG_MAX_NAME); + tmp.name[CONFIG_MAX_NAME] = '\0'; + + avl_search(&config_root_index, (avl *)&tmp, config_iterator, (avl **)&result); + return result; +} + struct config_value *config_value_create(struct config *co, const char *name, const char *value) { debug(D_CONFIG, "Creating config entry for name '%s', value '%s', in section '%s'.", name, value, co->name); @@ -46,6 +113,8 @@ struct config_value *config_value_create(struct config *co, const char *name, co strncpy(cv->value, value, CONFIG_MAX_VALUE); cv->hash = simple_hash(cv->name); + config_value_index_add(co, cv); + // no need for string termination, due to calloc() struct config_value *cv2 = co->values; @@ -67,6 +136,9 @@ struct config *config_create(const char *section) strncpy(co->name, section, CONFIG_MAX_NAME); co->hash = simple_hash(co->name); + co->values_index.compar = config_value_compare; + + config_index_add(co); // no need for string termination, due to calloc() @@ -82,15 +154,7 @@ struct config *config_create(const char *section) struct config *config_find_section(const char *section) { - struct config *co; - unsigned long hash = simple_hash(section); - - for(co = config_root; co ; co = co->next) - if(hash == co->hash) - if(strcmp(co->name, section) == 0) - break; - - return co; + return config_index_find(section, 0); } int load_config(char *filename, int overwrite_used) @@ -159,13 +223,11 @@ int load_config(char *filename, int overwrite_used) continue; } - struct config_value *cv; - for(cv = co->values; cv ; cv = cv->next) - if(strcmp(cv->name, name) == 0) break; + struct config_value *cv = config_value_index_find(co, name, 0); if(!cv) cv = config_value_create(co, name, value); else { - if((cv->used && overwrite_used) || !cv->used) { + if((cv->flags & CONFIG_VALUE_USED && overwrite_used) || !(cv->flags & CONFIG_VALUE_USED)) { debug(D_CONFIG, "Overwriting '%s/%s'.", line, co->name, cv->name); strncpy(cv->value, value, CONFIG_MAX_VALUE); // termination is already there @@ -173,7 +235,7 @@ int load_config(char *filename, int overwrite_used) else debug(D_CONFIG, "Ignoring line %d, '%s/%s' is already present and used.", line, co->name, cv->name); } - cv->loaded = 1; + cv->flags |= CONFIG_VALUE_LOADED; } fclose(fp); @@ -193,19 +255,17 @@ char *config_get(const char *section, const char *name, const char *default_valu struct config *co = config_find_section(section); if(!co) co = config_create(section); - unsigned long hash = simple_hash(name); - for(cv = co->values; cv ; cv = cv->next) - if(hash == cv->hash) - if(strcmp(cv->name, name) == 0) - break; - + cv = config_value_index_find(co, name, 0); if(!cv) cv = config_value_create(co, name, default_value); - cv->used = 1; + cv->flags |= CONFIG_VALUE_USED; - if(cv->loaded || cv->changed) { + if(cv->flags & CONFIG_VALUE_LOADED || cv->flags & CONFIG_VALUE_CHANGED) { // this is a loaded value from the config file // if it is different that the default, mark it - if(strcmp(cv->value, default_value) != 0) cv->changed = 1; + if(!(cv->flags & CONFIG_VALUE_CHECKED)) { + if(strcmp(cv->value, default_value) != 0) cv->flags |= CONFIG_VALUE_CHANGED; + cv->flags |= CONFIG_VALUE_CHECKED; + } } else { // this is not loaded from the config @@ -255,16 +315,11 @@ const char *config_set(const char *section, const char *name, const char *value) struct config *co = config_find_section(section); if(!co) co = config_create(section); - unsigned long hash = simple_hash(name); - for(cv = co->values; cv ; cv = cv->next) - if(hash == cv->hash) - if(strcmp(cv->name, name) == 0) - break; - + cv = config_value_index_find(co, name, 0); if(!cv) cv = config_value_create(co, name, value); - cv->used = 1; + cv->flags |= CONFIG_VALUE_USED; - if(strcmp(cv->value, value) != 0) cv->changed = 1; + if(strcmp(cv->value, value) != 0) cv->flags |= CONFIG_VALUE_CHANGED; strncpy(cv->value, value, CONFIG_MAX_VALUE); // termination is already there @@ -331,8 +386,8 @@ void generate_config(struct web_buffer *wb, int only_changed) int changed = 0; int count = 0; for(cv = co->values; cv ; cv = cv->next) { - used += cv->used; - changed += cv->changed; + used += (cv->flags && CONFIG_VALUE_USED)?1:0; + changed += (cv->flags & CONFIG_VALUE_CHANGED)?1:0; count++; } @@ -349,12 +404,12 @@ void generate_config(struct web_buffer *wb, int only_changed) for(cv = co->values; cv ; cv = cv->next) { - if(used && !cv->used) { + if(used && !(cv->flags & CONFIG_VALUE_USED)) { web_buffer_increase(wb, CONFIG_MAX_NAME + 200); web_buffer_printf(wb, "\n\t# option '%s' is not used.\n", cv->name); } web_buffer_increase(wb, CONFIG_MAX_NAME + CONFIG_MAX_VALUE + 5); - web_buffer_printf(wb, "\t%s%s = %s\n", (!cv->changed && cv->used)?"# ":"", cv->name, cv->value); + web_buffer_printf(wb, "\t%s%s = %s\n", ((!(cv->flags & CONFIG_VALUE_CHANGED)) && (cv->flags & CONFIG_VALUE_USED))?"# ":"", cv->name, cv->value); } } } diff --git a/src/daemon.c b/src/daemon.c index cb40a670..7728cf44 100755 --- a/src/daemon.c +++ b/src/daemon.c @@ -39,7 +39,7 @@ void sig_handler(int signo) signal(SIGINT, SIG_IGN); kill_childs(); process_childs(0); - rrd_stats_free_all(); + rrdset_free_all(); //unlink("/var/run/netdata.pid"); info("NetData exiting. Bye bye..."); exit(1); diff --git a/src/main.c b/src/main.c index 3ac88171..9979b3e5 100755 --- a/src/main.c +++ b/src/main.c @@ -131,7 +131,7 @@ int main(int argc, char **argv) else if(strcmp(argv[i], "--unittest") == 0) { if(unit_test_storage()) exit(1); exit(0); - update_every = 1; + rrd_update_every = 1; if(unit_test(1000000, 0)) exit(1); if(unit_test(1000000, 500000)) exit(1); if(unit_test(1000000, 100000)) exit(1); @@ -151,7 +151,7 @@ int main(int argc, char **argv) fprintf(stderr, "Cannot understand option '%s'.\n", argv[i]); fprintf(stderr, "\nUSAGE: %s [-d] [-l LINES_TO_SAVE] [-u UPDATE_TIMER] [-p LISTEN_PORT] [-dl debug log file] [-df debug flags].\n\n", argv[0]); fprintf(stderr, " -c CONFIG FILE the configuration file to load. Default: %s.\n", CONFIG_DIR "/" CONFIG_FILENAME); - fprintf(stderr, " -l LINES_TO_SAVE can be from 5 to %d lines in JSON data. Default: %d.\n", HISTORY_MAX, HISTORY); + fprintf(stderr, " -l LINES_TO_SAVE can be from 5 to %d lines in JSON data. Default: %d.\n", RRD_HISTORY_ENTRIES_MAX, RRD_DEFAULT_HISTORY_ENTRIES); fprintf(stderr, " -t UPDATE_TIMER can be from 1 to %d seconds. Default: %d.\n", UPDATE_EVERY_MAX, UPDATE_EVERY); fprintf(stderr, " -p LISTEN_PORT can be from 1 to %d. Default: %d.\n", 65535, LISTEN_PORT); fprintf(stderr, " -u USERNAME can be any system username to run as. Default: none.\n"); @@ -219,7 +219,7 @@ int main(int argc, char **argv) // -------------------------------------------------------------------- - memory_mode = memory_mode_id(config_get("global", "memory mode", memory_mode_name(memory_mode))); + rrd_memory_mode = rrd_memory_mode_id(config_get("global", "memory mode", rrd_memory_mode_name(rrd_memory_mode))); // -------------------------------------------------------------------- @@ -230,23 +230,23 @@ int main(int argc, char **argv) // -------------------------------------------------------------------- - save_history = config_get_number("global", "history", HISTORY); - if(save_history < 5 || save_history > HISTORY_MAX) { - fprintf(stderr, "Invalid save lines %d given. Defaulting to %d.\n", save_history, HISTORY); - save_history = HISTORY; + rrd_default_history_entries = config_get_number("global", "history", RRD_DEFAULT_HISTORY_ENTRIES); + if(rrd_default_history_entries < 5 || rrd_default_history_entries > RRD_HISTORY_ENTRIES_MAX) { + fprintf(stderr, "Invalid save lines %d given. Defaulting to %d.\n", rrd_default_history_entries, RRD_DEFAULT_HISTORY_ENTRIES); + rrd_default_history_entries = RRD_DEFAULT_HISTORY_ENTRIES; } else { - debug(D_OPTIONS, "save lines set to %d.", save_history); + debug(D_OPTIONS, "save lines set to %d.", rrd_default_history_entries); } // -------------------------------------------------------------------- - update_every = config_get_number("global", "update every", UPDATE_EVERY); - if(update_every < 1 || update_every > 600) { - fprintf(stderr, "Invalid update timer %d given. Defaulting to %d.\n", update_every, UPDATE_EVERY_MAX); - update_every = UPDATE_EVERY; + rrd_update_every = config_get_number("global", "update every", UPDATE_EVERY); + if(rrd_update_every < 1 || rrd_update_every > 600) { + fprintf(stderr, "Invalid update timer %d given. Defaulting to %d.\n", rrd_update_every, UPDATE_EVERY_MAX); + rrd_update_every = UPDATE_EVERY; } - else debug(D_OPTIONS, "update timer set to %d.", update_every); + else debug(D_OPTIONS, "update timer set to %d.", rrd_update_every); // -------------------------------------------------------------------- diff --git a/src/plugin_checks.c b/src/plugin_checks.c index 0177f207..6e987e4e 100755 --- a/src/plugin_checks.c +++ b/src/plugin_checks.c @@ -20,23 +20,23 @@ void *checks_main(void *ptr) if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0) error("Cannot set pthread cancel state to ENABLE."); - unsigned long long usec = 0, susec = update_every * 1000000ULL, loop_usec = 0, total_susec = 0; + unsigned long long usec = 0, susec = rrd_update_every * 1000000ULL, loop_usec = 0, total_susec = 0; struct timeval now, last, loop; - RRD_STATS *check1, *check2, *check3, *apps_cpu = NULL; + RRDSET *check1, *check2, *check3, *apps_cpu = NULL; - check1 = rrd_stats_create("netdata", "check1", NULL, "netdata", "Caller gives microseconds", "a million !", 99999, update_every, CHART_TYPE_LINE); - rrd_stats_dimension_add(check1, "absolute", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(check1, "incremental", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + check1 = rrdset_create("netdata", "check1", NULL, "netdata", "Caller gives microseconds", "a million !", 99999, rrd_update_every, RRDSET_TYPE_LINE); + rrddim_add(check1, "absolute", NULL, -1, 1, RRDDIM_ABSOLUTE); + rrddim_add(check1, "incremental", NULL, 1, 1 * rrd_update_every, RRDDIM_INCREMENTAL); - check2 = rrd_stats_create("netdata", "check2", NULL, "netdata", "Netdata calcs microseconds", "a million !", 99999, update_every, CHART_TYPE_LINE); - rrd_stats_dimension_add(check2, "absolute", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(check2, "incremental", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + check2 = rrdset_create("netdata", "check2", NULL, "netdata", "Netdata calcs microseconds", "a million !", 99999, rrd_update_every, RRDSET_TYPE_LINE); + rrddim_add(check2, "absolute", NULL, -1, 1, RRDDIM_ABSOLUTE); + rrddim_add(check2, "incremental", NULL, 1, 1 * rrd_update_every, RRDDIM_INCREMENTAL); - check3 = rrd_stats_create("netdata", "checkdt", NULL, "netdata", "Clock difference", "microseconds diff", 99999, update_every, CHART_TYPE_LINE); - rrd_stats_dimension_add(check3, "caller", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(check3, "netdata", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(check3, "apps.plugin", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); + check3 = rrdset_create("netdata", "checkdt", NULL, "netdata", "Clock difference", "microseconds diff", 99999, rrd_update_every, RRDSET_TYPE_LINE); + rrddim_add(check3, "caller", NULL, 1, 1, RRDDIM_ABSOLUTE); + rrddim_add(check3, "netdata", NULL, 1, 1, RRDDIM_ABSOLUTE); + rrddim_add(check3, "apps.plugin", NULL, 1, 1, RRDDIM_ABSOLUTE); gettimeofday(&last, NULL); while(1) { @@ -48,8 +48,8 @@ void *checks_main(void *ptr) usec = loop_usec - susec; debug(D_PROCNETDEV_LOOP, "CHECK: last loop took %llu usec (worked for %llu, sleeped for %llu).", loop_usec, usec, susec); - if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec; - else susec = update_every * 1000000ULL / 2ULL; + if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec; + else susec = rrd_update_every * 1000000ULL / 2ULL; // -------------------------------------------------------------------- // Calculate loop time @@ -61,29 +61,29 @@ void *checks_main(void *ptr) // -------------------------------------------------------------------- // check chart 1 - if(check1->counter_done) rrd_stats_next_usec(check1, loop_usec); - rrd_stats_dimension_set(check1, "absolute", 1000000); - rrd_stats_dimension_set(check1, "incremental", total_susec); - rrd_stats_done(check1); + if(check1->counter_done) rrdset_next_usec(check1, loop_usec); + rrddim_set(check1, "absolute", 1000000); + rrddim_set(check1, "incremental", total_susec); + rrdset_done(check1); // -------------------------------------------------------------------- // check chart 2 - if(check2->counter_done) rrd_stats_next(check2); - rrd_stats_dimension_set(check2, "absolute", 1000000); - rrd_stats_dimension_set(check2, "incremental", total_susec); - rrd_stats_done(check2); + if(check2->counter_done) rrdset_next(check2); + rrddim_set(check2, "absolute", 1000000); + rrddim_set(check2, "incremental", total_susec); + rrdset_done(check2); // -------------------------------------------------------------------- // check chart 3 - if(!apps_cpu) apps_cpu = rrd_stats_find("apps.cpu"); - if(check3->counter_done) rrd_stats_next_usec(check3, loop_usec); + if(!apps_cpu) apps_cpu = rrdset_find("apps.cpu"); + if(check3->counter_done) rrdset_next_usec(check3, loop_usec); gettimeofday(&loop, NULL); - rrd_stats_dimension_set(check3, "caller", (long long)usecdiff(&loop, &check1->last_collected_time)); - rrd_stats_dimension_set(check3, "netdata", (long long)usecdiff(&loop, &check2->last_collected_time)); - if(apps_cpu) rrd_stats_dimension_set(check3, "apps.plugin", (long long)usecdiff(&loop, &apps_cpu->last_collected_time)); - rrd_stats_done(check3); + rrddim_set(check3, "caller", (long long)usecdiff(&loop, &check1->last_collected_time)); + rrddim_set(check3, "netdata", (long long)usecdiff(&loop, &check2->last_collected_time)); + if(apps_cpu) rrddim_set(check3, "apps.plugin", (long long)usecdiff(&loop, &apps_cpu->last_collected_time)); + rrdset_done(check3); } return NULL; diff --git a/src/plugin_idlejitter.c b/src/plugin_idlejitter.c index 1ec84e8e..f18ebb31 100755 --- a/src/plugin_idlejitter.c +++ b/src/plugin_idlejitter.c @@ -29,10 +29,10 @@ void *cpuidlejitter_main(void *ptr) sleep_ms = CPU_IDLEJITTER_SLEEP_TIME_MS; } - RRD_STATS *st = rrd_stats_find("system.idlejitter"); + RRDSET *st = rrdset_find("system.idlejitter"); if(!st) { - st = rrd_stats_create("system", "idlejitter", NULL, "cpu", "CPU Idle Jitter", "microseconds lost/s", 9999, update_every, CHART_TYPE_LINE); - rrd_stats_dimension_add(st, "jitter", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); + st = rrdset_create("system", "idlejitter", NULL, "cpu", "CPU Idle Jitter", "microseconds lost/s", 9999, rrd_update_every, RRDSET_TYPE_LINE); + rrddim_add(st, "jitter", NULL, 1, 1, RRDDIM_ABSOLUTE); } struct timeval before, after; @@ -40,7 +40,7 @@ void *cpuidlejitter_main(void *ptr) for(counter = 0; 1 ;counter++) { unsigned long long usec = 0, susec = 0; - while(susec < (update_every * 1000000ULL)) { + while(susec < (rrd_update_every * 1000000ULL)) { gettimeofday(&before, NULL); usleep(sleep_ms * 1000); @@ -52,9 +52,9 @@ void *cpuidlejitter_main(void *ptr) } usec -= (sleep_ms * 1000); - if(counter) rrd_stats_next_usec(st, susec); - rrd_stats_dimension_set(st, "jitter", usec); - rrd_stats_done(st); + if(counter) rrdset_next_usec(st, susec); + rrddim_set(st, "jitter", usec); + rrdset_done(st); } return NULL; diff --git a/src/plugin_nfacct.c b/src/plugin_nfacct.c index 4329424d..ba368f2d 100644 --- a/src/plugin_nfacct.c +++ b/src/plugin_nfacct.c @@ -106,7 +106,7 @@ void *nfacct_main(void *ptr) { struct timeval last, now; unsigned long long usec = 0, susec = 0; - RRD_STATS *st = NULL; + RRDSET *st = NULL; gettimeofday(&last, NULL); @@ -145,8 +145,8 @@ void *nfacct_main(void *ptr) { usec = usecdiff(&now, &last) - susec; debug(D_NFACCT_LOOP, "nfacct.plugin: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec); - if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec; - else susec = update_every * 1000000ULL / 2ULL; + if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec; + else susec = rrd_update_every * 1000000ULL / 2ULL; // -------------------------------------------------------------------- @@ -154,43 +154,43 @@ void *nfacct_main(void *ptr) { if(nfacct_list && nfacct_list->len) { int i; - st = rrd_stats_find_bytype("nfacct", "packets"); + st = rrdset_find_bytype("nfacct", "packets"); if(!st) { - st = rrd_stats_create("nfacct", "packets", NULL, "netfilter", "Netfilter Accounting Packets", "packets/s", 1006, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfacct", "packets", NULL, "netfilter", "Netfilter Accounting Packets", "packets/s", 1006, rrd_update_every, RRDSET_TYPE_STACKED); for(i = 0; i < nfacct_list->len ; i++) - rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, nfacct_list->data[i].name, NULL, 1, rrd_update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); for(i = 0; i < nfacct_list->len ; i++) { - RRD_DIMENSION *rd = rrd_stats_dimension_find(st, nfacct_list->data[i].name); + RRDDIM *rd = rrddim_find(st, nfacct_list->data[i].name); - if(!rd) rd = rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); - if(rd) rrd_stats_dimension_set_by_pointer(st, rd, nfacct_list->data[i].pkts); + if(!rd) rd = rrddim_add(st, nfacct_list->data[i].name, NULL, 1, rrd_update_every, RRDDIM_INCREMENTAL); + if(rd) rrddim_set_by_pointer(st, rd, nfacct_list->data[i].pkts); } - rrd_stats_done(st); + rrdset_done(st); // ---------------------------------------------------------------- - st = rrd_stats_find_bytype("nfacct", "bytes"); + st = rrdset_find_bytype("nfacct", "bytes"); if(!st) { - st = rrd_stats_create("nfacct", "bytes", NULL, "netfilter", "Netfilter Accounting Bandwidth", "kilobytes/s", 1007, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfacct", "bytes", NULL, "netfilter", "Netfilter Accounting Bandwidth", "kilobytes/s", 1007, rrd_update_every, RRDSET_TYPE_STACKED); for(i = 0; i < nfacct_list->len ; i++) - rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); for(i = 0; i < nfacct_list->len ; i++) { - RRD_DIMENSION *rd = rrd_stats_dimension_find(st, nfacct_list->data[i].name); + RRDDIM *rd = rrddim_find(st, nfacct_list->data[i].name); - if(!rd) rd = rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL); - if(rd) rrd_stats_dimension_set_by_pointer(st, rd, nfacct_list->data[i].bytes); + if(!rd) rd = rrddim_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL); + if(rd) rrddim_set_by_pointer(st, rd, nfacct_list->data[i].bytes); } - rrd_stats_done(st); + rrdset_done(st); } // -------------------------------------------------------------------- diff --git a/src/plugin_proc.c b/src/plugin_proc.c index 8911d81b..294188b3 100755 --- a/src/plugin_proc.c +++ b/src/plugin_proc.c @@ -25,7 +25,7 @@ void *proc_main(void *ptr) struct timeval last, now; gettimeofday(&last, NULL); - last.tv_sec -= update_every; + last.tv_sec -= rrd_update_every; // disable (by default) various interface that are not needed config_get_boolean("plugin:proc:/proc/net/dev", "interface lo", 0); @@ -44,7 +44,7 @@ void *proc_main(void *ptr) int vdo_proc_net_rpc_nfsd = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfsd", 1); int vdo_cpu_netdata = !config_get_boolean("plugin:proc", "netdata server resources", 1); - RRD_STATS *stcpu = NULL, *stclients = NULL, *streqs = NULL, *stbytes = NULL; + RRDSET *stcpu = NULL, *stclients = NULL, *streqs = NULL, *stbytes = NULL; gettimeofday(&last, NULL); getrusage(RUSAGE_SELF, &me_last); @@ -56,50 +56,50 @@ void *proc_main(void *ptr) if(!vdo_proc_net_dev) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_dev()."); - vdo_proc_net_dev = do_proc_net_dev(update_every, usec+susec); + vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, usec+susec); } if(!vdo_proc_diskstats) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_diskstats()."); - vdo_proc_diskstats = do_proc_diskstats(update_every, usec+susec); + vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, usec+susec); } if(!vdo_proc_net_snmp) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp()."); - vdo_proc_net_snmp = do_proc_net_snmp(update_every, usec+susec); + vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, usec+susec); } if(!vdo_proc_net_netstat) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_netstat()."); - vdo_proc_net_netstat = do_proc_net_netstat(update_every, usec+susec); + vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, usec+susec); } if(!vdo_proc_net_stat_conntrack) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_stat_conntrack()."); - vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(update_every, usec+susec); + vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(rrd_update_every, usec+susec); } if(!vdo_proc_net_ip_vs_stats) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_ip_vs_stats()."); - vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(update_every, usec+susec); + vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(rrd_update_every, usec+susec); } if(!vdo_proc_stat) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_stat()."); - vdo_proc_stat = do_proc_stat(update_every, usec+susec); + vdo_proc_stat = do_proc_stat(rrd_update_every, usec+susec); } if(!vdo_proc_meminfo) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_meminfo()."); - vdo_proc_meminfo = do_proc_meminfo(update_every, usec+susec); + vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, usec+susec); } if(!vdo_proc_vmstat) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_vmstat()."); - vdo_proc_vmstat = do_proc_vmstat(update_every, usec+susec); + vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, usec+susec); } if(!vdo_proc_net_rpc_nfsd) { debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfsd()."); - vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(update_every, usec+susec); + vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(rrd_update_every, usec+susec); } // END -- the job is done @@ -109,8 +109,8 @@ void *proc_main(void *ptr) usec = usecdiff(&now, &last) - susec; debug(D_PROCNETDEV_LOOP, "PROCNETDEV: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec); - if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec; - else susec = update_every * 1000000ULL / 2ULL; + if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec; + else susec = rrd_update_every * 1000000ULL / 2ULL; // -------------------------------------------------------------------- @@ -119,61 +119,61 @@ void *proc_main(void *ptr) unsigned long long cpuuser = me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec; unsigned long long cpusyst = me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec; - if(!stcpu) stcpu = rrd_stats_find("netdata.server_cpu"); + if(!stcpu) stcpu = rrdset_find("netdata.server_cpu"); if(!stcpu) { - stcpu = rrd_stats_create("netdata", "server_cpu", NULL, "netdata", "NetData CPU usage", "milliseconds/s", 9999, update_every, CHART_TYPE_STACKED); + stcpu = rrdset_create("netdata", "server_cpu", NULL, "netdata", "NetData CPU usage", "milliseconds/s", 9999, rrd_update_every, RRDSET_TYPE_STACKED); - rrd_stats_dimension_add(stcpu, "user", NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(stcpu, "system", NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(stcpu, "user", NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL); + rrddim_add(stcpu, "system", NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(stcpu); + else rrdset_next(stcpu); - rrd_stats_dimension_set(stcpu, "user", cpuuser); - rrd_stats_dimension_set(stcpu, "system", cpusyst); - rrd_stats_done(stcpu); + rrddim_set(stcpu, "user", cpuuser); + rrddim_set(stcpu, "system", cpusyst); + rrdset_done(stcpu); bcopy(&me, &me_last, sizeof(struct rusage)); // ---------------------------------------------------------------- - if(!stclients) stclients = rrd_stats_find("netdata.clients"); + if(!stclients) stclients = rrdset_find("netdata.clients"); if(!stclients) { - stclients = rrd_stats_create("netdata", "clients", NULL, "netdata", "NetData Web Clients", "connected clients", 11000, update_every, CHART_TYPE_LINE); + stclients = rrdset_create("netdata", "clients", NULL, "netdata", "NetData Web Clients", "connected clients", 11000, rrd_update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(stclients, "clients", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); + rrddim_add(stclients, "clients", NULL, 1, 1, RRDDIM_ABSOLUTE); } - else rrd_stats_next(stclients); + else rrdset_next(stclients); - rrd_stats_dimension_set(stclients, "clients", global_statistics.connected_clients); - rrd_stats_done(stclients); + rrddim_set(stclients, "clients", global_statistics.connected_clients); + rrdset_done(stclients); // ---------------------------------------------------------------- - if(!streqs) streqs = rrd_stats_find("netdata.requests"); + if(!streqs) streqs = rrdset_find("netdata.requests"); if(!streqs) { - streqs = rrd_stats_create("netdata", "requests", NULL, "netdata", "NetData Web Requests", "requests/s", 12000, update_every, CHART_TYPE_LINE); + streqs = rrdset_create("netdata", "requests", NULL, "netdata", "NetData Web Requests", "requests/s", 12000, rrd_update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(streqs, "requests", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(streqs, "requests", NULL, 1, 1 * rrd_update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(streqs); + else rrdset_next(streqs); - rrd_stats_dimension_set(streqs, "requests", global_statistics.web_requests); - rrd_stats_done(streqs); + rrddim_set(streqs, "requests", global_statistics.web_requests); + rrdset_done(streqs); // ---------------------------------------------------------------- - if(!stbytes) stbytes = rrd_stats_find("netdata.net"); + if(!stbytes) stbytes = rrdset_find("netdata.net"); if(!stbytes) { - stbytes = rrd_stats_create("netdata", "net", NULL, "netdata", "NetData Network Traffic", "kilobits/s", 13000, update_every, CHART_TYPE_AREA); + stbytes = rrdset_create("netdata", "net", NULL, "netdata", "NetData Network Traffic", "kilobits/s", 13000, rrd_update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(stbytes, "in", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(stbytes, "out", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(stbytes, "in", NULL, 8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL); + rrddim_add(stbytes, "out", NULL, -8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(stbytes); + else rrdset_next(stbytes); - rrd_stats_dimension_set(stbytes, "in", global_statistics.bytes_received); - rrd_stats_dimension_set(stbytes, "out", global_statistics.bytes_sent); - rrd_stats_done(stbytes); + rrddim_set(stbytes, "in", global_statistics.bytes_received); + rrddim_set(stbytes, "out", global_statistics.bytes_sent); + rrdset_done(stbytes); } usleep(susec); diff --git a/src/plugin_tc.c b/src/plugin_tc.c index 62710495..018ad967 100755 --- a/src/plugin_tc.c +++ b/src/plugin_tc.c @@ -19,11 +19,11 @@ #define TC_LINE_MAX 1024 struct tc_class { - char id[RRD_STATS_NAME_MAX + 1]; - char name[RRD_STATS_NAME_MAX + 1]; + char id[RRD_ID_LENGTH_MAX + 1]; + char name[RRD_ID_LENGTH_MAX + 1]; - char leafid[RRD_STATS_NAME_MAX + 1]; - char parentid[RRD_STATS_NAME_MAX + 1]; + char leafid[RRD_ID_LENGTH_MAX + 1]; + char parentid[RRD_ID_LENGTH_MAX + 1]; int hasparent; int isleaf; @@ -33,9 +33,9 @@ struct tc_class { }; struct tc_device { - char id[RRD_STATS_NAME_MAX + 1]; - char name[RRD_STATS_NAME_MAX + 1]; - char family[RRD_STATS_NAME_MAX + 1]; + char id[RRD_ID_LENGTH_MAX + 1]; + char name[RRD_ID_LENGTH_MAX + 1]; + char family[RRD_ID_LENGTH_MAX + 1]; struct tc_class *classes; }; @@ -81,43 +81,43 @@ void tc_device_commit(struct tc_device *d) char var_name[4096 + 1]; snprintf(var_name, 4096, "qos for %s", d->id); if(config_get_boolean("plugin:tc", var_name, enable_new_interfaces)) { - RRD_STATS *st = rrd_stats_find_bytype(RRD_TYPE_TC, d->id); + RRDSET *st = rrdset_find_bytype(RRD_TYPE_TC, d->id); if(!st) { debug(D_TC_LOOP, "TC: Committing new TC device '%s'", d->name); - st = rrd_stats_create(RRD_TYPE_TC, d->id, d->name, d->family, "Class Usage", "kilobits/s", 1000, update_every, CHART_TYPE_STACKED); + st = rrdset_create(RRD_TYPE_TC, d->id, d->name, d->family, "Class Usage", "kilobits/s", 1000, rrd_update_every, RRDSET_TYPE_STACKED); for ( c = d->classes ; c ; c = c->next) { if(c->isleaf && c->hasparent) - rrd_stats_dimension_add(st, c->id, c->name, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, c->id, c->name, 8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL); } } else { - rrd_stats_next_plugins(st); + rrdset_next_plugins(st); - if(strcmp(d->id, d->name) != 0) rrd_stats_set_name(st, d->name); + if(strcmp(d->id, d->name) != 0) rrdset_set_name(st, d->name); } for ( c = d->classes ; c ; c = c->next) { if(c->isleaf && c->hasparent) { - if(rrd_stats_dimension_set(st, c->id, c->bytes) != 0) { + if(rrddim_set(st, c->id, c->bytes) != 0) { // new class, we have to add it - rrd_stats_dimension_add(st, c->id, c->name, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_set(st, c->id, c->bytes); + rrddim_add(st, c->id, c->name, 8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL); + rrddim_set(st, c->id, c->bytes); } // if it has a name, different to the id if(strcmp(c->id, c->name) != 0) { // update the rrd dimension with the new name - RRD_DIMENSION *rd; + RRDDIM *rd; for(rd = st->dimensions ; rd ; rd = rd->next) { - if(strcmp(rd->id, c->id) == 0) { rrd_stats_dimension_set_name(st, rd, c->name); break; } + if(strcmp(rd->id, c->id) == 0) { rrddim_set_name(st, rd, c->name); break; } } } } } - rrd_stats_done(st); + rrdset_done(st); } } @@ -126,7 +126,7 @@ void tc_device_set_class_name(struct tc_device *d, char *id, char *name) struct tc_class *c; for ( c = d->classes ; c ; c = c->next) { if(strcmp(c->id, id) == 0) { - strncpy(c->name, name, RRD_STATS_NAME_MAX); + strncpy(c->name, name, RRD_ID_LENGTH_MAX); // no need for null termination - it is already null break; } @@ -135,13 +135,13 @@ void tc_device_set_class_name(struct tc_device *d, char *id, char *name) void tc_device_set_device_name(struct tc_device *d, char *name) { - strncpy(d->name, name, RRD_STATS_NAME_MAX); + strncpy(d->name, name, RRD_ID_LENGTH_MAX); // no need for null termination - it is already null } void tc_device_set_device_family(struct tc_device *d, char *name) { - strncpy(d->family, name, RRD_STATS_NAME_MAX); + strncpy(d->family, name, RRD_ID_LENGTH_MAX); // no need for null termination - it is already null } @@ -155,7 +155,7 @@ struct tc_device *tc_device_create(char *name) return NULL; } - strncpy(d->id, name, RRD_STATS_NAME_MAX); + strncpy(d->id, name, RRD_ID_LENGTH_MAX); strcpy(d->name, d->id); strcpy(d->family, d->id); @@ -177,10 +177,10 @@ struct tc_class *tc_class_add(struct tc_device *n, char *id, char *parentid, cha c->next = n->classes; n->classes = c; - strncpy(c->id, id, RRD_STATS_NAME_MAX); + strncpy(c->id, id, RRD_ID_LENGTH_MAX); strcpy(c->name, c->id); - if(parentid) strncpy(c->parentid, parentid, RRD_STATS_NAME_MAX); - if(leafid) strncpy(c->leafid, leafid, RRD_STATS_NAME_MAX); + if(parentid) strncpy(c->parentid, parentid, RRD_ID_LENGTH_MAX); + if(leafid) strncpy(c->leafid, leafid, RRD_ID_LENGTH_MAX); // no need for null termination on the strings, because of calloc() @@ -217,7 +217,7 @@ void *tc_main(void *ptr) struct tc_device *device = NULL; struct tc_class *class = NULL; - snprintf(buffer, TC_LINE_MAX, "exec %s %d", config_get("plugin:tc", "script to run to get tc values", PLUGINS_DIR "/tc-qos-helper.sh"), update_every); + snprintf(buffer, TC_LINE_MAX, "exec %s %d", config_get("plugin:tc", "script to run to get tc values", PLUGINS_DIR "/tc-qos-helper.sh"), rrd_update_every); debug(D_TC_LOOP, "executing '%s'", buffer); // fp = popen(buffer, "r"); fp = mypopen(buffer, &tc_child_pid); @@ -331,7 +331,7 @@ void *tc_main(void *ptr) class = NULL; } - sleep(update_every); + sleep(rrd_update_every); } return NULL; diff --git a/src/plugins.d/Makefile b/src/plugins.d/Makefile index 20a924f7..bdfa3ff1 100755 --- a/src/plugins.d/Makefile +++ b/src/plugins.d/Makefile @@ -1,5 +1,5 @@ ifndef BIN_DIR -BIN_DIR = "$(PWD)" +BIN_DIR = "." endif ifndef CONFIG_DIR @@ -16,13 +16,16 @@ endif COMMON_FLAGS = BIN_DIR='$(BIN_DIR)' CONFIG_DIR='$(CONFIG_DIR)' LOG_DIR='$(LOG_DIR)' PLUGINS_DIR='$(PLUGINS_DIR)' -CC = gcc +CC := gcc +libs := ifdef debug COMMON_FLAGS += debug=1 -CFLAGS = -Wall -Wextra -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' +# CFLAGS = -Wall -Wextra -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fsanitize=address -fno-omit-frame-pointer +CFLAGS := -Wall -Wextra -O -g -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fsanitize=address -fno-omit-frame-pointer +#libs += -ltsan -lpie else -CFLAGS = -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' +CFLAGS := -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fomit-frame-pointer endif all: options plugins @@ -33,8 +36,7 @@ options: plugins: apps.plugin apps.plugin: apps_plugin.c - @echo " $(CC) $@" - @$(CC) $(CFLAGS) -o $@ apps_plugin.c + $(CC) $(CFLAGS) -o $@ apps_plugin.c ../avl.o ../common.o ../log.o ../procfile.o $(libs) clean: -rm -f *.o apps.plugin core diff --git a/src/plugins.d/apps_plugin.c b/src/plugins.d/apps_plugin.c index 868168e2..e30e8b3b 100755 --- a/src/plugins.d/apps_plugin.c +++ b/src/plugins.d/apps_plugin.c @@ -24,6 +24,11 @@ #include #include +#include "../common.h" +#include "../log.h" +#include "../avl.h" +#include "../procfile.h" + #define MAX_COMPARE_NAME 15 #define MAX_NAME 100 @@ -42,66 +47,47 @@ unsigned long long file_counter = 0; // ---------------------------------------------------------------------------- // helper functions -unsigned long long usecdiff(struct timeval *now, struct timeval *last) { - return ((((now->tv_sec * 1000000ULL) + now->tv_usec) - ((last->tv_sec * 1000000ULL) + last->tv_usec))); -} - -char *trim(char *s) -{ - // skip leading spaces - while(*s && isspace(*s)) s++; - if(!*s) return NULL; - - // skip tailing spaces - int c = strlen(s) - 1; - while(c >= 0 && isspace(s[c])) { - s[c] = '\0'; - c--; - } - if(c < 0) return NULL; - if(!*s) return NULL; - return s; -} - -unsigned long simple_hash(const char *name) -{ - int i, len = strlen(name); - unsigned long hash = 0; - - for(i = 0; i < len ;i++) hash += (i * name[i]) + i + name[i]; +long get_processors(void) { + int processors = 0; - return hash; -} + procfile *ff = procfile_open("/proc/stat", O_RDONLY); + if(!ff) return 1; -long get_processors(void) -{ - char buffer[1025], *s; - int processors = 0; + ff = procfile_readall(ff); + if(!ff) { + procfile_close(ff); + return 1; + } - FILE *fp = fopen("/proc/stat", "r"); - if(!fp) return 1; + unsigned int i; + for(i = 0; i < procfile_lines(ff); i++) { + if(!procfile_linewords(ff, i)) continue; - while((s = fgets(buffer, 1024, fp))) { - if(strncmp(buffer, "cpu", 3) == 0) processors++; + if(strncmp(procfile_lineword(ff, i, 0), "cpu", 3) == 0) processors++; } - fclose(fp); processors--; if(processors < 1) processors = 1; + + procfile_close(ff); return processors; } -long get_pid_max(void) -{ - char buffer[1025], *s; +long get_pid_max(void) { long mpid = 32768; - FILE *fp = fopen("/proc/sys/kernel/pid_max", "r"); - if(!fp) return 1; + procfile *ff = procfile_open("/proc/sys/kernel/pid_max", O_RDONLY); + if(!ff) return mpid; - s = fgets(buffer, 1024, fp); - if(s) mpid = atol(buffer); - fclose(fp); - if(mpid < 32768) mpid = 32768; + ff = procfile_readall(ff); + if(!ff) { + procfile_close(ff); + return mpid; + } + + mpid = atol(procfile_lineword(ff, 0, 0)); + if(mpid) mpid = 32768; + + procfile_close(ff); return mpid; } @@ -122,7 +108,7 @@ unsigned long long get_hertz(void) hz = (sizeof(long)==sizeof(int) || htons(999)==999) ? 100UL : 1024UL; #endif - fprintf(stderr, "apps.plugin: ERROR: unknown HZ value. Assuming %llu.\n", hz); + error("apps.plugin: ERROR: unknown HZ value. Assuming %llu.", hz); return hz; } @@ -215,7 +201,7 @@ struct target *get_target(const char *id, struct target *target) w = calloc(sizeof(struct target), 1); if(!w) { - fprintf(stderr, "apps.plugin: cannot allocate %lu bytes of memory\n", (unsigned long)sizeof(struct target)); + error("apps.plugin: cannot allocate %lu bytes of memory", (unsigned long)sizeof(struct target)); return NULL; } @@ -245,7 +231,7 @@ int read_process_groups(const char *name) if(debug) fprintf(stderr, "apps.plugin: process groups file: '%s'\n", filename); FILE *fp = fopen(filename, "r"); if(!fp) { - fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' (%s)\n", filename, strerror(errno)); + error("apps.plugin: ERROR: cannot open file '%s' (%s)", filename, strerror(errno)); return 1; } @@ -306,7 +292,7 @@ int read_process_groups(const char *name) } if(w) strncpy(w->name, t, MAX_NAME); - if(!count) fprintf(stderr, "apps.plugin: ERROR: the line %ld on file '%s', for group '%s' does not state any process names.\n", line, filename, t); + if(!count) error("apps.plugin: ERROR: the line %ld on file '%s', for group '%s' does not state any process names.", line, filename, t); } fclose(fp); @@ -429,13 +415,13 @@ struct pid_stat *get_entry(pid_t pid) all_pids[pid] = calloc(sizeof(struct pid_stat), 1); if(!all_pids[pid]) { - fprintf(stderr, "apps.plugin: ERROR: Cannot allocate %lu bytes of memory", (unsigned long)sizeof(struct pid_stat)); + error("apps.plugin: ERROR: Cannot allocate %lu bytes of memory", (unsigned long)sizeof(struct pid_stat)); return NULL; } all_pids[pid]->fds = calloc(sizeof(int), 100); if(!all_pids[pid]->fds) - fprintf(stderr, "apps.plugin: ERROR: Cannot allocate %ld bytes of memory\n", (unsigned long)(sizeof(int) * 100)); + error("apps.plugin: ERROR: Cannot allocate %ld bytes of memory", (unsigned long)(sizeof(int) * 100)); else all_pids[pid]->fds_size = 100; if(root) root->prev = all_pids[pid]; @@ -506,16 +492,53 @@ int walk_down(pid_t pid, int level) { // this is used to keep a global list of all open files of the system // it is needed in order to figure out the unique files a process tree has open +#define FILE_DESCRIPTORS_INCREASE_STEP 100 + struct file_descriptor { + avl avl; + unsigned long magic; unsigned long hash; - char *name; + const char *name; int type; long count; + long pos; } *all_files = NULL; int all_files_len = 0; int all_files_size = 0; +int file_descriptor_compare(void* a, void* b) { + if(((struct file_descriptor *)a)->magic != 0x0BADCAFE || ((struct file_descriptor *)b)->magic != 0x0BADCAFE) + error("Corrupted index data detected. Please report this."); + + if(((struct file_descriptor *)a)->hash < ((struct file_descriptor *)b)->hash) + return -1; + else if(((struct file_descriptor *)a)->hash > ((struct file_descriptor *)b)->hash) + return 1; + else return strcmp(((struct file_descriptor *)a)->name, ((struct file_descriptor *)b)->name); +} +int file_descriptor_iterator(avl *a) { if(a) {}; return 0; } + +avl_tree all_files_index = { + NULL, + file_descriptor_compare +}; + +static struct file_descriptor *file_descriptor_find(const char *name, unsigned long hash) { + struct file_descriptor *result = NULL, tmp; + tmp.hash = (hash)?hash:simple_hash(name); + tmp.name = name; + tmp.count = 0; + tmp.pos = 0; + tmp.magic = 0x0BADCAFE; + + avl_search(&all_files_index, (avl *)&tmp, file_descriptor_iterator, (avl **)&result); + return result; +} + +#define file_descriptor_add(fd) avl_insert(&all_files_index, (avl *)(fd)) +#define file_descriptor_remove(fd) avl_remove(&all_files_index, (avl *)(fd)) + #define FILETYPE_OTHER 0 #define FILETYPE_FILE 1 #define FILETYPE_PIPE 2 @@ -528,19 +551,91 @@ int all_files_size = 0; void file_descriptor_not_used(int id) { - if(id > 0 && id < all_files_len) { - if(all_files[id].count > 0) + if(id > 0 && id < all_files_size) { + if(all_files[id].magic != 0x0BADCAFE) { + error("Ignoring request to remove empty file id %d.", id); + return; + } + + if(all_files[id].count > 0) { all_files[id].count--; + + if(!all_files[id].count) { + file_descriptor_remove(&all_files[id]); + all_files[id].magic = 0x00000000; + all_files_len--; + } + } else - fprintf(stderr, "apps.plugin: ERROR: request to decrease counter of fd %d (%s), while the use counter is 0\n", id, all_files[id].name); + error("apps.plugin: ERROR: request to decrease counter of fd %d (%s), while the use counter is 0", id, all_files[id].name); } - else fprintf(stderr, "apps.plugin: ERROR: request to decrease counter of fd %d, which is outside the array size (1 to %d)\n", id, all_files_len); + else error("apps.plugin: ERROR: request to decrease counter of fd %d, which is outside the array size (1 to %d)", id, all_files_size); } unsigned long file_descriptor_find_or_add(const char *name) { - int type = FILETYPE_OTHER; + static int last_pos = 0; + unsigned long hash = simple_hash(name); + if(debug) fprintf(stderr, "apps.plugin: adding or finding name '%s' with hash %lu\n", name, hash); + + struct file_descriptor *fd = file_descriptor_find(name, hash); + if(fd) { + // found + fd->count++; + return fd->pos; + } + // not found + + // check we have enough memory to add it + if(!all_files || all_files_len == all_files_size) { + void *old = all_files; + + // there is no empty slot + if(debug) fprintf(stderr, "apps.plugin: extending fd array to %d entries\n", all_files_size + FILE_DESCRIPTORS_INCREASE_STEP); + all_files = realloc(all_files, (all_files_size + FILE_DESCRIPTORS_INCREASE_STEP) * sizeof(struct file_descriptor)); + + // if the address changed, we have to rebuild the index + // since all pointers are now invalid + if(old && old != (void *)all_files) { + if(debug) fprintf(stderr, "apps.plugin: re-indexing.\n"); + all_files_index.root = NULL; + int i; + for(i = 0; i < all_files_size; i++) { + if(!all_files[i].count) continue; + file_descriptor_add(&all_files[i]); + } + } + + if(!all_files_size) all_files_len = 1; + all_files_size += FILE_DESCRIPTORS_INCREASE_STEP; + } + + // search for an empty slot + int i, c; + for(i = 0, c = last_pos ; i < all_files_size ; i++, c++) { + if(c >= all_files_size) c = 0; + if(c == 0) continue; + + if(!all_files[c].count) { + if(all_files[c].magic == 0x0BADCAFE && all_files[c].name && file_descriptor_find(all_files[c].name, all_files[c].hash)) + error("apps.plugin: fd on position %d is not cleared properly. It still has %s in it.\n", c, all_files[c].name); + + if(debug) fprintf(stderr, "apps.plugin: re-using fd position %d for %s (last name: %s)\n", c, name, all_files[c].name); + if(all_files[c].name) free((void *)all_files[c].name); + all_files[c].name = NULL; + break; + } + } + if(i == all_files_size) { + error("We should find an empty slot, but there isn't any"); + return 0; + } + all_files_len++; + + // else we have an empty slot in 'c' + + int type = FILETYPE_OTHER; if(name[0] == '/') type = FILETYPE_FILE; else if(strncmp(name, "pipe:", 5) == 0) type = FILETYPE_PIPE; else if(strncmp(name, "socket:", 7) == 0) type = FILETYPE_SOCKET; @@ -558,55 +653,14 @@ unsigned long file_descriptor_find_or_add(const char *name) type = FILETYPE_OTHER; } - // init - if(!all_files) { - all_files = malloc(1024 * sizeof(struct file_descriptor)); - if(!all_files) return 0; - - all_files_size = 1024; - all_files_len = 1; // start from 1, skip 0 - if(debug) fprintf(stderr, "apps.plugin: initialized fd array to %d entries\n", all_files_size); - } - - // try to find it - unsigned long hash = simple_hash(name); - int c; - for( c = 0 ; c < all_files_len ; c++) { - if(all_files[c].hash == hash && strcmp(all_files[c].name, name) == 0) break; - } - - // found it - if(c < all_files_len) { - all_files[c].count++; - return c; - } - - // not found, search for an empty slot - for(c = 0 ; c < all_files_len ; c++) { - if(!all_files[c].count) { - if(debug) fprintf(stderr, "apps.plugin: re-using fd position %d (last name: %s)\n", c, all_files[c].name); - if(all_files[c].name) free(all_files[c].name); - break; - } - } - - if(c == all_files_len) { - // not found any emtpty slot - all_files_len++; - - if(c >= all_files_size) { - // not enough memory - extend it - if(debug) fprintf(stderr, "apps.plugin: extending fd array to %d entries\n", all_files_size + 1024); - all_files = realloc(all_files, (all_files_size + 1024) * sizeof(struct file_descriptor)); - all_files_size += 1024; - } - } - // else we have the slot in 'c' - all_files[c].name = strdup(name); all_files[c].hash = hash; all_files[c].type = type; - all_files[c].count++; + all_files[c].pos = c; + all_files[c].count = 1; + all_files[c].magic = 0x0BADCAFE; + + file_descriptor_add(&all_files[c]); if(debug) fprintf(stderr, "apps.plugin: using fd position %d (name: %s)\n", c, all_files[c].name); @@ -671,7 +725,7 @@ int update_from_proc(void) if(fd == -1) { if(errno != ENOENT && errno != ESRCH) { if(!count_errors++ || debug) - fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).\n", filename, errno, strerror(errno)); + error("apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).", filename, errno, strerror(errno)); } continue; } @@ -682,7 +736,7 @@ int update_from_proc(void) if(bytes == -1) { if(!count_errors++ || debug) - fprintf(stderr, "apps.plugin: ERROR: cannot read from file '%s' (%s).\n", filename, strerror(errno)); + error("apps.plugin: ERROR: cannot read from file '%s' (%s).", filename, strerror(errno)); continue; } @@ -734,7 +788,7 @@ int update_from_proc(void) if(parsed < 39) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: file %s gave %d results (expected 44)\n", filename, parsed); + error("apps.plugin: ERROR: file %s gave %d results (expected 44)\n", filename, parsed); } // check if it is target @@ -767,7 +821,7 @@ int update_from_proc(void) if(fd == -1) { if(errno != ENOENT && errno != ESRCH) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).\n", filename, errno, strerror(errno)); + error("apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).", filename, errno, strerror(errno)); } } else { @@ -777,7 +831,7 @@ int update_from_proc(void) if(bytes == -1) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: cannot read from file '%s' (%s).\n", filename, strerror(errno)); + error("apps.plugin: ERROR: cannot read from file '%s' (%s).", filename, strerror(errno)); } else if(bytes > 10) { buffer[bytes] = '\0'; @@ -797,7 +851,7 @@ int update_from_proc(void) if(parsed < 7) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: file %s gave %d results (expected 7)\n", filename, parsed); + error("apps.plugin: ERROR: file %s gave %d results (expected 7)", filename, parsed); } } } @@ -810,7 +864,7 @@ int update_from_proc(void) if(fd == -1) { if(errno != ENOENT && errno != ESRCH) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).\n", filename, errno, strerror(errno)); + error("apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).", filename, errno, strerror(errno)); } } else { @@ -820,7 +874,7 @@ int update_from_proc(void) if(bytes == -1) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: cannot read from file '%s' (%s).\n", filename, strerror(errno)); + error("apps.plugin: ERROR: cannot read from file '%s' (%s).", filename, strerror(errno)); } else if(bytes > 10) { buffer[bytes] = '\0'; @@ -839,7 +893,7 @@ int update_from_proc(void) if(parsed < 7) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: file %s gave %d results (expected 7)\n", filename, parsed); + error("apps.plugin: ERROR: file %s gave %d results (expected 7)", filename, parsed); } } } @@ -869,7 +923,7 @@ int update_from_proc(void) if(debug) fprintf(stderr, "apps.plugin: extending fd memory slots for %s from %d to %d\n", p->comm, p->fds_size, fdid + 100); p->fds = realloc(p->fds, (fdid + 100) * sizeof(int)); if(!p->fds) { - fprintf(stderr, "apps.plugin: ERROR: cannot re-allocate fds for %s\n", p->comm); + error("apps.plugin: ERROR: cannot re-allocate fds for %s", p->comm); break; } @@ -886,7 +940,7 @@ int update_from_proc(void) if(l == -1) { if(debug || (p->target && p->target->debug)) { if(!count_errors++ || debug || (p->target && p->target->debug)) - fprintf(stderr, "apps.plugin: ERROR: cannot read link %s\n", fdname); + error("apps.plugin: ERROR: cannot read link %s", fdname); } continue; } @@ -919,7 +973,7 @@ int update_from_proc(void) p->updated = 1; } if(count_errors > 1000) { - fprintf(stderr, "apps.plugin: ERROR: %ld more errors encountered\n", count_errors - 1); + error("apps.plugin: ERROR: %ld more errors encountered\n", count_errors - 1); count_errors = 0; } @@ -957,7 +1011,7 @@ void update_statistics(void) p->parent = all_pids[p->ppid]; p->parent->childs++; } - else if(p->ppid != 0) fprintf(stderr, "apps.plugin: \t\tWRONG! pid %d %s states parent %d, but the later does not exist.\n", p->pid, p->comm, p->ppid); + else if(p->ppid != 0) error("apps.plugin: \t\tWRONG! pid %d %s states parent %d, but the later does not exist.", p->pid, p->comm, p->ppid); } // find all the procs with 0 childs and merge them to their parents @@ -1025,7 +1079,7 @@ void update_statistics(void) for(p = root; p ; p = p->next) { if(p->updated) continue; - fprintf(stderr, "apps.plugin: UNMERGING %d %s\n", p->pid, p->comm); + if(debug) fprintf(stderr, "apps.plugin: UNMERGING %d %s\n", p->pid, p->comm); unsigned long long diff_utime = p->utime + p->cutime + p->fix_cutime; unsigned long long diff_stime = p->stime + p->cstime + p->fix_cstime; @@ -1042,35 +1096,35 @@ void update_statistics(void) diff_utime -= x; t->diff_cutime -= x; t->fix_cutime += x; - fprintf(stderr, "apps.plugin: \t cutime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); + if(debug) fprintf(stderr, "apps.plugin: \t cutime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); } if(diff_stime && t->diff_cstime) { x = (t->diff_cstime < diff_stime)?t->diff_cstime:diff_stime; diff_stime -= x; t->diff_cstime -= x; t->fix_cstime += x; - fprintf(stderr, "apps.plugin: \t cstime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); + if(debug) fprintf(stderr, "apps.plugin: \t cstime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); } if(diff_minflt && t->diff_cminflt) { x = (t->diff_cminflt < diff_minflt)?t->diff_cminflt:diff_minflt; diff_minflt -= x; t->diff_cminflt -= x; t->fix_cminflt += x; - fprintf(stderr, "apps.plugin: \t cminflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); + if(debug) fprintf(stderr, "apps.plugin: \t cminflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); } if(diff_majflt && t->diff_cmajflt) { x = (t->diff_cmajflt < diff_majflt)?t->diff_cmajflt:diff_majflt; diff_majflt -= x; t->diff_cmajflt -= x; t->fix_cmajflt += x; - fprintf(stderr, "apps.plugin: \t cmajflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); + if(debug) fprintf(stderr, "apps.plugin: \t cmajflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name); } } - if(diff_utime) fprintf(stderr, "apps.plugin: \t cannot fix up utime %llu\n", diff_utime); - if(diff_stime) fprintf(stderr, "apps.plugin: \t cannot fix up stime %llu\n", diff_stime); - if(diff_minflt) fprintf(stderr, "apps.plugin: \t cannot fix up minflt %llu\n", diff_minflt); - if(diff_majflt) fprintf(stderr, "apps.plugin: \t cannot fix up majflt %llu\n", diff_majflt); + if(diff_utime) error("apps.plugin: \t cannot fix up utime %llu", diff_utime); + if(diff_stime) error("apps.plugin: \t cannot fix up stime %llu", diff_stime); + if(diff_minflt) error("apps.plugin: \t cannot fix up minflt %llu", diff_minflt); + if(diff_majflt) error("apps.plugin: \t cannot fix up majflt %llu", diff_majflt); } #endif @@ -1080,9 +1134,9 @@ void update_statistics(void) for (w = target_root; w ; w = w->next) { targets++; - w->fds = calloc(sizeof(int), all_files_len); + w->fds = calloc(sizeof(int), all_files_size); if(!w->fds) - fprintf(stderr, "apps.plugin: ERROR: cannot allocate memory for fds in %s\n", w->name); + error("apps.plugin: ERROR: cannot allocate memory for fds in %s", w->name); w->minflt = 0; w->majflt = 0; @@ -1120,7 +1174,7 @@ void update_statistics(void) // concentrate everything on the targets for(p = root; p ; p = p->next) { if(!p->target) { - fprintf(stderr, "apps.plugin: ERROR: pid %d %s was left without a target!\n", p->pid, p->comm); + error("apps.plugin: ERROR: pid %d %s was left without a target!", p->pid, p->comm); continue; } @@ -1158,11 +1212,11 @@ void update_statistics(void) for(c = 0; c < p->fds_size ;c++) { if(p->fds[c] == 0) continue; - if(p->fds[c] > 0 && p->fds[c] < all_files_len) { + if(p->fds[c] < all_files_size) { if(p->target->fds) p->target->fds[p->fds[c]]++; } else - fprintf(stderr, "apps.plugin: ERROR: invalid fd number %d\n", p->fds[c]); + error("apps.plugin: ERROR: invalid fd number %d", p->fds[c]); } if(debug || p->target->debug) fprintf(stderr, "apps.plugin: \tAgregating %s pid %d on %s utime=%llu, stime=%llu, cutime=%llu, cstime=%llu, minflt=%llu, majflt=%llu, cminflt=%llu, cmajflt=%llu\n", p->comm, p->pid, p->target->name, p->utime, p->stime, p->cutime, p->cstime, p->minflt, p->majflt, p->cminflt, p->cmajflt); @@ -1242,7 +1296,7 @@ void update_statistics(void) w->openeventpolls = 0; w->openother = 0; - for(c = 1; c < all_files_len ;c++) { + for(c = 1; c < all_files_size ;c++) { if(w->fds && w->fds[c] > 0) switch(all_files[c].type) { case FILETYPE_FILE: w->openfiles++; @@ -1627,7 +1681,7 @@ void parse_args(int argc, char **argv) continue; } - fprintf(stderr, "apps.plugin: ERROR: cannot understand option %s\n", argv[i]); + error("apps.plugin: ERROR: cannot understand option %s", argv[i]); exit(1); } @@ -1635,13 +1689,15 @@ void parse_args(int argc, char **argv) if(!name) name = "groups"; if(read_process_groups(name)) { - fprintf(stderr, "apps.plugin: ERROR: cannot read process groups %s\n", name); + error("apps.plugin: ERROR: cannot read process groups %s", name); exit(1); } } int main(int argc, char **argv) { + // debug_flags = D_PROCFILE; + unsigned long started_t = time(NULL), current_t; Hertz = get_hertz(); pid_max = get_pid_max(); @@ -1651,7 +1707,7 @@ int main(int argc, char **argv) all_pids = calloc(sizeof(struct pid_stat *), pid_max); if(!all_pids) { - fprintf(stderr, "apps.plugin: ERROR: cannot allocate %lu bytes of memory.\n", sizeof(struct pid_stat *) * pid_max); + error("apps.plugin: ERROR: cannot allocate %lu bytes of memory.", sizeof(struct pid_stat *) * pid_max); printf("DISABLE\n"); exit(1); } @@ -1663,7 +1719,7 @@ int main(int argc, char **argv) for(;1; counter++) { if(!update_from_proc()) { - fprintf(stderr, "apps.plugin: ERROR: cannot allocate %lu bytes of memory.\n", sizeof(struct pid_stat *) * pid_max); + error("apps.plugin: ERROR: cannot allocate %lu bytes of memory.", sizeof(struct pid_stat *) * pid_max); printf("DISABLE\n"); exit(1); } diff --git a/src/plugins_d.c b/src/plugins_d.c index 21430984..4c9f8e85 100755 --- a/src/plugins_d.c +++ b/src/plugins_d.c @@ -32,7 +32,7 @@ void *pluginsd_worker_thread(void *arg) break; } - RRD_STATS *st = NULL; + RRDSET *st = NULL; unsigned long long count = 0; while(fgets(line, PLUGINSD_LINE_MAX, fp) != NULL) { @@ -64,7 +64,7 @@ void *pluginsd_worker_thread(void *arg) } if(st->debug) debug(D_PLUGINSD, "PLUGINSD: '%s' is setting dimension %s/%s to %s", cd->fullfilename, st->id, dimension, value); - rrd_stats_dimension_set(st, dimension, atoll(value)); + rrddim_set(st, dimension, atoll(value)); count++; } @@ -79,7 +79,7 @@ void *pluginsd_worker_thread(void *arg) break; } - st = rrd_stats_find(id); + st = rrdset_find(id); if(!st) { error("PLUGINSD: '%s' is requesting a BEGIN on chart '%s', which does not exist. Disabling it.", cd->fullfilename, id); cd->enabled = 0; @@ -90,8 +90,8 @@ void *pluginsd_worker_thread(void *arg) if(st->counter_done) { unsigned long long microseconds = 0; if(microseconds_txt && *microseconds_txt) microseconds = strtoull(microseconds_txt, NULL, 10); - if(microseconds) rrd_stats_next_usec(st, microseconds); - else rrd_stats_next_plugins(st); + if(microseconds) rrdset_next_usec(st, microseconds); + else rrdset_next_plugins(st); } } else if(!strcmp(s, "END")) { @@ -104,7 +104,7 @@ void *pluginsd_worker_thread(void *arg) if(st->debug) debug(D_PLUGINSD, "PLUGINSD: '%s' is requesting a END on chart %s", cd->fullfilename, st->id); - rrd_stats_done(st); + rrdset_done(st); st = NULL; } else if(!strcmp(s, "FLUSH")) { @@ -143,26 +143,26 @@ void *pluginsd_worker_thread(void *arg) if(update_every_s) update_every = atoi(update_every_s); if(!update_every) update_every = cd->update_every; - int chart_type = CHART_TYPE_LINE; - if(chart) chart_type = chart_type_id(chart); + int chart_type = RRDSET_TYPE_LINE; + if(chart) chart_type = rrdset_type_id(chart); if(!name || !*name) name = NULL; if(!family || !*family) family = id; if(!category || !*category) category = type; - st = rrd_stats_find_bytype(type, id); + st = rrdset_find_bytype(type, id); if(!st) { debug(D_PLUGINSD, "PLUGINSD: Creating chart type='%s', id='%s', name='%s', family='%s', category='%s', chart='%s', priority=%d, update_every=%d" , type, id , name?name:"" , family?family:"" , category?category:"" - , chart_type_name(chart_type) + , rrdset_type_name(chart_type) , priority , update_every ); - st = rrd_stats_create(type, id, name, family, title, units, priority, update_every, chart_type); + st = rrdset_create(type, id, name, family, title, units, priority, update_every, chart_type); cd->update_every = update_every; if(strcmp(category, "none") == 0) st->isdetail = 1; @@ -205,15 +205,15 @@ void *pluginsd_worker_thread(void *arg) , st->id , id , name?name:"" - , algorithm_name(algorithm_id(algorithm)) + , rrddim_algorithm_name(rrddim_algorithm_id(algorithm)) , multiplier , divisor , hidden?hidden:"" ); - RRD_DIMENSION *rd = rrd_stats_dimension_find(st, id); + RRDDIM *rd = rrddim_find(st, id); if(!rd) { - rd = rrd_stats_dimension_add(st, id, name, multiplier, divisor, algorithm_id(algorithm)); + rd = rrddim_add(st, id, name, multiplier, divisor, rrddim_algorithm_id(algorithm)); if(hidden && strcmp(hidden, "hidden") == 0) rd->hidden = 1; } else if(st->debug) debug(D_PLUGINSD, "PLUGINSD: dimension %s/%s already exists. Not adding it again.", st->id, id); @@ -238,14 +238,14 @@ void *pluginsd_worker_thread(void *arg) gettimeofday(&now, NULL); if(!usec && !susec) { // our first run - susec = cd->update_every * 1000000ULL; + susec = cd->rrd_update_every * 1000000ULL; } else { // second+ run usec = usecdiff(&now, &last) - susec; error("PLUGINSD: %s last loop took %llu usec (worked for %llu, sleeped for %llu).\n", cd->fullfilename, usec + susec, usec, susec); - if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec; - else susec = update_every * 1000000ULL / 2ULL; + if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec; + else susec = rrd_update_every * 1000000ULL / 2ULL; } error("PLUGINSD: %s sleeping for %llu. Will kill with SIGCONT pid %d to wake it up.\n", cd->fullfilename, susec, cd->pid); @@ -351,7 +351,7 @@ void *pluginsd_main(void *ptr) snprintf(cd->fullfilename, FILENAME_MAX, "%s/%s", dir_name, cd->filename); cd->enabled = enabled; - cd->update_every = config_get_number(cd->id, "update every", update_every); + cd->update_every = config_get_number(cd->id, "update every", rrd_update_every); cd->started_t = time(NULL); char *def = ""; diff --git a/src/proc_diskstats.c b/src/proc_diskstats.c index 62b66fad..d8aa6aff 100755 --- a/src/proc_diskstats.c +++ b/src/proc_diskstats.c @@ -186,12 +186,12 @@ int do_proc_diskstats(int update_every, unsigned long long dt) { if(!config_get_boolean("plugin:proc:/proc/diskstats", var_name, def_enabled)) continue; } - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- if(do_io) { - st = rrd_stats_find_bytype(RRD_TYPE_DISK, disk); + st = rrdset_find_bytype(RRD_TYPE_DISK, disk); if(!st) { char tf[FILENAME_MAX + 1], *t; char ssfilename[FILENAME_MAX + 1]; @@ -222,90 +222,90 @@ int do_proc_diskstats(int update_every, unsigned long long dt) { } else error("Cannot read sector size for device %s from %s. Assuming 512.", disk, ssfilename); - st = rrd_stats_create(RRD_TYPE_DISK, disk, NULL, disk, "Disk I/O", "kilobytes/s", 2000, update_every, CHART_TYPE_AREA); + st = rrdset_create(RRD_TYPE_DISK, disk, NULL, disk, "Disk I/O", "kilobytes/s", 2000, update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(st, "reads", NULL, sector_size, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "writes", NULL, sector_size * -1, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "reads", NULL, sector_size, 1024 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "writes", NULL, sector_size * -1, 1024 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "reads", readsectors); - rrd_stats_dimension_set(st, "writes", writesectors); - rrd_stats_done(st); + rrddim_set(st, "reads", readsectors); + rrddim_set(st, "writes", writesectors); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_ops) { - st = rrd_stats_find_bytype("disk_ops", disk); + st = rrdset_find_bytype("disk_ops", disk); if(!st) { - st = rrd_stats_create("disk_ops", disk, NULL, disk, "Disk Operations", "operations/s", 2001, update_every, CHART_TYPE_LINE); + st = rrdset_create("disk_ops", disk, NULL, disk, "Disk Operations", "operations/s", 2001, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "reads", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "writes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "reads", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "writes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "reads", reads); - rrd_stats_dimension_set(st, "writes", writes); - rrd_stats_done(st); + rrddim_set(st, "reads", reads); + rrddim_set(st, "writes", writes); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_merged_ops) { - st = rrd_stats_find_bytype("disk_merged_ops", disk); + st = rrdset_find_bytype("disk_merged_ops", disk); if(!st) { - st = rrd_stats_create("disk_merged_ops", disk, NULL, disk, "Merged Disk Operations", "operations/s", 2010, update_every, CHART_TYPE_LINE); + st = rrdset_create("disk_merged_ops", disk, NULL, disk, "Merged Disk Operations", "operations/s", 2010, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "reads", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "writes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "reads", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "writes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "reads", reads_merged); - rrd_stats_dimension_set(st, "writes", writes_merged); - rrd_stats_done(st); + rrddim_set(st, "reads", reads_merged); + rrddim_set(st, "writes", writes_merged); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_iotime) { - st = rrd_stats_find_bytype("disk_iotime", disk); + st = rrdset_find_bytype("disk_iotime", disk); if(!st) { - st = rrd_stats_create("disk_iotime", disk, NULL, disk, "Disk I/O Time", "milliseconds/s", 2005, update_every, CHART_TYPE_LINE); + st = rrdset_create("disk_iotime", disk, NULL, disk, "Disk I/O Time", "milliseconds/s", 2005, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "reads", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "writes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "latency", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "weighted", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "reads", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "writes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "latency", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "weighted", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "reads", readms); - rrd_stats_dimension_set(st, "writes", writems); - rrd_stats_dimension_set(st, "latency", iosms); - rrd_stats_dimension_set(st, "weighted", wiosms); - rrd_stats_done(st); + rrddim_set(st, "reads", readms); + rrddim_set(st, "writes", writems); + rrddim_set(st, "latency", iosms); + rrddim_set(st, "weighted", wiosms); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_cur_ops) { - st = rrd_stats_find_bytype("disk_cur_ops", disk); + st = rrdset_find_bytype("disk_cur_ops", disk); if(!st) { - st = rrd_stats_create("disk_cur_ops", disk, NULL, disk, "Current Disk I/O operations", "operations", 2004, update_every, CHART_TYPE_LINE); + st = rrdset_create("disk_cur_ops", disk, NULL, disk, "Current Disk I/O operations", "operations", 2004, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "operations", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "operations", NULL, 1, 1, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "operations", currentios); - rrd_stats_done(st); + rrddim_set(st, "operations", currentios); + rrdset_done(st); } } diff --git a/src/proc_meminfo.c b/src/proc_meminfo.c index 004cb094..75c30144 100755 --- a/src/proc_meminfo.c +++ b/src/proc_meminfo.c @@ -98,7 +98,7 @@ int do_proc_meminfo(int update_every, unsigned long long dt) { else if(!DirectMap2M && strcmp(name, "DirectMap2M") == 0) DirectMap2M = value; } - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- @@ -106,22 +106,22 @@ int do_proc_meminfo(int update_every, unsigned long long dt) { unsigned long long MemUsed = MemTotal - MemFree - Cached - Buffers; if(do_ram) { - st = rrd_stats_find("system.ram"); + st = rrdset_find("system.ram"); if(!st) { - st = rrd_stats_create("system", "ram", NULL, "mem", "System RAM", "MB", 200, update_every, CHART_TYPE_STACKED); + st = rrdset_create("system", "ram", NULL, "mem", "System RAM", "MB", 200, update_every, RRDSET_TYPE_STACKED); - rrd_stats_dimension_add(st, "buffers", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "used", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "cached", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "free", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "buffers", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "used", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "cached", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "free", NULL, 1, 1024, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "used", MemUsed); - rrd_stats_dimension_set(st, "free", MemFree); - rrd_stats_dimension_set(st, "cached", Cached); - rrd_stats_dimension_set(st, "buffers", Buffers); - rrd_stats_done(st); + rrddim_set(st, "used", MemUsed); + rrddim_set(st, "free", MemFree); + rrddim_set(st, "cached", Cached); + rrddim_set(st, "buffers", Buffers); + rrdset_done(st); } // -------------------------------------------------------------------- @@ -129,115 +129,115 @@ int do_proc_meminfo(int update_every, unsigned long long dt) { unsigned long long SwapUsed = SwapTotal - SwapFree; if(do_swap) { - st = rrd_stats_find("system.swap"); + st = rrdset_find("system.swap"); if(!st) { - st = rrd_stats_create("system", "swap", NULL, "mem", "System Swap", "MB", 201, update_every, CHART_TYPE_STACKED); + st = rrdset_create("system", "swap", NULL, "mem", "System Swap", "MB", 201, update_every, RRDSET_TYPE_STACKED); st->isdetail = 1; - rrd_stats_dimension_add(st, "free", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "used", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "free", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "used", NULL, 1, 1024, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "used", SwapUsed); - rrd_stats_dimension_set(st, "free", SwapFree); - rrd_stats_done(st); + rrddim_set(st, "used", SwapUsed); + rrddim_set(st, "free", SwapFree); + rrdset_done(st); } // -------------------------------------------------------------------- if(hwcorrupted && do_hwcorrupt) { - st = rrd_stats_find("mem.hwcorrupt"); + st = rrdset_find("mem.hwcorrupt"); if(!st) { - st = rrd_stats_create("mem", "hwcorrupt", NULL, "mem", "Hardware Corrupted ECC", "MB", 9000, update_every, CHART_TYPE_LINE); + st = rrdset_create("mem", "hwcorrupt", NULL, "mem", "Hardware Corrupted ECC", "MB", 9000, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "HardwareCorrupted", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "HardwareCorrupted", NULL, 1, 1024, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "HardwareCorrupted", HardwareCorrupted); - rrd_stats_done(st); + rrddim_set(st, "HardwareCorrupted", HardwareCorrupted); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_committed) { - st = rrd_stats_find("mem.committed"); + st = rrdset_find("mem.committed"); if(!st) { - st = rrd_stats_create("mem", "committed", NULL, "mem", "Committed (Allocated) Memory", "MB", 5000, update_every, CHART_TYPE_AREA); + st = rrdset_create("mem", "committed", NULL, "mem", "Committed (Allocated) Memory", "MB", 5000, update_every, RRDSET_TYPE_AREA); st->isdetail = 1; - rrd_stats_dimension_add(st, "Committed_AS", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "Committed_AS", NULL, 1, 1024, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "Committed_AS", Committed_AS); - rrd_stats_done(st); + rrddim_set(st, "Committed_AS", Committed_AS); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_writeback) { - st = rrd_stats_find("mem.writeback"); + st = rrdset_find("mem.writeback"); if(!st) { - st = rrd_stats_create("mem", "writeback", NULL, "mem", "Writeback Memory", "MB", 4000, update_every, CHART_TYPE_LINE); + st = rrdset_create("mem", "writeback", NULL, "mem", "Writeback Memory", "MB", 4000, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "Dirty", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "Writeback", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "FuseWriteback", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "NfsWriteback", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "Bounce", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "Dirty", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "Writeback", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "FuseWriteback", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "NfsWriteback", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "Bounce", NULL, 1, 1024, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); - - rrd_stats_dimension_set(st, "Dirty", Dirty); - rrd_stats_dimension_set(st, "Writeback", Writeback); - rrd_stats_dimension_set(st, "FuseWriteback", WritebackTmp); - rrd_stats_dimension_set(st, "NfsWriteback", NFS_Unstable); - rrd_stats_dimension_set(st, "Bounce", Bounce); - rrd_stats_done(st); + else rrdset_next(st); + + rrddim_set(st, "Dirty", Dirty); + rrddim_set(st, "Writeback", Writeback); + rrddim_set(st, "FuseWriteback", WritebackTmp); + rrddim_set(st, "NfsWriteback", NFS_Unstable); + rrddim_set(st, "Bounce", Bounce); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_kernel) { - st = rrd_stats_find("mem.kernel"); + st = rrdset_find("mem.kernel"); if(!st) { - st = rrd_stats_create("mem", "kernel", NULL, "mem", "Memory Used by Kernel", "MB", 6000, update_every, CHART_TYPE_STACKED); + st = rrdset_create("mem", "kernel", NULL, "mem", "Memory Used by Kernel", "MB", 6000, update_every, RRDSET_TYPE_STACKED); st->isdetail = 1; - rrd_stats_dimension_add(st, "Slab", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "KernelStack", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "PageTables", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "VmallocUsed", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "Slab", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "KernelStack", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "PageTables", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "VmallocUsed", NULL, 1, 1024, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "KernelStack", KernelStack); - rrd_stats_dimension_set(st, "Slab", Slab); - rrd_stats_dimension_set(st, "PageTables", PageTables); - rrd_stats_dimension_set(st, "VmallocUsed", VmallocUsed); - rrd_stats_done(st); + rrddim_set(st, "KernelStack", KernelStack); + rrddim_set(st, "Slab", Slab); + rrddim_set(st, "PageTables", PageTables); + rrddim_set(st, "VmallocUsed", VmallocUsed); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_slab) { - st = rrd_stats_find("mem.slab"); + st = rrdset_find("mem.slab"); if(!st) { - st = rrd_stats_create("mem", "slab", NULL, "mem", "Reclaimable Kernel Memory", "MB", 6500, update_every, CHART_TYPE_STACKED); + st = rrdset_create("mem", "slab", NULL, "mem", "Reclaimable Kernel Memory", "MB", 6500, update_every, RRDSET_TYPE_STACKED); st->isdetail = 1; - rrd_stats_dimension_add(st, "reclaimable", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "unreclaimable", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "reclaimable", NULL, 1, 1024, RRDDIM_ABSOLUTE); + rrddim_add(st, "unreclaimable", NULL, 1, 1024, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "reclaimable", SReclaimable); - rrd_stats_dimension_set(st, "unreclaimable", SUnreclaim); - rrd_stats_done(st); + rrddim_set(st, "reclaimable", SReclaimable); + rrddim_set(st, "unreclaimable", SUnreclaim); + rrdset_done(st); } return 0; diff --git a/src/proc_net_dev.c b/src/proc_net_dev.c index 48d1eb80..92f3e008 100755 --- a/src/proc_net_dev.c +++ b/src/proc_net_dev.c @@ -67,135 +67,135 @@ int do_proc_net_dev(int update_every, unsigned long long dt) { if(!config_get_boolean("plugin:proc:/proc/net/dev", var_name, enable_new_interfaces)) continue; } - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- if(do_bandwidth) { - st = rrd_stats_find_bytype("net", iface); + st = rrdset_find_bytype("net", iface); if(!st) { - st = rrd_stats_create("net", iface, NULL, iface, "Bandwidth", "kilobits/s", 1000, update_every, CHART_TYPE_AREA); + st = rrdset_create("net", iface, NULL, iface, "Bandwidth", "kilobits/s", 1000, update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "received", rbytes); - rrd_stats_dimension_set(st, "sent", tbytes); - rrd_stats_done(st); + rrddim_set(st, "received", rbytes); + rrddim_set(st, "sent", tbytes); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_packets) { - st = rrd_stats_find_bytype("net_packets", iface); + st = rrdset_find_bytype("net_packets", iface); if(!st) { - st = rrd_stats_create("net_packets", iface, NULL, iface, "Packets", "packets/s", 1001, update_every, CHART_TYPE_LINE); + st = rrdset_create("net_packets", iface, NULL, iface, "Packets", "packets/s", 1001, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "multicast", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "multicast", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "received", rpackets); - rrd_stats_dimension_set(st, "sent", tpackets); - rrd_stats_dimension_set(st, "multicast", rmulticast); - rrd_stats_done(st); + rrddim_set(st, "received", rpackets); + rrddim_set(st, "sent", tpackets); + rrddim_set(st, "multicast", rmulticast); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_errors) { - st = rrd_stats_find_bytype("net_errors", iface); + st = rrdset_find_bytype("net_errors", iface); if(!st) { - st = rrd_stats_create("net_errors", iface, NULL, iface, "Interface Errors", "errors/s", 1002, update_every, CHART_TYPE_LINE); + st = rrdset_create("net_errors", iface, NULL, iface, "Interface Errors", "errors/s", 1002, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "inbound", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "outbound", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "inbound", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "outbound", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "inbound", rerrors); - rrd_stats_dimension_set(st, "outbound", terrors); - rrd_stats_done(st); + rrddim_set(st, "inbound", rerrors); + rrddim_set(st, "outbound", terrors); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_drops) { - st = rrd_stats_find_bytype("net_drops", iface); + st = rrdset_find_bytype("net_drops", iface); if(!st) { - st = rrd_stats_create("net_drops", iface, NULL, iface, "Interface Drops", "drops/s", 1003, update_every, CHART_TYPE_LINE); + st = rrdset_create("net_drops", iface, NULL, iface, "Interface Drops", "drops/s", 1003, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "inbound", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "outbound", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "inbound", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "outbound", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "inbound", rdrops); - rrd_stats_dimension_set(st, "outbound", tdrops); - rrd_stats_done(st); + rrddim_set(st, "inbound", rdrops); + rrddim_set(st, "outbound", tdrops); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_fifo) { - st = rrd_stats_find_bytype("net_fifo", iface); + st = rrdset_find_bytype("net_fifo", iface); if(!st) { - st = rrd_stats_create("net_fifo", iface, NULL, iface, "Interface Queue", "packets", 1100, update_every, CHART_TYPE_LINE); + st = rrdset_create("net_fifo", iface, NULL, iface, "Interface Queue", "packets", 1100, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "receive", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "transmit", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "receive", NULL, 1, 1, RRDDIM_ABSOLUTE); + rrddim_add(st, "transmit", NULL, -1, 1, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "receive", rfifo); - rrd_stats_dimension_set(st, "transmit", tfifo); - rrd_stats_done(st); + rrddim_set(st, "receive", rfifo); + rrddim_set(st, "transmit", tfifo); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_compressed) { - st = rrd_stats_find_bytype("net_compressed", iface); + st = rrdset_find_bytype("net_compressed", iface); if(!st) { - st = rrd_stats_create("net_compressed", iface, NULL, iface, "Compressed Packets", "packets/s", 1200, update_every, CHART_TYPE_LINE); + st = rrdset_create("net_compressed", iface, NULL, iface, "Compressed Packets", "packets/s", 1200, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "received", rcompressed); - rrd_stats_dimension_set(st, "sent", tcompressed); - rrd_stats_done(st); + rrddim_set(st, "received", rcompressed); + rrddim_set(st, "sent", tcompressed); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_events) { - st = rrd_stats_find_bytype("net_events", iface); + st = rrdset_find_bytype("net_events", iface); if(!st) { - st = rrd_stats_create("net_events", iface, NULL, iface, "Network Interface Events", "events/s", 1200, update_every, CHART_TYPE_LINE); + st = rrdset_create("net_events", iface, NULL, iface, "Network Interface Events", "events/s", 1200, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "frames", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "collisions", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "carrier", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "frames", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "collisions", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "carrier", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "frames", rframe); - rrd_stats_dimension_set(st, "collisions", tcollisions); - rrd_stats_dimension_set(st, "carrier", tcarrier); - rrd_stats_done(st); + rrddim_set(st, "frames", rframe); + rrddim_set(st, "collisions", tcollisions); + rrddim_set(st, "carrier", tcarrier); + rrdset_done(st); } } diff --git a/src/proc_net_ip_vs_stats.c b/src/proc_net_ip_vs_stats.c index d6b44911..d24b1df5 100755 --- a/src/proc_net_ip_vs_stats.c +++ b/src/proc_net_ip_vs_stats.c @@ -40,55 +40,55 @@ int do_proc_net_ip_vs_stats(int update_every, unsigned long long dt) { InBytes = strtoull(procfile_lineword(ff, 2, 3), NULL, 16); OutBytes = strtoull(procfile_lineword(ff, 2, 4), NULL, 16); - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- if(do_sockets) { - st = rrd_stats_find(RRD_TYPE_NET_IPVS ".sockets"); + st = rrdset_find(RRD_TYPE_NET_IPVS ".sockets"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_IPVS, "sockets", NULL, RRD_TYPE_NET_IPVS, "IPVS New Connections", "connections/s", 1001, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_IPVS, "sockets", NULL, RRD_TYPE_NET_IPVS, "IPVS New Connections", "connections/s", 1001, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "connections", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "connections", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "connections", entries); - rrd_stats_done(st); + rrddim_set(st, "connections", entries); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_packets) { - st = rrd_stats_find(RRD_TYPE_NET_IPVS ".packets"); + st = rrdset_find(RRD_TYPE_NET_IPVS ".packets"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_IPVS, "packets", NULL, RRD_TYPE_NET_IPVS, "IPVS Packets", "packets/s", 1002, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_IPVS, "packets", NULL, RRD_TYPE_NET_IPVS, "IPVS Packets", "packets/s", 1002, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "received", InPackets); - rrd_stats_dimension_set(st, "sent", OutPackets); - rrd_stats_done(st); + rrddim_set(st, "received", InPackets); + rrddim_set(st, "sent", OutPackets); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_bandwidth) { - st = rrd_stats_find(RRD_TYPE_NET_IPVS ".net"); + st = rrdset_find(RRD_TYPE_NET_IPVS ".net"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_IPVS, "net", NULL, RRD_TYPE_NET_IPVS, "IPVS Bandwidth", "kilobits/s", 1000, update_every, CHART_TYPE_AREA); + st = rrdset_create(RRD_TYPE_NET_IPVS, "net", NULL, RRD_TYPE_NET_IPVS, "IPVS Bandwidth", "kilobits/s", 1000, update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "received", InBytes); - rrd_stats_dimension_set(st, "sent", OutBytes); - rrd_stats_done(st); + rrddim_set(st, "received", InBytes); + rrddim_set(st, "sent", OutBytes); + rrdset_done(st); } return 0; diff --git a/src/proc_net_netstat.c b/src/proc_net_netstat.c index e910cf60..7615871f 100755 --- a/src/proc_net_netstat.c +++ b/src/proc_net_netstat.c @@ -63,113 +63,113 @@ int do_proc_net_netstat(int update_every, unsigned long long dt) { InBcastOctets = strtoull(procfile_lineword(ff, l, 11), NULL, 10); OutBcastOctets = strtoull(procfile_lineword(ff, l, 12), NULL, 10); - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- if(do_bandwidth) { - st = rrd_stats_find("system.ipv4"); + st = rrdset_find("system.ipv4"); if(!st) { - st = rrd_stats_create("system", "ipv4", NULL, "ipv4", "IPv4 Bandwidth", "kilobits/s", 2000, update_every, CHART_TYPE_AREA); + st = rrdset_create("system", "ipv4", NULL, "ipv4", "IPv4 Bandwidth", "kilobits/s", 2000, update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "sent", OutOctets); - rrd_stats_dimension_set(st, "received", InOctets); - rrd_stats_done(st); + rrddim_set(st, "sent", OutOctets); + rrddim_set(st, "received", InOctets); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_inerrors) { - st = rrd_stats_find("ipv4.inerrors"); + st = rrdset_find("ipv4.inerrors"); if(!st) { - st = rrd_stats_create("ipv4", "inerrors", NULL, "ipv4", "IPv4 Input Errors", "packets/s", 4000, update_every, CHART_TYPE_LINE); + st = rrdset_create("ipv4", "inerrors", NULL, "ipv4", "IPv4 Input Errors", "packets/s", 4000, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "noroutes", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "trunkated", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "noroutes", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "trunkated", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "noroutes", InNoRoutes); - rrd_stats_dimension_set(st, "trunkated", InTruncatedPkts); - rrd_stats_done(st); + rrddim_set(st, "noroutes", InNoRoutes); + rrddim_set(st, "trunkated", InTruncatedPkts); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_mcast) { - st = rrd_stats_find("ipv4.mcast"); + st = rrdset_find("ipv4.mcast"); if(!st) { - st = rrd_stats_create("ipv4", "mcast", NULL, "ipv4", "IPv4 Multicast Bandwidth", "kilobits/s", 9000, update_every, CHART_TYPE_AREA); + st = rrdset_create("ipv4", "mcast", NULL, "ipv4", "IPv4 Multicast Bandwidth", "kilobits/s", 9000, update_every, RRDSET_TYPE_AREA); st->isdetail = 1; - rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "sent", OutMcastOctets); - rrd_stats_dimension_set(st, "received", InMcastOctets); - rrd_stats_done(st); + rrddim_set(st, "sent", OutMcastOctets); + rrddim_set(st, "received", InMcastOctets); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_bcast) { - st = rrd_stats_find("ipv4.bcast"); + st = rrdset_find("ipv4.bcast"); if(!st) { - st = rrd_stats_create("ipv4", "bcast", NULL, "ipv4", "IPv4 Broadcast Bandwidth", "kilobits/s", 8000, update_every, CHART_TYPE_AREA); + st = rrdset_create("ipv4", "bcast", NULL, "ipv4", "IPv4 Broadcast Bandwidth", "kilobits/s", 8000, update_every, RRDSET_TYPE_AREA); st->isdetail = 1; - rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "sent", OutBcastOctets); - rrd_stats_dimension_set(st, "received", InBcastOctets); - rrd_stats_done(st); + rrddim_set(st, "sent", OutBcastOctets); + rrddim_set(st, "received", InBcastOctets); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_mcast_p) { - st = rrd_stats_find("ipv4.mcastpkts"); + st = rrdset_find("ipv4.mcastpkts"); if(!st) { - st = rrd_stats_create("ipv4", "mcastpkts", NULL, "ipv4", "IPv4 Multicast Packets", "packets/s", 9500, update_every, CHART_TYPE_LINE); + st = rrdset_create("ipv4", "mcastpkts", NULL, "ipv4", "IPv4 Multicast Packets", "packets/s", 9500, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "sent", OutMcastPkts); - rrd_stats_dimension_set(st, "received", InMcastPkts); - rrd_stats_done(st); + rrddim_set(st, "sent", OutMcastPkts); + rrddim_set(st, "received", InMcastPkts); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_bcast_p) { - st = rrd_stats_find("ipv4.bcastpkts"); + st = rrdset_find("ipv4.bcastpkts"); if(!st) { - st = rrd_stats_create("ipv4", "bcastpkts", NULL, "ipv4", "IPv4 Broadcast Packets", "packets/s", 8500, update_every, CHART_TYPE_LINE); + st = rrdset_create("ipv4", "bcastpkts", NULL, "ipv4", "IPv4 Broadcast Packets", "packets/s", 8500, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "sent", OutBcastPkts); - rrd_stats_dimension_set(st, "received", InBcastPkts); - rrd_stats_done(st); + rrddim_set(st, "sent", OutBcastPkts); + rrddim_set(st, "received", InBcastPkts); + rrdset_done(st); } } } diff --git a/src/proc_net_rpc_nfsd.c b/src/proc_net_rpc_nfsd.c index 6e527e1e..634558d6 100644 --- a/src/proc_net_rpc_nfsd.c +++ b/src/proc_net_rpc_nfsd.c @@ -406,280 +406,280 @@ int do_proc_net_rpc_nfsd(int update_every, unsigned long long dt) { } } - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- if(do_rc == 2) { - st = rrd_stats_find_bytype("nfsd", "readcache"); + st = rrdset_find_bytype("nfsd", "readcache"); if(!st) { - st = rrd_stats_create("nfsd", "readcache", NULL, "nfsd", "Read Cache", "reads/s", 5000, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfsd", "readcache", NULL, "nfsd", "Read Cache", "reads/s", 5000, update_every, RRDSET_TYPE_STACKED); - rrd_stats_dimension_add(st, "hits", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "misses", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "nocache", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "hits", NULL, 1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "misses", NULL, 1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "nocache", NULL, 1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "hits", rc_hits); - rrd_stats_dimension_set(st, "misses", rc_misses); - rrd_stats_dimension_set(st, "nocache", rc_nocache); - rrd_stats_done(st); + rrddim_set(st, "hits", rc_hits); + rrddim_set(st, "misses", rc_misses); + rrddim_set(st, "nocache", rc_nocache); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_fh == 2) { - st = rrd_stats_find_bytype("nfsd", "filehandles"); + st = rrdset_find_bytype("nfsd", "filehandles"); if(!st) { - st = rrd_stats_create("nfsd", "filehandles", NULL, "nfsd", "File Handles", "handles/s", 5001, update_every, CHART_TYPE_LINE); + st = rrdset_create("nfsd", "filehandles", NULL, "nfsd", "File Handles", "handles/s", 5001, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "stale", NULL, 1, update_every, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "total_lookups", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "anonymous_lookups", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "dir_not_in_dcache", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "non_dir_not_in_dcache", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "stale", NULL, 1, update_every, RRDDIM_ABSOLUTE); + rrddim_add(st, "total_lookups", NULL, 1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "anonymous_lookups", NULL, 1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "dir_not_in_dcache", NULL, -1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "non_dir_not_in_dcache", NULL, -1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); - - rrd_stats_dimension_set(st, "stale", fh_stale); - rrd_stats_dimension_set(st, "total_lookups", fh_total_lookups); - rrd_stats_dimension_set(st, "anonymous_lookups", fh_anonymous_lookups); - rrd_stats_dimension_set(st, "dir_not_in_dcache", fh_dir_not_in_dcache); - rrd_stats_dimension_set(st, "non_dir_not_in_dcache", fh_non_dir_not_in_dcache); - rrd_stats_done(st); + else rrdset_next(st); + + rrddim_set(st, "stale", fh_stale); + rrddim_set(st, "total_lookups", fh_total_lookups); + rrddim_set(st, "anonymous_lookups", fh_anonymous_lookups); + rrddim_set(st, "dir_not_in_dcache", fh_dir_not_in_dcache); + rrddim_set(st, "non_dir_not_in_dcache", fh_non_dir_not_in_dcache); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_io == 2) { - st = rrd_stats_find_bytype("nfsd", "io"); + st = rrdset_find_bytype("nfsd", "io"); if(!st) { - st = rrd_stats_create("nfsd", "io", NULL, "nfsd", "I/O", "kilobytes/s", 5002, update_every, CHART_TYPE_AREA); + st = rrdset_create("nfsd", "io", NULL, "nfsd", "I/O", "kilobytes/s", 5002, update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(st, "read", NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "write", NULL, -1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "read", NULL, 1, 1000 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "write", NULL, -1, 1000 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "read", io_read); - rrd_stats_dimension_set(st, "write", io_write); - rrd_stats_done(st); + rrddim_set(st, "read", io_read); + rrddim_set(st, "write", io_write); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_th == 2) { - st = rrd_stats_find_bytype("nfsd", "threads"); + st = rrdset_find_bytype("nfsd", "threads"); if(!st) { - st = rrd_stats_create("nfsd", "threads", NULL, "nfsd", "Threads", "threads", 5003, update_every, CHART_TYPE_LINE); + st = rrdset_create("nfsd", "threads", NULL, "nfsd", "Threads", "threads", 5003, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "threads", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "threads", NULL, 1, 1, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "threads", th_threads); - rrd_stats_done(st); + rrddim_set(st, "threads", th_threads); + rrdset_done(st); - st = rrd_stats_find_bytype("nfsd", "threads_fullcnt"); + st = rrdset_find_bytype("nfsd", "threads_fullcnt"); if(!st) { - st = rrd_stats_create("nfsd", "threads_fullcnt", NULL, "nfsd", "Threads Full Count", "ops/s", 5004, update_every, CHART_TYPE_LINE); + st = rrdset_create("nfsd", "threads_fullcnt", NULL, "nfsd", "Threads Full Count", "ops/s", 5004, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "full_count", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "full_count", NULL, 1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "full_count", th_fullcnt); - rrd_stats_done(st); + rrddim_set(st, "full_count", th_fullcnt); + rrdset_done(st); - st = rrd_stats_find_bytype("nfsd", "threads_histogram"); + st = rrdset_find_bytype("nfsd", "threads_histogram"); if(!st) { - st = rrd_stats_create("nfsd", "threads_histogram", NULL, "nfsd", "Threads Usage Histogram", "percentage", 5005, update_every, CHART_TYPE_LINE); - - rrd_stats_dimension_add(st, "0%-10%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "10%-20%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "20%-30%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "30%-40%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "40%-50%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "50%-60%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "60%-70%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "70%-80%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "80%-90%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "90%-100%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE); + st = rrdset_create("nfsd", "threads_histogram", NULL, "nfsd", "Threads Usage Histogram", "percentage", 5005, update_every, RRDSET_TYPE_LINE); + + rrddim_add(st, "0%-10%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "10%-20%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "20%-30%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "30%-40%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "40%-50%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "50%-60%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "60%-70%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "70%-80%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "80%-90%", NULL, 1, 1000, RRDDIM_ABSOLUTE); + rrddim_add(st, "90%-100%", NULL, 1, 1000, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); - - rrd_stats_dimension_set(st, "0%-10%", th_hist10); - rrd_stats_dimension_set(st, "10%-20%", th_hist20); - rrd_stats_dimension_set(st, "20%-30%", th_hist30); - rrd_stats_dimension_set(st, "30%-40%", th_hist40); - rrd_stats_dimension_set(st, "40%-50%", th_hist50); - rrd_stats_dimension_set(st, "50%-60%", th_hist60); - rrd_stats_dimension_set(st, "60%-70%", th_hist70); - rrd_stats_dimension_set(st, "70%-80%", th_hist80); - rrd_stats_dimension_set(st, "80%-90%", th_hist90); - rrd_stats_dimension_set(st, "90%-100%", th_hist100); - rrd_stats_done(st); + else rrdset_next(st); + + rrddim_set(st, "0%-10%", th_hist10); + rrddim_set(st, "10%-20%", th_hist20); + rrddim_set(st, "20%-30%", th_hist30); + rrddim_set(st, "30%-40%", th_hist40); + rrddim_set(st, "40%-50%", th_hist50); + rrddim_set(st, "50%-60%", th_hist60); + rrddim_set(st, "60%-70%", th_hist70); + rrddim_set(st, "70%-80%", th_hist80); + rrddim_set(st, "80%-90%", th_hist90); + rrddim_set(st, "90%-100%", th_hist100); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_ra == 2) { - st = rrd_stats_find_bytype("nfsd", "readahead"); + st = rrdset_find_bytype("nfsd", "readahead"); if(!st) { - st = rrd_stats_create("nfsd", "readahead", NULL, "nfsd", "Read Ahead Depth", "percentage", 5005, update_every, CHART_TYPE_STACKED); - - rrd_stats_dimension_add(st, "10%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "20%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "30%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "40%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "50%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "60%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "70%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "80%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "90%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "100%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "misses", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); + st = rrdset_create("nfsd", "readahead", NULL, "nfsd", "Read Ahead Depth", "percentage", 5005, update_every, RRDSET_TYPE_STACKED); + + rrddim_add(st, "10%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "20%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "30%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "40%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "50%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "60%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "70%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "80%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "90%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "100%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "misses", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL); } - else rrd_stats_next(st); + else rrdset_next(st); // ignore ra_size if(ra_size) {}; - rrd_stats_dimension_set(st, "10%", ra_hist10); - rrd_stats_dimension_set(st, "20%", ra_hist20); - rrd_stats_dimension_set(st, "30%", ra_hist30); - rrd_stats_dimension_set(st, "40%", ra_hist40); - rrd_stats_dimension_set(st, "50%", ra_hist50); - rrd_stats_dimension_set(st, "60%", ra_hist60); - rrd_stats_dimension_set(st, "70%", ra_hist70); - rrd_stats_dimension_set(st, "80%", ra_hist80); - rrd_stats_dimension_set(st, "90%", ra_hist90); - rrd_stats_dimension_set(st, "100%", ra_hist100); - rrd_stats_dimension_set(st, "misses", ra_none); - rrd_stats_done(st); + rrddim_set(st, "10%", ra_hist10); + rrddim_set(st, "20%", ra_hist20); + rrddim_set(st, "30%", ra_hist30); + rrddim_set(st, "40%", ra_hist40); + rrddim_set(st, "50%", ra_hist50); + rrddim_set(st, "60%", ra_hist60); + rrddim_set(st, "70%", ra_hist70); + rrddim_set(st, "80%", ra_hist80); + rrddim_set(st, "90%", ra_hist90); + rrddim_set(st, "100%", ra_hist100); + rrddim_set(st, "misses", ra_none); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_net == 2) { - st = rrd_stats_find_bytype("nfsd", "net"); + st = rrdset_find_bytype("nfsd", "net"); if(!st) { - st = rrd_stats_create("nfsd", "net", NULL, "nfsd", "Network Reads", "reads/s", 5007, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfsd", "net", NULL, "nfsd", "Network Reads", "reads/s", 5007, update_every, RRDSET_TYPE_STACKED); st->isdetail = 1; - rrd_stats_dimension_add(st, "udp", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "tcp", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "udp", NULL, 1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "tcp", NULL, 1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); // ignore net_count, net_tcp_connections if(net_count) {}; if(net_tcp_connections) {}; - rrd_stats_dimension_set(st, "udp", net_udp_count); - rrd_stats_dimension_set(st, "tcp", net_tcp_count); - rrd_stats_done(st); + rrddim_set(st, "udp", net_udp_count); + rrddim_set(st, "tcp", net_tcp_count); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_rpc == 2) { - st = rrd_stats_find_bytype("nfsd", "rpc"); + st = rrdset_find_bytype("nfsd", "rpc"); if(!st) { - st = rrd_stats_create("nfsd", "rpc", NULL, "nfsd", "Remote Procedure Calls", "calls/s", 5008, update_every, CHART_TYPE_LINE); + st = rrdset_create("nfsd", "rpc", NULL, "nfsd", "Remote Procedure Calls", "calls/s", 5008, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "all", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "bad_format", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "bad_auth", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "all", NULL, 1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "bad_format", NULL, -1, update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "bad_auth", NULL, -1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); // ignore rpc_bad_client if(rpc_bad_client) {}; - rrd_stats_dimension_set(st, "all", rpc_count); - rrd_stats_dimension_set(st, "bad_format", rpc_bad_format); - rrd_stats_dimension_set(st, "bad_auth", rpc_bad_auth); - rrd_stats_done(st); + rrddim_set(st, "all", rpc_count); + rrddim_set(st, "bad_format", rpc_bad_format); + rrddim_set(st, "bad_auth", rpc_bad_auth); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_proc2 == 2) { unsigned int i; - st = rrd_stats_find_bytype("nfsd", "proc2"); + st = rrdset_find_bytype("nfsd", "proc2"); if(!st) { - st = rrd_stats_create("nfsd", "proc2", NULL, "nfsd", "NFS v2 Calls", "calls/s", 5009, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfsd", "proc2", NULL, "nfsd", "NFS v2 Calls", "calls/s", 5009, update_every, RRDSET_TYPE_STACKED); for(i = 0; nfsd_proc_values[i].present2 ; i++) - rrd_stats_dimension_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); for(i = 0; nfsd_proc_values[i].present2 ; i++) - rrd_stats_dimension_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc2); + rrddim_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc2); - rrd_stats_done(st); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_proc3 == 2) { unsigned int i; - st = rrd_stats_find_bytype("nfsd", "proc3"); + st = rrdset_find_bytype("nfsd", "proc3"); if(!st) { - st = rrd_stats_create("nfsd", "proc3", NULL, "nfsd", "NFS v3 Calls", "calls/s", 5010, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfsd", "proc3", NULL, "nfsd", "NFS v3 Calls", "calls/s", 5010, update_every, RRDSET_TYPE_STACKED); for(i = 0; nfsd_proc_values[i].present3 ; i++) - rrd_stats_dimension_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); for(i = 0; nfsd_proc_values[i].present3 ; i++) - rrd_stats_dimension_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc3); + rrddim_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc3); - rrd_stats_done(st); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_proc4 == 2) { unsigned int i; - st = rrd_stats_find_bytype("nfsd", "proc4"); + st = rrdset_find_bytype("nfsd", "proc4"); if(!st) { - st = rrd_stats_create("nfsd", "proc4", NULL, "nfsd", "NFS v4 Calls", "calls/s", 5011, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfsd", "proc4", NULL, "nfsd", "NFS v4 Calls", "calls/s", 5011, update_every, RRDSET_TYPE_STACKED); for(i = 0; nfsd_proc_values[i].present4 ; i++) - rrd_stats_dimension_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); for(i = 0; nfsd_proc_values[i].present4 ; i++) - rrd_stats_dimension_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc4); + rrddim_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc4); - rrd_stats_done(st); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_proc4ops == 2) { unsigned int i; - st = rrd_stats_find_bytype("nfsd", "proc4ops"); + st = rrdset_find_bytype("nfsd", "proc4ops"); if(!st) { - st = rrd_stats_create("nfsd", "proc4ops", NULL, "nfsd", "NFS v4 Operations", "operations/s", 5012, update_every, CHART_TYPE_STACKED); + st = rrdset_create("nfsd", "proc4ops", NULL, "nfsd", "NFS v4 Operations", "operations/s", 5012, update_every, RRDSET_TYPE_STACKED); for(i = 0; nfsd4_ops_values[i].present ; i++) - rrd_stats_dimension_add(st, nfsd4_ops_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, nfsd4_ops_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); for(i = 0; nfsd4_ops_values[i].present ; i++) - rrd_stats_dimension_set(st, nfsd4_ops_values[i].name, nfsd4_ops_values[i].value); + rrddim_set(st, nfsd4_ops_values[i].name, nfsd4_ops_values[i].value); - rrd_stats_done(st); + rrdset_done(st); } return 0; diff --git a/src/proc_net_snmp.c b/src/proc_net_snmp.c index ea88d7ea..101b0582 100755 --- a/src/proc_net_snmp.c +++ b/src/proc_net_snmp.c @@ -40,7 +40,7 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) { uint32_t lines = procfile_lines(ff), l; uint32_t words; - RRD_STATS *st; + RRDSET *st; for(l = 0; l < lines ;l++) { if(strcmp(procfile_lineword(ff, l, 0), "Ip") == 0) { @@ -92,88 +92,88 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) { // -------------------------------------------------------------------- if(do_ip_packets) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".packets"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".packets"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "packets", NULL, RRD_TYPE_NET_SNMP, "IPv4 Packets", "packets/s", 3000, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "packets", NULL, RRD_TYPE_NET_SNMP, "IPv4 Packets", "packets/s", 3000, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "forwarded", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "forwarded", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "sent", OutRequests); - rrd_stats_dimension_set(st, "received", InReceives); - rrd_stats_dimension_set(st, "forwarded", ForwDatagrams); - rrd_stats_done(st); + rrddim_set(st, "sent", OutRequests); + rrddim_set(st, "received", InReceives); + rrddim_set(st, "forwarded", ForwDatagrams); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_ip_fragsout) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".fragsout"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsout"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Sent", "packets/s", 3010, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Sent", "packets/s", 3010, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "ok", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "failed", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "all", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "ok", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "all", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "ok", FragOKs); - rrd_stats_dimension_set(st, "failed", FragFails); - rrd_stats_dimension_set(st, "all", FragCreates); - rrd_stats_done(st); + rrddim_set(st, "ok", FragOKs); + rrddim_set(st, "failed", FragFails); + rrddim_set(st, "all", FragCreates); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_ip_fragsin) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".fragsin"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsin"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "ok", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "failed", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "all", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "ok", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "all", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "ok", ReasmOKs); - rrd_stats_dimension_set(st, "failed", ReasmFails); - rrd_stats_dimension_set(st, "all", ReasmReqds); - rrd_stats_done(st); + rrddim_set(st, "ok", ReasmOKs); + rrddim_set(st, "failed", ReasmFails); + rrddim_set(st, "all", ReasmReqds); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_ip_errors) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".errors"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".errors"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "errors", NULL, RRD_TYPE_NET_SNMP, "IPv4 Errors", "packets/s", 3002, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "errors", NULL, RRD_TYPE_NET_SNMP, "IPv4 Errors", "packets/s", 3002, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "InDiscards", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "OutDiscards", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "InDiscards", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "OutDiscards", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); - rrd_stats_dimension_add(st, "InHdrErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "InAddrErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "InUnknownProtos", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "InHdrErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "InAddrErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "InUnknownProtos", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); - rrd_stats_dimension_add(st, "OutNoRoutes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "OutNoRoutes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); - - rrd_stats_dimension_set(st, "InDiscards", InDiscards); - rrd_stats_dimension_set(st, "OutDiscards", OutDiscards); - rrd_stats_dimension_set(st, "InHdrErrors", InHdrErrors); - rrd_stats_dimension_set(st, "InAddrErrors", InAddrErrors); - rrd_stats_dimension_set(st, "InUnknownProtos", InUnknownProtos); - rrd_stats_dimension_set(st, "OutNoRoutes", OutNoRoutes); - rrd_stats_done(st); + else rrdset_next(st); + + rrddim_set(st, "InDiscards", InDiscards); + rrddim_set(st, "OutDiscards", OutDiscards); + rrddim_set(st, "InHdrErrors", InHdrErrors); + rrddim_set(st, "InAddrErrors", InAddrErrors); + rrddim_set(st, "InUnknownProtos", InUnknownProtos); + rrddim_set(st, "OutNoRoutes", OutNoRoutes); + rrdset_done(st); } } else if(strcmp(procfile_lineword(ff, l, 0), "Tcp") == 0) { @@ -218,75 +218,75 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) { // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html if(do_tcp_sockets) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcpsock"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".tcpsock"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", "IPv4 TCP Connections", "active connections", 2500, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", "IPv4 TCP Connections", "active connections", 2500, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "connections", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "connections", CurrEstab); - rrd_stats_done(st); + rrddim_set(st, "connections", CurrEstab); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_tcp_packets) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcppackets"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".tcppackets"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", "IPv4 TCP Packets", "packets/s", 2600, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", "IPv4 TCP Packets", "packets/s", 2600, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "received", InSegs); - rrd_stats_dimension_set(st, "sent", OutSegs); - rrd_stats_done(st); + rrddim_set(st, "received", InSegs); + rrddim_set(st, "sent", OutSegs); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_tcp_errors) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcperrors"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".tcperrors"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", "IPv4 TCP Errors", "packets/s", 2700, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", "IPv4 TCP Errors", "packets/s", 2700, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "InErrs", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "RetransSegs", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "InErrs", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "RetransSegs", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "InErrs", InErrs); - rrd_stats_dimension_set(st, "RetransSegs", RetransSegs); - rrd_stats_done(st); + rrddim_set(st, "InErrs", InErrs); + rrddim_set(st, "RetransSegs", RetransSegs); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_tcp_handshake) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcphandshake"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".tcphandshake"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "EstabResets", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "OutRsts", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "ActiveOpens", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "PassiveOpens", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "AttemptFails", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "EstabResets", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "OutRsts", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "ActiveOpens", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "PassiveOpens", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "AttemptFails", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); - - rrd_stats_dimension_set(st, "EstabResets", EstabResets); - rrd_stats_dimension_set(st, "OutRsts", OutRsts); - rrd_stats_dimension_set(st, "ActiveOpens", ActiveOpens); - rrd_stats_dimension_set(st, "PassiveOpens", PassiveOpens); - rrd_stats_dimension_set(st, "AttemptFails", AttemptFails); - rrd_stats_done(st); + else rrdset_next(st); + + rrddim_set(st, "EstabResets", EstabResets); + rrddim_set(st, "OutRsts", OutRsts); + rrddim_set(st, "ActiveOpens", ActiveOpens); + rrddim_set(st, "PassiveOpens", PassiveOpens); + rrddim_set(st, "AttemptFails", AttemptFails); + rrdset_done(st); } } else if(strcmp(procfile_lineword(ff, l, 0), "Udp") == 0) { @@ -316,40 +316,40 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) { // see http://net-snmp.sourceforge.net/docs/mibs/udp.html if(do_udp_packets) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".udppackets"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".udppackets"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", "IPv4 UDP Packets", "packets/s", 2601, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", "IPv4 UDP Packets", "packets/s", 2601, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "received", InDatagrams); - rrd_stats_dimension_set(st, "sent", OutDatagrams); - rrd_stats_done(st); + rrddim_set(st, "received", InDatagrams); + rrddim_set(st, "sent", OutDatagrams); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_udp_errors) { - st = rrd_stats_find(RRD_TYPE_NET_SNMP ".udperrors"); + st = rrdset_find(RRD_TYPE_NET_SNMP ".udperrors"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", "IPv4 UDP Errors", "events/s", 2701, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", "IPv4 UDP Errors", "events/s", 2701, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "RcvbufErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "SndbufErrors", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "InErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "NoPorts", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "RcvbufErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "SndbufErrors", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "InErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "NoPorts", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "InErrors", InErrors); - rrd_stats_dimension_set(st, "NoPorts", NoPorts); - rrd_stats_dimension_set(st, "RcvbufErrors", RcvbufErrors); - rrd_stats_dimension_set(st, "SndbufErrors", SndbufErrors); - rrd_stats_done(st); + rrddim_set(st, "InErrors", InErrors); + rrddim_set(st, "NoPorts", NoPorts); + rrddim_set(st, "RcvbufErrors", RcvbufErrors); + rrddim_set(st, "SndbufErrors", SndbufErrors); + rrdset_done(st); } } } diff --git a/src/proc_net_stat_conntrack.c b/src/proc_net_stat_conntrack.c index 7ccc86b1..e70feef0 100755 --- a/src/proc_net_stat_conntrack.c +++ b/src/proc_net_stat_conntrack.c @@ -85,122 +85,122 @@ int do_proc_net_stat_conntrack(int update_every, unsigned long long dt) { asearch_restart += tsearch_restart; // conntrack.search } - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- if(do_sockets) { - st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".sockets"); + st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".sockets"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "sockets", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connections", "active connections", 1000, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "sockets", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connections", "active connections", 1000, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "connections", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "connections", aentries); - rrd_stats_done(st); + rrddim_set(st, "connections", aentries); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_new) { - st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".new"); + st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".new"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "new", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter New Connections", "connections/s", 1001, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "new", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter New Connections", "connections/s", 1001, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "new", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "ignore", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "invalid", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "new", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "ignore", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "invalid", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "new", anew); - rrd_stats_dimension_set(st, "ignore", aignore); - rrd_stats_dimension_set(st, "invalid", ainvalid); - rrd_stats_done(st); + rrddim_set(st, "new", anew); + rrddim_set(st, "ignore", aignore); + rrddim_set(st, "invalid", ainvalid); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_changes) { - st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".changes"); + st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".changes"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "changes", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Changes", "changes/s", 1002, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "changes", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Changes", "changes/s", 1002, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "inserted", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "deleted", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "delete_list", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "inserted", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "deleted", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "delete_list", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "inserted", ainsert); - rrd_stats_dimension_set(st, "deleted", adelete); - rrd_stats_dimension_set(st, "delete_list", adelete_list); - rrd_stats_done(st); + rrddim_set(st, "inserted", ainsert); + rrddim_set(st, "deleted", adelete); + rrddim_set(st, "delete_list", adelete_list); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_expect) { - st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".expect"); + st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".expect"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "expect", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Expectations", "expectations/s", 1003, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "expect", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Expectations", "expectations/s", 1003, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "created", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "deleted", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "new", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "created", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "deleted", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "new", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "created", aexpect_create); - rrd_stats_dimension_set(st, "deleted", aexpect_delete); - rrd_stats_dimension_set(st, "new", aexpect_new); - rrd_stats_done(st); + rrddim_set(st, "created", aexpect_create); + rrddim_set(st, "deleted", aexpect_delete); + rrddim_set(st, "new", aexpect_new); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_search) { - st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".search"); + st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".search"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "search", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Searches", "searches/s", 1010, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "search", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Searches", "searches/s", 1010, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "searched", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "restarted", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "found", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "searched", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "restarted", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "found", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "searched", asearched); - rrd_stats_dimension_set(st, "restarted", asearch_restart); - rrd_stats_dimension_set(st, "found", afound); - rrd_stats_done(st); + rrddim_set(st, "searched", asearched); + rrddim_set(st, "restarted", asearch_restart); + rrddim_set(st, "found", afound); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_errors) { - st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".errors"); + st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".errors"); if(!st) { - st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "errors", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Errors", "events/s", 1005, update_every, CHART_TYPE_LINE); + st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "errors", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Errors", "events/s", 1005, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "icmp_error", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "insert_failed", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "drop", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "early_drop", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "icmp_error", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "insert_failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "drop", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "early_drop", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "icmp_error", aicmp_error); - rrd_stats_dimension_set(st, "insert_failed", ainsert_failed); - rrd_stats_dimension_set(st, "drop", adrop); - rrd_stats_dimension_set(st, "early_drop", aearly_drop); - rrd_stats_done(st); + rrddim_set(st, "icmp_error", aicmp_error); + rrddim_set(st, "insert_failed", ainsert_failed); + rrddim_set(st, "drop", adrop); + rrddim_set(st, "early_drop", aearly_drop); + rrdset_done(st); } return 0; diff --git a/src/proc_stat.c b/src/proc_stat.c index e78e8b11..4bbe4a11 100755 --- a/src/proc_stat.c +++ b/src/proc_stat.c @@ -35,7 +35,7 @@ int do_proc_stat(int update_every, unsigned long long dt) { uint32_t words; unsigned long long processes = 0, running = 0 , blocked = 0; - RRD_STATS *st; + RRDSET *st; for(l = 0; l < lines ;l++) { if(strncmp(procfile_lineword(ff, l, 0), "cpu", 3) == 0) { @@ -72,39 +72,39 @@ int do_proc_stat(int update_every, unsigned long long dt) { } if((isthistotal && do_cpu) || (!isthistotal && do_cpu_cores)) { - st = rrd_stats_find_bytype(type, id); + st = rrdset_find_bytype(type, id); if(!st) { - st = rrd_stats_create(type, id, NULL, "cpu", title, "percentage", priority, update_every, CHART_TYPE_STACKED); + st = rrdset_create(type, id, NULL, "cpu", title, "percentage", priority, update_every, RRDSET_TYPE_STACKED); long multiplier = 1; long divisor = 1; // sysconf(_SC_CLK_TCK); - rrd_stats_dimension_add(st, "guest_nice", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "guest", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "steal", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "softirq", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "irq", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "user", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "system", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "nice", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_add(st, "iowait", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - - rrd_stats_dimension_add(st, "idle", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); - rrd_stats_dimension_hide(st, "idle"); + rrddim_add(st, "guest_nice", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "guest", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "steal", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "softirq", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "irq", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "user", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "system", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "nice", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(st, "iowait", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + + rrddim_add(st, "idle", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL); + rrddim_hide(st, "idle"); } - else rrd_stats_next(st); - - rrd_stats_dimension_set(st, "user", user); - rrd_stats_dimension_set(st, "nice", nice); - rrd_stats_dimension_set(st, "system", system); - rrd_stats_dimension_set(st, "idle", idle); - rrd_stats_dimension_set(st, "iowait", iowait); - rrd_stats_dimension_set(st, "irq", irq); - rrd_stats_dimension_set(st, "softirq", softirq); - rrd_stats_dimension_set(st, "steal", steal); - rrd_stats_dimension_set(st, "guest", guest); - rrd_stats_dimension_set(st, "guest_nice", guest_nice); - rrd_stats_done(st); + else rrdset_next(st); + + rrddim_set(st, "user", user); + rrddim_set(st, "nice", nice); + rrddim_set(st, "system", system); + rrddim_set(st, "idle", idle); + rrddim_set(st, "iowait", iowait); + rrddim_set(st, "irq", irq); + rrddim_set(st, "softirq", softirq); + rrddim_set(st, "steal", steal); + rrddim_set(st, "guest", guest); + rrddim_set(st, "guest_nice", guest_nice); + rrdset_done(st); } } else if(strcmp(procfile_lineword(ff, l, 0), "intr") == 0) { @@ -113,17 +113,17 @@ int do_proc_stat(int update_every, unsigned long long dt) { // -------------------------------------------------------------------- if(do_interrupts) { - st = rrd_stats_find_bytype("system", "intr"); + st = rrdset_find_bytype("system", "intr"); if(!st) { - st = rrd_stats_create("system", "intr", NULL, "cpu", "CPU Interrupts", "interrupts/s", 900, update_every, CHART_TYPE_LINE); + st = rrdset_create("system", "intr", NULL, "cpu", "CPU Interrupts", "interrupts/s", 900, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "interrupts", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "interrupts", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "interrupts", value); - rrd_stats_done(st); + rrddim_set(st, "interrupts", value); + rrdset_done(st); } } else if(strcmp(procfile_lineword(ff, l, 0), "ctxt") == 0) { @@ -132,16 +132,16 @@ int do_proc_stat(int update_every, unsigned long long dt) { // -------------------------------------------------------------------- if(do_context) { - st = rrd_stats_find_bytype("system", "ctxt"); + st = rrdset_find_bytype("system", "ctxt"); if(!st) { - st = rrd_stats_create("system", "ctxt", NULL, "cpu", "CPU Context Switches", "context switches/s", 800, update_every, CHART_TYPE_LINE); + st = rrdset_create("system", "ctxt", NULL, "cpu", "CPU Context Switches", "context switches/s", 800, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "switches", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "switches", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "switches", value); - rrd_stats_done(st); + rrddim_set(st, "switches", value); + rrdset_done(st); } } else if(!processes && strcmp(procfile_lineword(ff, l, 0), "processes") == 0) { @@ -158,34 +158,34 @@ int do_proc_stat(int update_every, unsigned long long dt) { // -------------------------------------------------------------------- if(do_forks) { - st = rrd_stats_find_bytype("system", "forks"); + st = rrdset_find_bytype("system", "forks"); if(!st) { - st = rrd_stats_create("system", "forks", NULL, "cpu", "New Processes", "processes/s", 700, update_every, CHART_TYPE_LINE); + st = rrdset_create("system", "forks", NULL, "cpu", "New Processes", "processes/s", 700, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "started", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "started", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "started", processes); - rrd_stats_done(st); + rrddim_set(st, "started", processes); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_processes) { - st = rrd_stats_find_bytype("system", "processes"); + st = rrdset_find_bytype("system", "processes"); if(!st) { - st = rrd_stats_create("system", "processes", NULL, "cpu", "Processes", "processes", 600, update_every, CHART_TYPE_LINE); + st = rrdset_create("system", "processes", NULL, "cpu", "Processes", "processes", 600, update_every, RRDSET_TYPE_LINE); - rrd_stats_dimension_add(st, "running", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE); - rrd_stats_dimension_add(st, "blocked", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE); + rrddim_add(st, "running", NULL, 1, 1, RRDDIM_ABSOLUTE); + rrddim_add(st, "blocked", NULL, -1, 1, RRDDIM_ABSOLUTE); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "running", running); - rrd_stats_dimension_set(st, "blocked", blocked); - rrd_stats_done(st); + rrddim_set(st, "running", running); + rrddim_set(st, "blocked", blocked); + rrdset_done(st); } return 0; diff --git a/src/proc_vmstat.c b/src/proc_vmstat.c index 9f77462b..61c04387 100755 --- a/src/proc_vmstat.c +++ b/src/proc_vmstat.c @@ -150,58 +150,58 @@ int do_proc_vmstat(int update_every, unsigned long long dt) { else if(!thp_split && strcmp(name, "thp_split") == 0) thp_split = value; } - RRD_STATS *st; + RRDSET *st; // -------------------------------------------------------------------- if(do_swapio) { - st = rrd_stats_find("system.swapio"); + st = rrdset_find("system.swapio"); if(!st) { - st = rrd_stats_create("system", "swapio", NULL, "mem", "Swap I/O", "kilobytes/s", 250, update_every, CHART_TYPE_AREA); + st = rrdset_create("system", "swapio", NULL, "mem", "Swap I/O", "kilobytes/s", 250, update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(st, "in", NULL, sysconf(_SC_PAGESIZE), 1024 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "out", NULL, -sysconf(_SC_PAGESIZE), 1024 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "in", NULL, sysconf(_SC_PAGESIZE), 1024 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "out", NULL, -sysconf(_SC_PAGESIZE), 1024 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "in", pswpin); - rrd_stats_dimension_set(st, "out", pswpout); - rrd_stats_done(st); + rrddim_set(st, "in", pswpin); + rrddim_set(st, "out", pswpout); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_io) { - st = rrd_stats_find("system.io"); + st = rrdset_find("system.io"); if(!st) { - st = rrd_stats_create("system", "io", NULL, "disk", "Disk I/O", "kilobytes/s", 150, update_every, CHART_TYPE_AREA); + st = rrdset_create("system", "io", NULL, "disk", "Disk I/O", "kilobytes/s", 150, update_every, RRDSET_TYPE_AREA); - rrd_stats_dimension_add(st, "in", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "out", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "in", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "out", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "in", pgpgin); - rrd_stats_dimension_set(st, "out", pgpgout); - rrd_stats_done(st); + rrddim_set(st, "in", pgpgin); + rrddim_set(st, "out", pgpgout); + rrdset_done(st); } // -------------------------------------------------------------------- if(do_pgfaults) { - st = rrd_stats_find("system.pgfaults"); + st = rrdset_find("system.pgfaults"); if(!st) { - st = rrd_stats_create("system", "pgfaults", NULL, "mem", "Memory Page Faults", "page faults/s", 500, update_every, CHART_TYPE_LINE); + st = rrdset_create("system", "pgfaults", NULL, "mem", "Memory Page Faults", "page faults/s", 500, update_every, RRDSET_TYPE_LINE); st->isdetail = 1; - rrd_stats_dimension_add(st, "minor", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - rrd_stats_dimension_add(st, "major", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); + rrddim_add(st, "minor", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL); + rrddim_add(st, "major", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL); } - else rrd_stats_next(st); + else rrdset_next(st); - rrd_stats_dimension_set(st, "minor", pgfault); - rrd_stats_dimension_set(st, "major", pgmajfault); - rrd_stats_done(st); + rrddim_set(st, "minor", pgfault); + rrddim_set(st, "major", pgmajfault); + rrdset_done(st); } return 0; diff --git a/src/procfile.h b/src/procfile.h index 9841bbbd..f9bcd95b 100755 --- a/src/procfile.h +++ b/src/procfile.h @@ -26,9 +26,6 @@ #ifndef NETDATA_PROCFILE_H #define NETDATA_PROCFILE_H 1 -// if enabled, procfile will output a lot of debug info -extern int pfdebug; - // ---------------------------------------------------------------------------- // An array of words diff --git a/src/rrd.c b/src/rrd.c index 98914dd9..8675f844 100755 --- a/src/rrd.c +++ b/src/rrd.c @@ -16,58 +16,119 @@ #include "rrd.h" -int update_every = UPDATE_EVERY; -int save_history = HISTORY; +// ---------------------------------------------------------------------------- +// globals + +int rrd_update_every = UPDATE_EVERY; +int rrd_default_history_entries = RRD_DEFAULT_HISTORY_ENTRIES; + +RRDSET *rrdset_root = NULL; +pthread_rwlock_t rrdset_root_rwlock = PTHREAD_RWLOCK_INITIALIZER; + +int rrd_memory_mode = RRD_MEMORY_MODE_SAVE; + + +// ---------------------------------------------------------------------------- +// RRDSET index + +static int rrdset_iterator(avl *a) { if(a) {}; return 0; } + +static int rrdset_compare(void* a, void* b) { + if(((RRDSET *)a)->hash < ((RRDSET *)b)->hash) return -1; + else if(((RRDSET *)a)->hash > ((RRDSET *)b)->hash) return 1; + else return strcmp(((RRDSET *)a)->id, ((RRDSET *)b)->id); +} + +avl_tree rrdset_root_index = { + NULL, + rrdset_compare +}; + +#define rrdset_index_add(st) avl_insert(&rrdset_root_index, (avl *)(st)) +#define rrdset_index_del(st) avl_remove(&rrdset_root_index, (avl *)(st)) + +static RRDSET *rrdset_index_find(const char *id, unsigned long hash) { + RRDSET *result = NULL, tmp; + strncpy(tmp.id, id, RRD_ID_LENGTH_MAX); + tmp.id[RRD_ID_LENGTH_MAX] = '\0'; + tmp.hash = (hash)?hash:simple_hash(tmp.id); + + avl_search(&(rrdset_root_index), (avl *)&tmp, rrdset_iterator, (avl **)&result); + return result; +} + +// ---------------------------------------------------------------------------- +// RRDDIM index + +static int rrddim_iterator(avl *a) { if(a) {}; return 0; } + +static int rrddim_compare(void* a, void* b) { + if(((RRDDIM *)a)->hash < ((RRDDIM *)b)->hash) return -1; + else if(((RRDDIM *)a)->hash > ((RRDDIM *)b)->hash) return 1; + else return strcmp(((RRDDIM *)a)->id, ((RRDDIM *)b)->id); +} + +#define rrddim_index_add(st, rd) avl_insert(&((st)->dimensions_index), (avl *)(rd)) +#define rrddim_index_del(st,rd ) avl_remove(&((st)->dimensions_index), (avl *)(rd)) + +static RRDDIM *rrddim_index_find(RRDSET *st, const char *id, unsigned long hash) { + RRDDIM *result = NULL, tmp; + tmp.hash = (hash)?hash:simple_hash(id); + strncpy(tmp.id, id, RRD_ID_LENGTH_MAX); + tmp.id[RRD_ID_LENGTH_MAX] = '\0'; + tmp.hash = (hash)?hash:simple_hash(tmp.id); + + avl_search(&(st->dimensions_index), (avl *)&tmp, rrddim_iterator, (avl **)&result); + return result; +} // ---------------------------------------------------------------------------- // chart types -int chart_type_id(const char *name) +int rrdset_type_id(const char *name) { - if(strcmp(name, CHART_TYPE_AREA_NAME) == 0) return CHART_TYPE_AREA; - if(strcmp(name, CHART_TYPE_STACKED_NAME) == 0) return CHART_TYPE_STACKED; - if(strcmp(name, CHART_TYPE_LINE_NAME) == 0) return CHART_TYPE_LINE; - return CHART_TYPE_LINE; + if(strcmp(name, RRDSET_TYPE_AREA_NAME) == 0) return RRDSET_TYPE_AREA; + if(strcmp(name, RRDSET_TYPE_STACKED_NAME) == 0) return RRDSET_TYPE_STACKED; + if(strcmp(name, RRDSET_TYPE_LINE_NAME) == 0) return RRDSET_TYPE_LINE; + return RRDSET_TYPE_LINE; } -const char *chart_type_name(int chart_type) +const char *rrdset_type_name(int chart_type) { - static char line[] = CHART_TYPE_LINE_NAME; - static char area[] = CHART_TYPE_AREA_NAME; - static char stacked[] = CHART_TYPE_STACKED_NAME; + static char line[] = RRDSET_TYPE_LINE_NAME; + static char area[] = RRDSET_TYPE_AREA_NAME; + static char stacked[] = RRDSET_TYPE_STACKED_NAME; switch(chart_type) { - case CHART_TYPE_LINE: + case RRDSET_TYPE_LINE: return line; - case CHART_TYPE_AREA: + case RRDSET_TYPE_AREA: return area; - case CHART_TYPE_STACKED: + case RRDSET_TYPE_STACKED: return stacked; } return line; } // ---------------------------------------------------------------------------- -// mmap() wrapper +// load / save -int memory_mode = NETDATA_MEMORY_MODE_SAVE; - -const char *memory_mode_name(int id) +const char *rrd_memory_mode_name(int id) { - static const char ram[] = NETDATA_MEMORY_MODE_RAM_NAME; - static const char map[] = NETDATA_MEMORY_MODE_MAP_NAME; - static const char save[] = NETDATA_MEMORY_MODE_SAVE_NAME; + static const char ram[] = RRD_MEMORY_MODE_RAM_NAME; + static const char map[] = RRD_MEMORY_MODE_MAP_NAME; + static const char save[] = RRD_MEMORY_MODE_SAVE_NAME; switch(id) { - case NETDATA_MEMORY_MODE_RAM: + case RRD_MEMORY_MODE_RAM: return ram; - case NETDATA_MEMORY_MODE_MAP: + case RRD_MEMORY_MODE_MAP: return map; - case NETDATA_MEMORY_MODE_SAVE: + case RRD_MEMORY_MODE_SAVE: default: return save; } @@ -75,55 +136,55 @@ const char *memory_mode_name(int id) return save; } -int memory_mode_id(const char *name) +int rrd_memory_mode_id(const char *name) { - if(!strcmp(name, NETDATA_MEMORY_MODE_RAM_NAME)) - return NETDATA_MEMORY_MODE_RAM; - else if(!strcmp(name, NETDATA_MEMORY_MODE_MAP_NAME)) - return NETDATA_MEMORY_MODE_MAP; + if(!strcmp(name, RRD_MEMORY_MODE_RAM_NAME)) + return RRD_MEMORY_MODE_RAM; + else if(!strcmp(name, RRD_MEMORY_MODE_MAP_NAME)) + return RRD_MEMORY_MODE_MAP; - return NETDATA_MEMORY_MODE_SAVE; + return RRD_MEMORY_MODE_SAVE; } // ---------------------------------------------------------------------------- // algorithms types -int algorithm_id(const char *name) +int rrddim_algorithm_id(const char *name) { - if(strcmp(name, RRD_DIMENSION_ABSOLUTE_NAME) == 0) return RRD_DIMENSION_ABSOLUTE; - if(strcmp(name, RRD_DIMENSION_INCREMENTAL_NAME) == 0) return RRD_DIMENSION_INCREMENTAL; - if(strcmp(name, RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME) == 0) return RRD_DIMENSION_PCENT_OVER_ROW_TOTAL; - if(strcmp(name, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME) == 0) return RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL; - return RRD_DIMENSION_ABSOLUTE; + if(strcmp(name, RRDDIM_ABSOLUTE_NAME) == 0) return RRDDIM_ABSOLUTE; + if(strcmp(name, RRDDIM_INCREMENTAL_NAME) == 0) return RRDDIM_INCREMENTAL; + if(strcmp(name, RRDDIM_PCENT_OVER_ROW_TOTAL_NAME) == 0) return RRDDIM_PCENT_OVER_ROW_TOTAL; + if(strcmp(name, RRDDIM_PCENT_OVER_DIFF_TOTAL_NAME) == 0) return RRDDIM_PCENT_OVER_DIFF_TOTAL; + return RRDDIM_ABSOLUTE; } -const char *algorithm_name(int chart_type) +const char *rrddim_algorithm_name(int chart_type) { - static char absolute[] = RRD_DIMENSION_ABSOLUTE_NAME; - static char incremental[] = RRD_DIMENSION_INCREMENTAL_NAME; - static char percentage_of_absolute_row[] = RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME; - static char percentage_of_incremental_row[] = RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME; + static char absolute[] = RRDDIM_ABSOLUTE_NAME; + static char incremental[] = RRDDIM_INCREMENTAL_NAME; + static char percentage_of_absolute_row[] = RRDDIM_PCENT_OVER_ROW_TOTAL_NAME; + static char percentage_of_incremental_row[] = RRDDIM_PCENT_OVER_DIFF_TOTAL_NAME; switch(chart_type) { - case RRD_DIMENSION_ABSOLUTE: + case RRDDIM_ABSOLUTE: return absolute; - case RRD_DIMENSION_INCREMENTAL: + case RRDDIM_INCREMENTAL: return incremental; - case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL: + case RRDDIM_PCENT_OVER_ROW_TOTAL: return percentage_of_absolute_row; - case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL: + case RRDDIM_PCENT_OVER_DIFF_TOTAL: return percentage_of_incremental_row; } return absolute; } -RRD_STATS *root = NULL; -pthread_rwlock_t root_rwlock = PTHREAD_RWLOCK_INITIALIZER; +// ---------------------------------------------------------------------------- +// chart names -char *rrd_stats_strncpy_name(char *to, const char *from, int length) +char *rrdset_strncpy_name(char *to, const char *from, int length) { int i; for(i = 0; i < length && from[i] ;i++) { @@ -136,18 +197,21 @@ char *rrd_stats_strncpy_name(char *to, const char *from, int length) return to; } -void rrd_stats_set_name(RRD_STATS *st, const char *name) +void rrdset_set_name(RRDSET *st, const char *name) { char b[CONFIG_MAX_VALUE + 1]; - char n[RRD_STATS_NAME_MAX + 1]; + char n[RRD_ID_LENGTH_MAX + 1]; - snprintf(n, RRD_STATS_NAME_MAX, "%s.%s", st->type, name); - rrd_stats_strncpy_name(b, n, CONFIG_MAX_VALUE); + snprintf(n, RRD_ID_LENGTH_MAX, "%s.%s", st->type, name); + rrdset_strncpy_name(b, n, CONFIG_MAX_VALUE); st->name = config_get(st->id, "name", b); st->hash_name = simple_hash(st->name); } -char *rrd_stats_cache_dir(const char *id) +// ---------------------------------------------------------------------------- +// cache directory + +char *rrdset_cache_dir(const char *id) { char *ret = NULL; @@ -156,12 +220,12 @@ char *rrd_stats_cache_dir(const char *id) char b[FILENAME_MAX + 1]; char n[FILENAME_MAX + 1]; - rrd_stats_strncpy_name(b, id, FILENAME_MAX); + rrdset_strncpy_name(b, id, FILENAME_MAX); snprintf(n, FILENAME_MAX, "%s/%s", cache_dir, b); ret = config_get(id, "database directory", n); - if(memory_mode == NETDATA_MEMORY_MODE_MAP || memory_mode == NETDATA_MEMORY_MODE_SAVE) { + if(rrd_memory_mode == RRD_MEMORY_MODE_MAP || rrd_memory_mode == RRD_MEMORY_MODE_SAVE) { int r = mkdir(ret, 0775); if(r != 0 && errno != EEXIST) error("Cannot create directory '%s'", ret); @@ -170,7 +234,10 @@ char *rrd_stats_cache_dir(const char *id) return ret; } -void rrd_stats_reset(RRD_STATS *st) +// ---------------------------------------------------------------------------- +// core functions + +void rrdset_reset(RRDSET *st) { st->last_collected_time.tv_sec = 0; st->last_collected_time.tv_usec = 0; @@ -180,7 +247,7 @@ void rrd_stats_reset(RRD_STATS *st) st->counter = 0; st->counter_done = 0; - RRD_DIMENSION *rd; + RRDDIM *rd; for(rd = st->dimensions; rd ; rd = rd->next) { rd->last_collected_time.tv_sec = 0; rd->last_collected_time.tv_usec = 0; @@ -188,35 +255,35 @@ void rrd_stats_reset(RRD_STATS *st) } } -RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type) +RRDSET *rrdset_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type) { if(!id || !id[0]) { fatal("Cannot create rrd stats without an id."); return NULL; } - char fullid[RRD_STATS_NAME_MAX + 1]; + char fullid[RRD_ID_LENGTH_MAX + 1]; char fullfilename[FILENAME_MAX + 1]; - RRD_STATS *st = NULL; + RRDSET *st = NULL; - snprintf(fullid, RRD_STATS_NAME_MAX, "%s.%s", type, id); + snprintf(fullid, RRD_ID_LENGTH_MAX, "%s.%s", type, id); - long entries = config_get_number(fullid, "history", save_history); + long entries = config_get_number(fullid, "history", rrd_default_history_entries); if(entries < 5) entries = config_set_number(fullid, "history", 5); - if(entries > HISTORY_MAX) entries = config_set_number(fullid, "history", HISTORY_MAX); + if(entries > RRD_HISTORY_ENTRIES_MAX) entries = config_set_number(fullid, "history", RRD_HISTORY_ENTRIES_MAX); int enabled = config_get_boolean(fullid, "enabled", 1); if(!enabled) entries = 5; - unsigned long size = sizeof(RRD_STATS); - char *cache_dir = rrd_stats_cache_dir(fullid); + unsigned long size = sizeof(RRDSET); + char *cache_dir = rrdset_cache_dir(fullid); debug(D_RRD_CALLS, "Creating RRD_STATS for '%s.%s'.", type, id); snprintf(fullfilename, FILENAME_MAX, "%s/main.db", cache_dir); - if(memory_mode != NETDATA_MEMORY_MODE_RAM) st = (RRD_STATS *)mymmap(fullfilename, size, ((memory_mode == NETDATA_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE)); + if(rrd_memory_mode != RRD_MEMORY_MODE_RAM) st = (RRDSET *)mymmap(fullfilename, size, ((rrd_memory_mode == RRD_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE)); if(st) { - if(strcmp(st->magic, RRD_STATS_MAGIC) != 0) { + if(strcmp(st->magic, RRDSET_MAGIC) != 0) { errno = 0; info("Initializing file %s.", fullfilename); bzero(st, size); @@ -253,7 +320,7 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, st->units = NULL; st->dimensions = NULL; st->next = NULL; - st->mapped = memory_mode; + st->mapped = rrd_memory_mode; } else { st = calloc(1, size); @@ -261,14 +328,14 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, fatal("Cannot allocate memory for RRD_STATS %s.%s", type, id); return NULL; } - st->mapped = NETDATA_MEMORY_MODE_RAM; + st->mapped = RRD_MEMORY_MODE_RAM; } st->memsize = size; st->entries = entries; st->update_every = update_every; - strcpy(st->cache_file, fullfilename); - strcpy(st->magic, RRD_STATS_MAGIC); + strcpy(st->cache_filename, fullfilename); + strcpy(st->magic, RRDSET_MAGIC); strcpy(st->id, fullid); st->hash = simple_hash(st->id); @@ -278,10 +345,10 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, st->family = config_get(st->id, "family", family?family:st->id); st->units = config_get(st->id, "units", units?units:""); st->type = config_get(st->id, "type", type); - st->chart_type = chart_type_id(config_get(st->id, "chart type", chart_type_name(chart_type))); + st->chart_type = rrdset_type_id(config_get(st->id, "chart type", rrdset_type_name(chart_type))); - if(name && *name) rrd_stats_set_name(st, name); - else rrd_stats_set_name(st, id); + if(name && *name) rrdset_set_name(st, name); + else rrdset_set_name(st, id); { char varvalue[CONFIG_MAX_VALUE + 1]; @@ -299,38 +366,43 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, st->last_collected_time.tv_usec = 0; st->counter_done = 0; - st->gap_when_lost_iterations = config_get_number(st->id, "gap when lost iterations above", DEFAULT_GAP_INTERPOLATIONS); + st->gap_when_lost_iterations_above = config_get_number(st->id, "gap when lost iterations above", RRD_DEFAULT_GAP_INTERPOLATIONS); + + st->dimensions_index.root = NULL; + st->dimensions_index.compar = rrddim_compare; pthread_rwlock_init(&st->rwlock, NULL); - pthread_rwlock_wrlock(&root_rwlock); + pthread_rwlock_wrlock(&rrdset_root_rwlock); + + st->next = rrdset_root; + rrdset_root = st; - st->next = root; - root = st; + rrdset_index_add(st); - pthread_rwlock_unlock(&root_rwlock); + pthread_rwlock_unlock(&rrdset_root_rwlock); return(st); } -RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char *name, long multiplier, long divisor, int algorithm) +RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, long multiplier, long divisor, int algorithm) { char filename[FILENAME_MAX + 1]; char fullfilename[FILENAME_MAX + 1]; char varname[CONFIG_MAX_NAME + 1]; - RRD_DIMENSION *rd = NULL; - unsigned long size = sizeof(RRD_DIMENSION) + (st->entries * sizeof(storage_number)); + RRDDIM *rd = NULL; + unsigned long size = sizeof(RRDDIM) + (st->entries * sizeof(storage_number)); debug(D_RRD_CALLS, "Adding dimension '%s/%s'.", st->id, id); - rrd_stats_strncpy_name(filename, id, FILENAME_MAX); + rrdset_strncpy_name(filename, id, FILENAME_MAX); snprintf(fullfilename, FILENAME_MAX, "%s/%s.db", st->cache_dir, filename); - if(memory_mode != NETDATA_MEMORY_MODE_RAM) rd = (RRD_DIMENSION *)mymmap(fullfilename, size, ((memory_mode == NETDATA_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE)); + if(rrd_memory_mode != RRD_MEMORY_MODE_RAM) rd = (RRDDIM *)mymmap(fullfilename, size, ((rrd_memory_mode == RRD_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE)); if(rd) { struct timeval now; gettimeofday(&now, NULL); - if(strcmp(rd->magic, RRD_DIMENSION_MAGIC) != 0) { + if(strcmp(rd->magic, RRDDIMENSION_MAGIC) != 0) { errno = 0; info("Initializing file %s.", fullfilename); bzero(rd, size); @@ -376,7 +448,7 @@ RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char if(rd) { // we have a file mapped for rd - rd->mapped = memory_mode; + rd->mapped = rrd_memory_mode; rd->hidden = 0; rd->next = NULL; rd->name = NULL; @@ -390,20 +462,20 @@ RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char return NULL; } - rd->mapped = NETDATA_MEMORY_MODE_RAM; + rd->mapped = RRD_MEMORY_MODE_RAM; } rd->memsize = size; - strcpy(rd->magic, RRD_DIMENSION_MAGIC); - strcpy(rd->cache_file, fullfilename); - strncpy(rd->id, id, RRD_STATS_NAME_MAX); + strcpy(rd->magic, RRDDIMENSION_MAGIC); + strcpy(rd->cache_filename, fullfilename); + strncpy(rd->id, id, RRD_ID_LENGTH_MAX); rd->hash = simple_hash(rd->id); snprintf(varname, CONFIG_MAX_NAME, "dim %s name", rd->id); rd->name = config_get(st->id, varname, (name && *name)?name:rd->id); snprintf(varname, CONFIG_MAX_NAME, "dim %s algorithm", rd->id); - rd->algorithm = algorithm_id(config_get(st->id, varname, algorithm_name(algorithm))); + rd->algorithm = rrddim_algorithm_id(config_get(st->id, varname, rrddim_algorithm_name(algorithm))); snprintf(varname, CONFIG_MAX_NAME, "dim %s multiplier", rd->id); rd->multiplier = config_get_number(st->id, varname, multiplier); @@ -419,33 +491,47 @@ RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char if(!st->dimensions) st->dimensions = rd; else { - RRD_DIMENSION *td = st->dimensions; + RRDDIM *td = st->dimensions; for(; td->next; td = td->next) ; td->next = rd; } + rrddim_index_add(st, rd); + return(rd); } -void rrd_stats_dimension_set_name(RRD_STATS *st, RRD_DIMENSION *rd, const char *name) +void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name) { char varname[CONFIG_MAX_NAME + 1]; snprintf(varname, CONFIG_MAX_NAME, "dim %s name", rd->id); config_get(st->id, varname, name); } -void rrd_stats_dimension_free(RRD_DIMENSION *rd) +void rrddim_free(RRDSET *st, RRDDIM *rd) { - if(rd->next) rrd_stats_dimension_free(rd->next); + RRDDIM *i = st->dimensions, *last = NULL; + for(i = st->dimensions; i && i != rd ; i = i->next) last = i; + + if(!i) { + error("Request to free dimension %s.%s but it is not linked.", st->id, rd->name); + return; + } + + if(last) last = i->next; + else st->dimensions = i->next; + + rrddim_index_del(st, rd); + // free(rd->annotations); - if(rd->mapped == NETDATA_MEMORY_MODE_SAVE) { - debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_file); - savememory(rd->cache_file, rd, rd->memsize); + if(rd->mapped == RRD_MEMORY_MODE_SAVE) { + debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_filename); + savememory(rd->cache_filename, rd, rd->memsize); debug(D_RRD_CALLS, "Unmapping dimension '%s'.", rd->name); munmap(rd, rd->memsize); } - else if(rd->mapped == NETDATA_MEMORY_MODE_MAP) { + else if(rd->mapped == RRD_MEMORY_MODE_MAP) { debug(D_RRD_CALLS, "Unmapping dimension '%s'.", rd->name); munmap(rd, rd->memsize); } @@ -455,25 +541,27 @@ void rrd_stats_dimension_free(RRD_DIMENSION *rd) } } -void rrd_stats_free_all(void) +void rrdset_free_all(void) { info("Freeing all memory..."); - RRD_STATS *st; - for(st = root; st ;) { - RRD_STATS *next = st->next; + RRDSET *st; + for(st = rrdset_root; st ;) { + RRDSET *next = st->next; - if(st->dimensions) rrd_stats_dimension_free(st->dimensions); - st->dimensions = NULL; + while(st->dimensions) + rrddim_free(st, st->dimensions); - if(st->mapped == NETDATA_MEMORY_MODE_SAVE) { - debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_file); - savememory(st->cache_file, st, st->memsize); + rrdset_index_del(st); + + if(st->mapped == RRD_MEMORY_MODE_SAVE) { + debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename); + savememory(st->cache_filename, st, st->memsize); debug(D_RRD_CALLS, "Unmapping stats '%s'.", st->name); munmap(st, st->memsize); } - else if(st->mapped == NETDATA_MEMORY_MODE_MAP) { + else if(st->mapped == RRD_MEMORY_MODE_MAP) { debug(D_RRD_CALLS, "Unmapping stats '%s'.", st->name); munmap(st, st->memsize); } @@ -482,111 +570,96 @@ void rrd_stats_free_all(void) st = next; } - root = NULL; + rrdset_root = NULL; info("Memory cleanup completed..."); } -void rrd_stats_save_all(void) +void rrdset_save_all(void) { - RRD_STATS *st; - RRD_DIMENSION *rd; + RRDSET *st; + RRDDIM *rd; - pthread_rwlock_wrlock(&root_rwlock); - for(st = root; st ; st = st->next) { + pthread_rwlock_wrlock(&rrdset_root_rwlock); + for(st = rrdset_root; st ; st = st->next) { pthread_rwlock_wrlock(&st->rwlock); - if(st->mapped == NETDATA_MEMORY_MODE_SAVE) { - debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_file); - savememory(st->cache_file, st, st->memsize); + if(st->mapped == RRD_MEMORY_MODE_SAVE) { + debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename); + savememory(st->cache_filename, st, st->memsize); } for(rd = st->dimensions; rd ; rd = rd->next) { - if(rd->mapped == NETDATA_MEMORY_MODE_SAVE) { - debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_file); - savememory(rd->cache_file, rd, rd->memsize); + if(rd->mapped == RRD_MEMORY_MODE_SAVE) { + debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_filename); + savememory(rd->cache_filename, rd, rd->memsize); } } pthread_rwlock_unlock(&st->rwlock); } - pthread_rwlock_unlock(&root_rwlock); + pthread_rwlock_unlock(&rrdset_root_rwlock); } -RRD_STATS *rrd_stats_find(const char *id) +RRDSET *rrdset_find(const char *id) { debug(D_RRD_CALLS, "rrd_stats_find() for chart %s", id); - unsigned long hash = simple_hash(id); - - pthread_rwlock_rdlock(&root_rwlock); - RRD_STATS *st = root; - for ( ; st ; st = st->next ) - if(hash == st->hash) - if(strcmp(st->id, id) == 0) - break; - pthread_rwlock_unlock(&root_rwlock); + pthread_rwlock_rdlock(&rrdset_root_rwlock); + RRDSET *st = rrdset_index_find(id, 0); + pthread_rwlock_unlock(&rrdset_root_rwlock); return(st); } -RRD_STATS *rrd_stats_find_bytype(const char *type, const char *id) +RRDSET *rrdset_find_bytype(const char *type, const char *id) { debug(D_RRD_CALLS, "rrd_stats_find_bytype() for chart %s.%s", type, id); - char buf[RRD_STATS_NAME_MAX + 1]; + char buf[RRD_ID_LENGTH_MAX + 1]; - strncpy(buf, type, RRD_STATS_NAME_MAX - 1); - buf[RRD_STATS_NAME_MAX - 1] = '\0'; + strncpy(buf, type, RRD_ID_LENGTH_MAX - 1); + buf[RRD_ID_LENGTH_MAX - 1] = '\0'; strcat(buf, "."); int len = strlen(buf); - strncpy(&buf[len], id, RRD_STATS_NAME_MAX - len); - buf[RRD_STATS_NAME_MAX] = '\0'; + strncpy(&buf[len], id, RRD_ID_LENGTH_MAX - len); + buf[RRD_ID_LENGTH_MAX] = '\0'; - return(rrd_stats_find(buf)); + return(rrdset_find(buf)); } -RRD_STATS *rrd_stats_find_byname(const char *name) +RRDSET *rrdset_find_byname(const char *name) { debug(D_RRD_CALLS, "rrd_stats_find_byname() for chart %s", name); char b[CONFIG_MAX_VALUE + 1]; - rrd_stats_strncpy_name(b, name, CONFIG_MAX_VALUE); + rrdset_strncpy_name(b, name, CONFIG_MAX_VALUE); unsigned long hash = simple_hash(b); - pthread_rwlock_rdlock(&root_rwlock); - RRD_STATS *st = root; + pthread_rwlock_rdlock(&rrdset_root_rwlock); + RRDSET *st = rrdset_root; for ( ; st ; st = st->next ) { if(hash == st->hash_name && strcmp(st->name, b) == 0) break; } - pthread_rwlock_unlock(&root_rwlock); + pthread_rwlock_unlock(&rrdset_root_rwlock); return(st); } -RRD_DIMENSION *rrd_stats_dimension_find(RRD_STATS *st, const char *id) +RRDDIM *rrddim_find(RRDSET *st, const char *id) { debug(D_RRD_CALLS, "rrd_stats_dimension_find() for chart %s, dimension %s", st->name, id); - unsigned long hash = simple_hash(id); - - RRD_DIMENSION *rd = st->dimensions; - - for ( ; rd ; rd = rd->next ) - if(hash == rd->hash) - if(strcmp(rd->id, id) == 0) - break; - - return(rd); + return rrddim_index_find(st, id, 0); } -int rrd_stats_dimension_hide(RRD_STATS *st, const char *id) +int rrddim_hide(RRDSET *st, const char *id) { debug(D_RRD_CALLS, "rrd_stats_dimension_hide() for chart %s, dimension %s", st->name, id); - RRD_DIMENSION *rd = rrd_stats_dimension_find(st, id); + RRDDIM *rd = rrddim_find(st, id); if(!rd) { error("Cannot find dimension with id '%s' on stats '%s' (%s).", id, st->name, st->id); return 1; @@ -596,7 +669,7 @@ int rrd_stats_dimension_hide(RRD_STATS *st, const char *id) return 0; } -void rrd_stats_dimension_set_by_pointer(RRD_STATS *st, RRD_DIMENSION *rd, collected_number value) +void rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value) { debug(D_RRD_CALLS, "rrd_stats_dimension_set() for chart %s, dimension %s, value " COLLECTED_NUMBER_FORMAT, st->name, rd->name, value); @@ -605,19 +678,19 @@ void rrd_stats_dimension_set_by_pointer(RRD_STATS *st, RRD_DIMENSION *rd, collec rd->updated = 1; } -int rrd_stats_dimension_set(RRD_STATS *st, const char *id, collected_number value) +int rrddim_set(RRDSET *st, const char *id, collected_number value) { - RRD_DIMENSION *rd = rrd_stats_dimension_find(st, id); + RRDDIM *rd = rrddim_find(st, id); if(!rd) { error("Cannot find dimension with id '%s' on stats '%s' (%s).", id, st->name, st->id); return 1; } - rrd_stats_dimension_set_by_pointer(st, rd, value); + rrddim_set_by_pointer(st, rd, value); return 0; } -void rrd_stats_next_usec(RRD_STATS *st, unsigned long long microseconds) +void rrdset_next_usec(RRDSET *st, unsigned long long microseconds) { debug(D_RRD_CALLS, "rrd_stats_next() for chart %s with microseconds %llu", st->name, microseconds); @@ -625,7 +698,7 @@ void rrd_stats_next_usec(RRD_STATS *st, unsigned long long microseconds) st->usec_since_last_update = microseconds; } -void rrd_stats_next(RRD_STATS *st) +void rrdset_next(RRDSET *st) { unsigned long long microseconds = 0; @@ -635,19 +708,19 @@ void rrd_stats_next(RRD_STATS *st) microseconds = usecdiff(&now, &st->last_collected_time); } - rrd_stats_next_usec(st, microseconds); + rrdset_next_usec(st, microseconds); } -void rrd_stats_next_plugins(RRD_STATS *st) +void rrdset_next_plugins(RRDSET *st) { - rrd_stats_next(st); + rrdset_next(st); } -unsigned long long rrd_stats_done(RRD_STATS *st) +unsigned long long rrdset_done(RRDSET *st) { debug(D_RRD_CALLS, "rrd_stats_done() for chart %s", st->name); - RRD_DIMENSION *rd, *last; + RRDDIM *rd, *last; int oldstate, store_this_entry = 1; if(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate) != 0) @@ -659,7 +732,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) // check if the chart has a long time to be refreshed if(st->usec_since_last_update > st->entries * st->update_every * 1000000ULL) { info("%s: took too long to be updated (%0.3Lf secs). Reseting it.", st->name, (long double)(st->usec_since_last_update / 1000000.0)); - rrd_stats_reset(st); + rrdset_reset(st); st->usec_since_last_update = st->update_every * 1000000ULL; } if(st->debug) debug(D_RRD_STATS, "%s: microseconds since last update: %llu", st->name, st->usec_since_last_update); @@ -701,7 +774,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) // check if we will re-write the entire data set if(usecdiff(&st->last_collected_time, &st->last_updated) > st->update_every * st->entries * 1000000ULL) { info("%s: too old data (last updated at %u.%u, last collected at %u.%u). Reseting 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); - rrd_stats_reset(st); + rrdset_reset(st); st->usec_since_last_update = st->update_every * 1000000ULL; @@ -759,7 +832,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) ); switch(rd->algorithm) { - case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL: + case RRDDIM_PCENT_OVER_DIFF_TOTAL: // the percentage of the current increment // over the increment of all dimensions together if(st->collected_total == st->last_collected_total) rd->calculated_value = rd->last_calculated_value; @@ -780,7 +853,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) ); break; - case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL: + case RRDDIM_PCENT_OVER_ROW_TOTAL: if(!st->collected_total) rd->calculated_value = 0; else // the percentage of the current value @@ -802,10 +875,14 @@ unsigned long long rrd_stats_done(RRD_STATS *st) ); break; - case RRD_DIMENSION_INCREMENTAL: + case RRDDIM_INCREMENTAL: // if the new is smaller than the old (an overflow, or reset), set the old equal to the new // to reset the calculation (it will give zero as the calculation for this second) if(rd->last_collected_value > rd->collected_value) { + info("%s.%s: Detect RESET or OVERFLOW. Last collected value = " COLLECTED_NUMBER_FORMAT ", current = " COLLECTED_NUMBER_FORMAT + , st->name, rd->name + , rd->last_collected_value + , rd->collected_value); storage_flags = SN_EXISTS_RESET; rd->last_collected_value = rd->collected_value; } @@ -822,7 +899,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) ); break; - case RRD_DIMENSION_ABSOLUTE: + case RRDDIM_ABSOLUTE: rd->calculated_value = (calculated_number)rd->collected_value; if(st->debug) @@ -869,7 +946,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) calculated_number new_value; switch(rd->algorithm) { - case RRD_DIMENSION_INCREMENTAL: + case RRDDIM_INCREMENTAL: new_value = (calculated_number) ( rd->calculated_value * (calculated_number)(next_ut - last_ut) @@ -892,9 +969,9 @@ unsigned long long rrd_stats_done(RRD_STATS *st) rd->calculated_value -= new_value; break; - case RRD_DIMENSION_ABSOLUTE: - case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL: - case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL: + case RRDDIM_ABSOLUTE: + case RRDDIM_PCENT_OVER_ROW_TOTAL: + case RRDDIM_PCENT_OVER_DIFF_TOTAL: default: new_value = (calculated_number) ( ( (rd->calculated_value - rd->last_calculated_value) @@ -926,7 +1003,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) continue; } - if(rd->updated && iterations < st->gap_when_lost_iterations) { + if(rd->updated && iterations < st->gap_when_lost_iterations_above) { rd->values[st->current_entry] = pack_storage_number( new_value * (calculated_number)rd->multiplier @@ -1007,8 +1084,8 @@ unsigned long long rrd_stats_done(RRD_STATS *st) // we have to set the first calculated_value to zero // to eliminate the first spike if(st->counter_done == 1) switch(rd->algorithm) { - case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL: - case RRD_DIMENSION_INCREMENTAL: + case RRDDIM_PCENT_OVER_DIFF_TOTAL: + case RRDDIM_INCREMENTAL: rd->calculated_value = 0; // the next time, a new incremental total will be calculated break; @@ -1037,14 +1114,14 @@ unsigned long long rrd_stats_done(RRD_STATS *st) if(!last) { st->dimensions = rd->next; rd->next = NULL; - rrd_stats_dimension_free(rd); + rrddim_free(st, rd); rd = st->dimensions; continue; } else { last->next = rd->next; rd->next = NULL; - rrd_stats_dimension_free(rd); + rrddim_free(st, rd); rd = last->next; continue; } @@ -1067,7 +1144,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st) // find the oldest entry in the data, skipping all empty slots -time_t rrd_stats_first_entry_t(RRD_STATS *st) +time_t rrdset_first_entry_t(RRDSET *st) { if(!st->first_entry_t) return st->last_updated.tv_sec; diff --git a/src/rrd.h b/src/rrd.h index 8a141e54..a36f194c 100755 --- a/src/rrd.h +++ b/src/rrd.h @@ -1,6 +1,7 @@ #include #include +#include "avl.h" #include "storage_number.h" #ifndef NETDATA_RRD_H @@ -8,77 +9,81 @@ #define UPDATE_EVERY 1 #define UPDATE_EVERY_MAX 3600 -extern int update_every; +extern int rrd_update_every; -#define HISTORY 3600 -#define HISTORY_MAX (86400*10) -extern int save_history; +#define RRD_DEFAULT_HISTORY_ENTRIES 3600 +#define RRD_HISTORY_ENTRIES_MAX (86400*10) +extern int rrd_default_history_entries; -#define DEFAULT_GAP_INTERPOLATIONS 10 +#define RRD_DEFAULT_GAP_INTERPOLATIONS 10 typedef long long total_number; - #define TOTAL_NUMBER_FORMAT "%lld" -#define RRD_STATS_NAME_MAX 1024 - -#define RRD_STATS_MAGIC "NETDATA CACHE STATS FILE V010" -#define RRD_DIMENSION_MAGIC "NETDATA CACHE DIMENSION FILE V010" +#define RRD_ID_LENGTH_MAX 1024 +#define RRDSET_MAGIC "NETDATA CACHE STATS FILE V011" +#define RRDDIMENSION_MAGIC "NETDATA CACHE DIMENSION FILE V011" // ---------------------------------------------------------------------------- // chart types -#define CHART_TYPE_LINE_NAME "line" -#define CHART_TYPE_AREA_NAME "area" -#define CHART_TYPE_STACKED_NAME "stacked" +#define RRDSET_TYPE_LINE_NAME "line" +#define RRDSET_TYPE_AREA_NAME "area" +#define RRDSET_TYPE_STACKED_NAME "stacked" -#define CHART_TYPE_LINE 0 -#define CHART_TYPE_AREA 1 -#define CHART_TYPE_STACKED 2 +#define RRDSET_TYPE_LINE 0 +#define RRDSET_TYPE_AREA 1 +#define RRDSET_TYPE_STACKED 2 -int chart_type_id(const char *name); -const char *chart_type_name(int chart_type); +int rrdset_type_id(const char *name); +const char *rrdset_type_name(int chart_type); // ---------------------------------------------------------------------------- // memory mode -#define NETDATA_MEMORY_MODE_RAM_NAME "ram" -#define NETDATA_MEMORY_MODE_MAP_NAME "map" -#define NETDATA_MEMORY_MODE_SAVE_NAME "save" +#define RRD_MEMORY_MODE_RAM_NAME "ram" +#define RRD_MEMORY_MODE_MAP_NAME "map" +#define RRD_MEMORY_MODE_SAVE_NAME "save" -#define NETDATA_MEMORY_MODE_RAM 0 -#define NETDATA_MEMORY_MODE_MAP 1 -#define NETDATA_MEMORY_MODE_SAVE 2 +#define RRD_MEMORY_MODE_RAM 0 +#define RRD_MEMORY_MODE_MAP 1 +#define RRD_MEMORY_MODE_SAVE 2 -extern int memory_mode; +extern int rrd_memory_mode; -extern const char *memory_mode_name(int id); -extern int memory_mode_id(const char *name); +extern const char *rrd_memory_mode_name(int id); +extern int rrd_memory_mode_id(const char *name); // ---------------------------------------------------------------------------- // algorithms types -#define RRD_DIMENSION_ABSOLUTE_NAME "absolute" -#define RRD_DIMENSION_INCREMENTAL_NAME "incremental" -#define RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME "percentage-of-incremental-row" -#define RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME "percentage-of-absolute-row" +#define RRDDIM_ABSOLUTE_NAME "absolute" +#define RRDDIM_INCREMENTAL_NAME "incremental" +#define RRDDIM_PCENT_OVER_DIFF_TOTAL_NAME "percentage-of-incremental-row" +#define RRDDIM_PCENT_OVER_ROW_TOTAL_NAME "percentage-of-absolute-row" + +#define RRDDIM_ABSOLUTE 0 +#define RRDDIM_INCREMENTAL 1 +#define RRDDIM_PCENT_OVER_DIFF_TOTAL 2 +#define RRDDIM_PCENT_OVER_ROW_TOTAL 3 + +extern int rrddim_algorithm_id(const char *name); +extern const char *rrddim_algorithm_name(int chart_type); -#define RRD_DIMENSION_ABSOLUTE 0 -#define RRD_DIMENSION_INCREMENTAL 1 -#define RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL 2 -#define RRD_DIMENSION_PCENT_OVER_ROW_TOTAL 3 -extern int algorithm_id(const char *name); -extern const char *algorithm_name(int chart_type); +// ---------------------------------------------------------------------------- +// RRD DIMENSION + +struct rrddim { + avl avl; -struct rrd_dimension { - char magic[sizeof(RRD_DIMENSION_MAGIC) + 1]; // our magic - char id[RRD_STATS_NAME_MAX + 1]; // the id of this dimension (for internal identification) - char *name; // the name of this dimension (as presented to user) - char cache_file[FILENAME_MAX+1]; + char magic[sizeof(RRDDIMENSION_MAGIC) + 1]; // our magic + char id[RRD_ID_LENGTH_MAX + 1]; // the id of this dimension (for internal identification) + const char *name; // the name of this dimension (as presented to user) + char cache_filename[FILENAME_MAX+1]; unsigned long hash; // a simple hash on the id, to speed up searching // we first compare hashes, and only if the hashes are equal we do string comparisons @@ -110,19 +115,25 @@ struct rrd_dimension { calculated_number collected_volume; calculated_number stored_volume; - struct rrd_dimension *next; // linking of dimensions within the same data set + struct rrddim *next; // linking of dimensions within the same data set storage_number values[]; // the array of values - THIS HAS TO BE THE LAST MEMBER }; -typedef struct rrd_dimension RRD_DIMENSION; +typedef struct rrddim RRDDIM; + + +// ---------------------------------------------------------------------------- +// RRDSET + +struct rrdset { + avl avl; -struct rrd_stats { - char magic[sizeof(RRD_STATS_MAGIC) + 1]; // our magic + char magic[sizeof(RRDSET_MAGIC) + 1]; // our magic - char id[RRD_STATS_NAME_MAX + 1]; // id of the data set - char *name; // name of the data set + char id[RRD_ID_LENGTH_MAX + 1]; // id of the data set + const char *name; // name of the data set char *cache_dir; // the directory to store dimension maps - char cache_file[FILENAME_MAX+1]; + char cache_filename[FILENAME_MAX+1]; char *type; // the type of graph RRD_TYPE_* (a category, for determining graphing options) char *family; // the family of this data set (for grouping them together) @@ -140,7 +151,7 @@ struct rrd_stats { unsigned long hash; // a simple hash on the id, to speed up searching // we first compare hashes, and only if the hashes are equal we do string comparisons - int gap_when_lost_iterations; // after how many lost iterations a gap should be stored + int gap_when_lost_iterations_above; // after how many lost iterations a gap should be stored // netdata will interpolate values for gaps lower than this long priority; @@ -164,49 +175,58 @@ struct rrd_stats { int isdetail; // if set, the data set should be considered as a detail of another // (the master data set should be the one that has the same family and is not detail) - RRD_DIMENSION *dimensions; // the actual data for every dimension + RRDDIM *dimensions; // the actual data for every dimension - struct rrd_stats *next; // linking of rrd stats + avl_tree dimensions_index; + + struct rrdset *next; // linking of rrdsets }; -typedef struct rrd_stats RRD_STATS; +typedef struct rrdset RRDSET; + +extern RRDSET *rrdset_root; +extern pthread_rwlock_t rrdset_root_rwlock; -extern RRD_STATS *root; -extern pthread_rwlock_t root_rwlock; +// ---------------------------------------------------------------------------- +// RRD SET functions + +extern char *rrdset_strncpy_name(char *to, const char *from, int length); +extern void rrdset_set_name(RRDSET *st, const char *name); -extern char *rrd_stats_strncpy_name(char *to, const char *from, int length); -extern void rrd_stats_set_name(RRD_STATS *st, const char *name); +extern char *rrdset_cache_dir(const char *id); -extern char *rrd_stats_cache_dir(const char *id); +extern void rrdset_reset(RRDSET *st); -extern void rrd_stats_reset(RRD_STATS *st); +extern RRDSET *rrdset_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type); -extern RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type); +extern void rrdset_free_all(void); +extern void rrdset_save_all(void); -extern RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char *name, long multiplier, long divisor, int algorithm); +extern RRDSET *rrdset_find(const char *id); +extern RRDSET *rrdset_find_bytype(const char *type, const char *id); +extern RRDSET *rrdset_find_byname(const char *name); -extern void rrd_stats_dimension_set_name(RRD_STATS *st, RRD_DIMENSION *rd, const char *name); -extern void rrd_stats_dimension_free(RRD_DIMENSION *rd); +extern void rrdset_next_usec(RRDSET *st, unsigned long long microseconds); +extern void rrdset_next(RRDSET *st); +extern void rrdset_next_plugins(RRDSET *st); -extern void rrd_stats_free_all(void); -extern void rrd_stats_save_all(void); +extern unsigned long long rrdset_done(RRDSET *st); -extern RRD_STATS *rrd_stats_find(const char *id); -extern RRD_STATS *rrd_stats_find_bytype(const char *type, const char *id); -extern RRD_STATS *rrd_stats_find_byname(const char *name); +extern time_t rrdset_first_entry_t(RRDSET *st); -extern RRD_DIMENSION *rrd_stats_dimension_find(RRD_STATS *st, const char *id); -extern int rrd_stats_dimension_hide(RRD_STATS *st, const char *id); +// ---------------------------------------------------------------------------- +// RRD DIMENSION functions + +extern RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, long multiplier, long divisor, int algorithm); -extern void rrd_stats_dimension_set_by_pointer(RRD_STATS *st, RRD_DIMENSION *rd, collected_number value); -extern int rrd_stats_dimension_set(RRD_STATS *st, const char *id, collected_number value); +extern void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name); +extern void rrddim_free(RRDSET *st, RRDDIM *rd); -extern void rrd_stats_next_usec(RRD_STATS *st, unsigned long long microseconds); -extern void rrd_stats_next(RRD_STATS *st); -extern void rrd_stats_next_plugins(RRD_STATS *st); +extern RRDDIM *rrddim_find(RRDSET *st, const char *id); -extern unsigned long long rrd_stats_done(RRD_STATS *st); +extern int rrddim_hide(RRDSET *st, const char *id); -extern time_t rrd_stats_first_entry_t(RRD_STATS *st); +extern void rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value); +extern int rrddim_set(RRDSET *st, const char *id, collected_number value); #endif /* NETDATA_RRD_H */ diff --git a/src/rrd2json.c b/src/rrd2json.c index cb00fce0..12bb5dca 100755 --- a/src/rrd2json.c +++ b/src/rrd2json.c @@ -8,7 +8,7 @@ #define HOSTNAME_MAX 1024 char *hostname = "unknown"; -unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer *wb) +unsigned long rrd_stats_one_json(RRDSET *st, char *options, struct web_buffer *wb) { time_t now = time(NULL); web_buffer_increase(wb, 16384); @@ -48,10 +48,10 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer , st->enabled , st->units , st->name, options?options:"" - , chart_type_name(st->chart_type) + , rrdset_type_name(st->chart_type) , st->counter , st->entries - , rrd_stats_first_entry_t(st) + , rrdset_first_entry_t(st) , st->current_entry , st->last_updated.tv_sec , now - (st->last_updated.tv_sec > now) ? now : st->last_updated.tv_sec @@ -64,7 +64,7 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer unsigned long memory = st->memsize; - RRD_DIMENSION *rd; + RRDDIM *rd; for(rd = st->dimensions; rd ; rd = rd->next) { memory += rd->memsize; @@ -88,7 +88,7 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer , rd->name , rd->entries , rd->hidden - , algorithm_name(rd->algorithm) + , rrddim_algorithm_name(rd->algorithm) , rd->multiplier , rd->divisor , rd->last_collected_time.tv_sec @@ -115,7 +115,7 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer #define RRD_GRAPH_JSON_HEADER "{\n\t\"charts\": [\n" #define RRD_GRAPH_JSON_FOOTER "\n\t]\n}\n" -void rrd_stats_graph_json(RRD_STATS *st, char *options, struct web_buffer *wb) +void rrd_stats_graph_json(RRDSET *st, char *options, struct web_buffer *wb) { web_buffer_increase(wb, 16384); @@ -130,19 +130,19 @@ void rrd_stats_all_json(struct web_buffer *wb) unsigned long memory = 0; long c; - RRD_STATS *st; + RRDSET *st; web_buffer_printf(wb, RRD_GRAPH_JSON_HEADER); - pthread_rwlock_rdlock(&root_rwlock); - for(st = root, c = 0; st ; st = st->next) { + pthread_rwlock_rdlock(&rrdset_root_rwlock); + for(st = rrdset_root, c = 0; st ; st = st->next) { if(st->enabled) { if(c) web_buffer_printf(wb, "%s", ",\n"); memory += rrd_stats_one_json(st, NULL, wb); c++; } } - pthread_rwlock_unlock(&root_rwlock); + pthread_rwlock_unlock(&rrdset_root_rwlock); web_buffer_printf(wb, "\n\t],\n" "\t\"hostname\": \"%s\",\n" @@ -151,13 +151,13 @@ void rrd_stats_all_json(struct web_buffer *wb) "\t\"memory\": %lu\n" "}\n" , hostname - , update_every - , save_history + , rrd_update_every + , rrd_default_history_entries , memory ); } -unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero) +unsigned long rrd_stats_json(int type, RRDSET *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero) { int c; pthread_rwlock_rdlock(&st->rwlock); @@ -198,7 +198,7 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int time_t time_init = st->last_updated.tv_sec; if(before == 0 || before > time_init) before = time_init; - if(after == 0) after = rrd_stats_first_entry_t(st); + if(after == 0) after = rrdset_first_entry_t(st); // --- @@ -212,7 +212,7 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int // find how many dimensions we have int dimensions = 0; - RRD_DIMENSION *rd; + RRDDIM *rd; for( rd = st->dimensions ; rd ; rd = rd->next) dimensions++; if(!dimensions) { pthread_rwlock_unlock(&st->rwlock); @@ -238,9 +238,9 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int if(st->debug) { debug(D_RRD_STATS, "%s first_entry_t = %lu, last_entry_t = %lu, duration = %lu, after = %lu, before = %lu, duration = %lu, entries_to_show = %lu, group = %lu, max_entries = %ld" , st->id - , rrd_stats_first_entry_t(st) + , rrdset_first_entry_t(st) , st->last_updated.tv_sec - , st->last_updated.tv_sec - rrd_stats_first_entry_t(st) + , st->last_updated.tv_sec - rrdset_first_entry_t(st) , after , before , before - after diff --git a/src/rrd2json.h b/src/rrd2json.h index 1fd33921..69dfabbe 100755 --- a/src/rrd2json.h +++ b/src/rrd2json.h @@ -18,12 +18,12 @@ extern char *hostname; #define GROUP_MAX 1 #define GROUP_SUM 2 -extern unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer *wb); +extern unsigned long rrd_stats_one_json(RRDSET *st, char *options, struct web_buffer *wb); -extern void rrd_stats_graph_json(RRD_STATS *st, char *options, struct web_buffer *wb); +extern void rrd_stats_graph_json(RRDSET *st, char *options, struct web_buffer *wb); extern void rrd_stats_all_json(struct web_buffer *wb); -extern unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero); +extern unsigned long rrd_stats_json(int type, RRDSET *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero); #endif /* NETDATA_RRD2JSON_H */ diff --git a/src/unit_test.c b/src/unit_test.c index 17edeec4..f5ccc8fe 100755 --- a/src/unit_test.c +++ b/src/unit_test.c @@ -246,32 +246,32 @@ int unit_test(long delay, long shift) snprintf(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift); debug_flags = 0xffffffff; - memory_mode = NETDATA_MEMORY_MODE_RAM; - update_every = 1; + rrd_memory_mode = RRD_MEMORY_MODE_RAM; + rrd_update_every = 1; int do_abs = 1; int do_inc = 1; int do_abst = 1; int do_absi = 1; - RRD_STATS *st = rrd_stats_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, CHART_TYPE_LINE); + RRDSET *st = rrdset_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, RRDSET_TYPE_LINE); st->debug = 1; - RRD_DIMENSION *rdabs = NULL; - RRD_DIMENSION *rdinc = NULL; - RRD_DIMENSION *rdabst = NULL; - RRD_DIMENSION *rdabsi = NULL; + RRDDIM *rdabs = NULL; + RRDDIM *rdinc = NULL; + RRDDIM *rdabst = NULL; + RRDDIM *rdabsi = NULL; - if(do_abs) rdabs = rrd_stats_dimension_add(st, "absolute", "absolute", 1, 1, RRD_DIMENSION_ABSOLUTE); - if(do_inc) rdinc = rrd_stats_dimension_add(st, "incremental", "incremental", 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL); - if(do_abst) rdabst = rrd_stats_dimension_add(st, "percentage-of-absolute-row", "percentage-of-absolute-row", 1, 1, RRD_DIMENSION_PCENT_OVER_ROW_TOTAL); - if(do_absi) rdabsi = rrd_stats_dimension_add(st, "percentage-of-incremental-row", "percentage-of-incremental-row", 1, 1, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL); + if(do_abs) rdabs = rrddim_add(st, "absolute", "absolute", 1, 1, RRDDIM_ABSOLUTE); + if(do_inc) rdinc = rrddim_add(st, "incremental", "incremental", 1, 1 * rrd_update_every, RRDDIM_INCREMENTAL); + if(do_abst) rdabst = rrddim_add(st, "percentage-of-absolute-row", "percentage-of-absolute-row", 1, 1, RRDDIM_PCENT_OVER_ROW_TOTAL); + if(do_absi) rdabsi = rrddim_add(st, "percentage-of-incremental-row", "percentage-of-incremental-row", 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL); long increment = 1000; collected_number i = 0; unsigned long c, dimensions = 0; - RRD_DIMENSION *rd; + RRDDIM *rd; for(rd = st->dimensions ; rd ; rd = rd->next) dimensions++; for(c = 0; c < 20 ;c++) { @@ -279,12 +279,12 @@ int unit_test(long delay, long shift) fprintf(stderr, "\n\nLOOP = %lu, DELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", c, delay, i); if(c) { - rrd_stats_next_usec(st, delay); + rrdset_next_usec(st, delay); } - if(do_abs) rrd_stats_dimension_set(st, "absolute", i); - if(do_inc) rrd_stats_dimension_set(st, "incremental", i); - if(do_abst) rrd_stats_dimension_set(st, "percentage-of-absolute-row", i); - if(do_absi) rrd_stats_dimension_set(st, "percentage-of-incremental-row", i); + if(do_abs) rrddim_set(st, "absolute", i); + if(do_inc) rrddim_set(st, "incremental", i); + if(do_abst) rrddim_set(st, "percentage-of-absolute-row", i); + if(do_absi) rrddim_set(st, "percentage-of-incremental-row", i); if(!c) { gettimeofday(&st->last_collected_time, NULL); @@ -294,7 +294,7 @@ int unit_test(long delay, long shift) // prevent it from deleting the dimensions for(rd = st->dimensions ; rd ; rd = rd->next) rd->last_collected_time.tv_sec = st->last_collected_time.tv_sec; - rrd_stats_done(st); + rrdset_done(st); } unsigned long oincrement = increment; diff --git a/src/web_server.c b/src/web_server.c index c7c4b3ec..68ababbc 100755 --- a/src/web_server.c +++ b/src/web_server.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "common.h" #include "log.h" @@ -26,6 +27,23 @@ int listen_fd = -1; int listen_port = LISTEN_PORT; +static void log_allocations(void) +{ + static int mem = 0; + + struct mallinfo mi; + + mi = mallinfo(); + if(mi.uordblks > mem) { + int clients = 0; + struct web_client *w; + for(w = web_clients; w ; w = w->next) clients++; + + info("Allocated memory increased from %d to %d (increased by %d bytes). There are %d web clients connected.", mem, mi.uordblks, mi.uordblks - mem, clients); + mem = mi.uordblks; + } +} + int create_listen_socket(int port) { int sock=-1; @@ -257,8 +275,8 @@ int web_client_data_request(struct web_client *w, char *url, int datasource_type debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok); // do we have such a data set? - RRD_STATS *st = rrd_stats_find_byname(tok); - if(!st) st = rrd_stats_find(tok); + RRDSET *st = rrdset_find_byname(tok); + if(!st) st = rrdset_find(tok); if(!st) { // we don't have it // try to send a file with that name @@ -270,7 +288,7 @@ int web_client_data_request(struct web_client *w, char *url, int datasource_type debug(D_WEB_CLIENT, "%llu: Found RRD data with name '%s'.", w->id, tok); // how many entries does the client want? - long lines = save_history; + long lines = rrd_default_history_entries; long group_count = 1; time_t after = 0, before = 0; int group_method = GROUP_AVERAGE; @@ -472,7 +490,7 @@ void web_client_process(struct web_client *w) debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok); // do we have such a data set? - RRD_STATS *st = rrd_stats_find_byname(tok); + RRDSET *st = rrdset_find_byname(tok); if(!st) { // we don't have it // try to send a file with that name @@ -495,7 +513,7 @@ void web_client_process(struct web_client *w) debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok); // do we have such a data set? - RRD_STATS *st = rrd_stats_find_byname(tok); + RRDSET *st = rrdset_find_byname(tok); if(!st) { code = 404; web_buffer_printf(w->data, "Chart %s is not found.\r\n", tok); @@ -528,7 +546,7 @@ void web_client_process(struct web_client *w) debug(D_WEB_CLIENT_ACCESS, "%llu: Sending list of RRD_STATS...", w->id); w->data->bytes = 0; - RRD_STATS *st = root; + RRDSET *st = rrdset_root; for ( ; st ; st = st->next ) web_buffer_printf(w->data, "%s\n", st->name);