]> arthur.barton.de Git - netdata.git/commitdiff
memory mode and health configuration per host
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sat, 18 Feb 2017 16:06:32 +0000 (18:06 +0200)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Tue, 21 Feb 2017 23:00:22 +0000 (01:00 +0200)
src/health.c
src/health.h
src/health_config.c
src/health_json.c
src/main.c
src/rrd.c
src/rrd.h
src/rrddim.c
src/rrdhost.c
src/rrdset.c
src/unit_test.c

index 0ef6f718bcbe48f364878bb58b0bbd964b3875c8..ca1f1d18e1e1a1f8922e6cf2a99d3905de7943f4 100644 (file)
@@ -3,7 +3,7 @@
 
 #define RRDVAR_MAX_LENGTH 1024
 
-int health_enabled = 1;
+int default_localhost_health_enabled = 1;
 
 // ----------------------------------------------------------------------------
 // RRDVAR management
@@ -1075,7 +1075,7 @@ inline char *health_config_dir(void) {
 void health_init(void) {
     debug(D_HEALTH, "Health configuration initializing");
 
-    if(!(health_enabled = config_get_boolean("health", "enabled", 1))) {
+    if(!(default_localhost_health_enabled = config_get_boolean("health", "enabled", 1))) {
         debug(D_HEALTH, "Health is disabled.");
         return;
     }
@@ -1098,11 +1098,6 @@ inline void health_free_host_nolock(RRDHOST *host) {
 }
 
 void health_reload_host(RRDHOST *host) {
-    if(!health_enabled) {
-        error("Health reload is requested, but health is not enabled.");
-        return;
-    }
-
     char *path = health_config_dir();
 
     // free all running alarms
@@ -1406,7 +1401,7 @@ void *health_main(void *ptr) {
     BUFFER *wb = buffer_create(100);
 
     unsigned int loop = 0;
-    while(health_enabled && !netdata_exit) {
+    while(!netdata_exit) {
         loop++;
         debug(D_HEALTH, "Health monitoring iteration no %u started", loop);
 
@@ -1420,6 +1415,8 @@ void *health_main(void *ptr) {
 
         RRDHOST *host;
         for(host = localhost; host ; host = host->next) {
+            if(unlikely(!host->health_enabled)) continue;
+
             rrdhost_rdlock(host);
 
             // the first loop is to lookup values from the db
index c19f1f413a34e23116c93b12a8ee7c38c71cfb48..68637f5e5386cc87374e18da4b945987e1a87efe 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef NETDATA_HEALTH_H
 #define NETDATA_HEALTH_H
 
-extern int health_enabled;
+extern int default_localhost_health_enabled;
 
 extern int rrdvar_compare(void *a, void *b);
 
index 95d3a5798f1bb047f9b1fbf01d1a66d6e82ab2b7..ad954cbe1182a77eab207073b8c32951aa6d32cc 100644 (file)
@@ -828,6 +828,8 @@ int health_readfile(RRDHOST *host, const char *path, const char *filename) {
 }
 
 void health_readdir(RRDHOST *host, const char *path) {
+    if(!host->health_enabled) return;
+
     size_t pathlen = strlen(path);
 
     debug(D_HEALTH, "Health configuration reading directory '%s'", path);
index 0af68d3530af2e55acc088c32258d3f2b11562b5..650d40b4cedc949c8f1c2e6b02f43ab1d2d1f314 100644 (file)
@@ -227,7 +227,7 @@ void health_alarms2json(RRDHOST *host, BUFFER *wb, int all) {
                     "\n\t\"alarms\": {\n",
             host->hostname,
             (host->health_log.next_log_id > 0)?(host->health_log.next_log_id - 1):0,
-            health_enabled?"true":"false",
+            host->health_enabled?"true":"false",
             (unsigned long)now_realtime_sec());
 
     RRDCALC *rc;
index f5e53dde80aefffc69794af036896acd72513701..1100b393e6b835662934ed18d77f153c2026393f 100644 (file)
@@ -639,7 +639,7 @@ int main(int argc, char **argv) {
 
         // --------------------------------------------------------------------
 
-        rrd_memory_mode = rrd_memory_mode_id(config_get("global", "memory mode", rrd_memory_mode_name(rrd_memory_mode)));
+        default_localhost_rrd_memory_mode = rrd_memory_mode_id(config_get("global", "memory mode", rrd_memory_mode_name(default_localhost_rrd_memory_mode)));
 
         // --------------------------------------------------------------------
 
index dbb33ce881e171ef93a160275a52022fa26427fd..2fa50d375aea324230602e26084231c7185799da 100644 (file)
--- a/src/rrd.c
+++ b/src/rrd.c
@@ -13,7 +13,7 @@ int rrd_delete_unupdated_dimensions = 0;
 
 int rrd_update_every = UPDATE_EVERY;
 int rrd_default_history_entries = RRD_DEFAULT_HISTORY_ENTRIES;
-RRD_MEMORY_MODE rrd_memory_mode = RRD_MEMORY_MODE_SAVE;
+RRD_MEMORY_MODE default_localhost_rrd_memory_mode = RRD_MEMORY_MODE_SAVE;
 
 
 // ----------------------------------------------------------------------------
@@ -113,7 +113,7 @@ const char *rrdset_type_name(RRDSET_TYPE chart_type) {
 // ----------------------------------------------------------------------------
 // RRD - cache directory
 
-char *rrdset_cache_dir(const char *id) {
+char *rrdset_cache_dir(RRDHOST *host, const char *id) {
     char *ret = NULL;
 
     char b[FILENAME_MAX + 1];
@@ -123,7 +123,7 @@ char *rrdset_cache_dir(const char *id) {
     snprintfz(n, FILENAME_MAX, "%s/%s", netdata_configured_cache_dir, b);
     ret = config_get(id, "cache directory", n);
 
-    if(rrd_memory_mode == RRD_MEMORY_MODE_MAP || rrd_memory_mode == RRD_MEMORY_MODE_SAVE) {
+    if(host->rrd_memory_mode == RRD_MEMORY_MODE_MAP || host->rrd_memory_mode == RRD_MEMORY_MODE_SAVE) {
         int r = mkdir(ret, 0775);
         if(r != 0 && errno != EEXIST)
             error("Cannot create directory '%s'", ret);
index cb53768887719d941f17e1907581a9773592a7ed..5ef86838a992c286e80142ae7e0985b837ab037c 100644 (file)
--- a/src/rrd.h
+++ b/src/rrd.h
@@ -47,7 +47,7 @@ typedef enum rrd_memory_mode {
 #define RRD_MEMORY_MODE_MAP_NAME "map"
 #define RRD_MEMORY_MODE_SAVE_NAME "save"
 
-RRD_MEMORY_MODE rrd_memory_mode;
+extern RRD_MEMORY_MODE default_localhost_rrd_memory_mode;
 
 extern const char *rrd_memory_mode_name(RRD_MEMORY_MODE id);
 extern RRD_MEMORY_MODE rrd_memory_mode_id(const char *name);
@@ -294,32 +294,32 @@ typedef struct rrdset RRDSET;
 // RRD HOST
 
 struct rrdhost {
-    avl avl;
+    avl avl;                                        // the index of hosts
 
-    char *hostname;
-    uint32_t hash_hostname;
+    char *hostname;                                 // the hostname of this host
+    uint32_t hash_hostname;                         // the hostname hash
 
-    char machine_guid[GUID_LEN + 1];
-    uint32_t hash_machine_guid;
+    char machine_guid[GUID_LEN + 1];                // the unique ID of this host
+    uint32_t hash_machine_guid;                     // the hash of the unique ID
 
-    uint32_t flags;
+    int health_enabled;                             // 1 when this host has health enabled
+    RRD_MEMORY_MODE rrd_memory_mode;                // the memory more for the charts of this host
 
-    RRDSET *rrdset_root;
-    pthread_rwlock_t rrdset_root_rwlock;
+    RRDSET *rrdset_root;                            // the host charts
+    pthread_rwlock_t rrdset_root_rwlock;            // lock for the host charts
 
-    avl_tree_lock rrdset_root_index;
-    avl_tree_lock rrdset_root_index_name;
+    avl_tree_lock rrdset_root_index;                // the host's charts index (by id)
+    avl_tree_lock rrdset_root_index_name;           // the host's charts index (by name)
 
-    avl_tree_lock rrdfamily_root_index;
-    avl_tree_lock variables_root_index;
+    avl_tree_lock rrdfamily_root_index;             // the host's chart families index
+    avl_tree_lock variables_root_index;             // the host's chart variables index
 
     // all RRDCALCs are primarily allocated and linked here
     // RRDCALCs may be linked to charts at any point
     // (charts may or may not exist when these are loaded)
     RRDCALC *alarms;
 
-    // alarms historical events
-    ALARM_LOG health_log;
+    ALARM_LOG health_log;                           // alarms historical events (event log)
 
     // templates of alarms
     // these are used to create alarms when charts
@@ -455,7 +455,7 @@ extern collected_number rrddim_set(RRDSET *st, const char *id, collected_number
 extern avl_tree_lock rrdhost_root_index;
 
 extern char *rrdset_strncpyz_name(char *to, const char *from, size_t length);
-extern char *rrdset_cache_dir(const char *id);
+extern char *rrdset_cache_dir(RRDHOST *host, const char *id);
 
 extern void rrdset_reset(RRDSET *st);
 
index 0d1c76d5fa6b942635a84f18c25c0b208a8100d7..d2159372be0f44825920eea6451dc74f5f990f78 100644 (file)
@@ -71,15 +71,15 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
     rrdset_strncpyz_name(filename, id, FILENAME_MAX);
     snprintfz(fullfilename, FILENAME_MAX, "%s/%s.db", st->cache_dir, filename);
 
-    if(rrd_memory_mode != RRD_MEMORY_MODE_RAM) {
-        rd = (RRDDIM *)mymmap(fullfilename, size, ((rrd_memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE), 1);
+    if(st->rrdhost->rrd_memory_mode != RRD_MEMORY_MODE_RAM) {
+        rd = (RRDDIM *)mymmap(fullfilename, size, ((st->rrdhost->rrd_memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE), 1);
         if(likely(rd)) {
             // we have a file mapped for rd
 
             rd->id = NULL;
             rd->name = NULL;
             rd->cache_filename = NULL;
-            rd->memory_mode = rrd_memory_mode;
+            rd->memory_mode = st->rrdhost->rrd_memory_mode;
             rd->flags = 0x00000000;
             rd->variables = NULL;
             rd->next = NULL;
@@ -184,7 +184,7 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
         td->next = rd;
     }
 
-    if(health_enabled) {
+    if(st->rrdhost->health_enabled) {
         rrddimvar_create(rd, RRDVAR_TYPE_CALCULATED, NULL, NULL, &rd->last_stored_value, 0);
         rrddimvar_create(rd, RRDVAR_TYPE_COLLECTED, NULL, "_raw", &rd->last_collected_value, 0);
         rrddimvar_create(rd, RRDVAR_TYPE_TIME_T, NULL, "_last_collected_t", &rd->last_collected_time.tv_sec, 0);
index 171686e08c0d6b7c8f9dd32e247d045e16e3c23f..2261ac975843fd9352f0a845dd5eaba0d4661be6 100644 (file)
@@ -54,6 +54,9 @@ RRDHOST *rrdhost_create(const char *hostname, const char *guid) {
 
     RRDHOST *host = callocz(1, sizeof(RRDHOST));
 
+    host->rrd_memory_mode = default_localhost_rrd_memory_mode;
+    host->health_enabled  = default_localhost_health_enabled;
+
     pthread_rwlock_init(&(host->rrdset_root_rwlock), NULL);
 
     rrdhost_init_hostname(host, hostname);
index 48f58ebf851f022a9bc5408a34f4d983f8852764..0b238d114a1ea1b4d85ba7ecfb88cbf517586be6 100644 (file)
@@ -242,12 +242,12 @@ RRDSET *rrdset_create(RRDHOST *host, const char *type, const char *id, const cha
     if(!enabled) entries = 5;
 
     unsigned long size = sizeof(RRDSET);
-    char *cache_dir = rrdset_cache_dir(fullid);
+    char *cache_dir = rrdset_cache_dir(host, fullid);
 
     debug(D_RRD_CALLS, "Creating RRD_STATS for '%s.%s'.", type, id);
 
     snprintfz(fullfilename, FILENAME_MAX, "%s/main.db", cache_dir);
-    if(rrd_memory_mode != RRD_MEMORY_MODE_RAM) st = (RRDSET *)mymmap(fullfilename, size, ((rrd_memory_mode == RRD_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE), 0);
+    if(host->rrd_memory_mode != RRD_MEMORY_MODE_RAM) st = (RRDSET *)mymmap(fullfilename, size, ((host->rrd_memory_mode == RRD_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE), 0);
     if(st) {
         if(strcmp(st->magic, RRDSET_MAGIC) != 0) {
             errno = 0;
@@ -291,7 +291,7 @@ RRDSET *rrdset_create(RRDHOST *host, const char *type, const char *id, const cha
         st->units = NULL;
         st->dimensions = NULL;
         st->next = NULL;
-        st->mapped = rrd_memory_mode;
+        st->mapped = host->rrd_memory_mode;
         st->variables = NULL;
         st->alarms = NULL;
         memset(&st->rwlock, 0, sizeof(pthread_rwlock_t));
@@ -372,7 +372,7 @@ RRDSET *rrdset_create(RRDHOST *host, const char *type, const char *id, const cha
     st->next = host->rrdset_root;
     host->rrdset_root = st;
 
-    if(health_enabled) {
+    if(host->health_enabled) {
         rrdsetvar_create(st, "last_collected_t", RRDVAR_TYPE_TIME_T, &st->last_collected_time.tv_sec, 0);
         rrdsetvar_create(st, "collected_total_raw", RRDVAR_TYPE_TOTAL, &st->last_collected_total, 0);
         rrdsetvar_create(st, "green", RRDVAR_TYPE_CALCULATED, &st->green, 0);
index d9becc884d526f8909669b48daecce4dfa6f025d..b7ba4affefac616b9f32ec70770927e77fd395dc 100644 (file)
@@ -884,7 +884,7 @@ int run_test(struct test *test)
 {
     fprintf(stderr, "\nRunning test '%s':\n%s\n", test->name, test->description);
 
-    rrd_memory_mode = RRD_MEMORY_MODE_RAM;
+    default_localhost_rrd_memory_mode = RRD_MEMORY_MODE_RAM;
     rrd_update_every = test->update_every;
 
     char name[101];
@@ -1091,7 +1091,7 @@ int unit_test(long delay, long shift)
     snprintfz(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift);
 
     //debug_flags = 0xffffffff;
-    rrd_memory_mode = RRD_MEMORY_MODE_RAM;
+    default_localhost_rrd_memory_mode = RRD_MEMORY_MODE_RAM;
     rrd_update_every = 1;
 
     int do_abs = 1;