From: Sebastian Harl Date: Fri, 15 May 2015 20:53:44 +0000 (+0200) Subject: Merged branch 'master' of git://git.tokkee.org/sysdb. X-Git-Tag: sysdb-0.8.0~94 X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=commitdiff_plain;h=c2f7813397319e930c81c4f64b213bec64549167;hp=904ffbab72cd80022f07bdf3f62c102d97cdc06d Merged branch 'master' of git://git.tokkee.org/sysdb. --- diff --git a/src/core/plugin.c b/src/core/plugin.c index bf0bdb3..f581eb1 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -1386,7 +1386,7 @@ sdb_plugin_store_metric(const char *hostname, const char *name, if ((! hostname) || (! name)) return -1; - if ((! store->type) || (! store->id)) + if (store && ((! store->type) || (! store->id))) store = NULL; iter = sdb_llist_get_iter(writer_list); diff --git a/src/core/store.c b/src/core/store.c index a1cf8f6..eb58ad8 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -423,6 +423,37 @@ store_attr(sdb_store_obj_t *parent, sdb_avltree_t *attributes, return status; } /* store_attr */ +static int +store_metric_store(sdb_metric_t *metric, sdb_metric_store_t *store) +{ + char *type = metric->store.type; + char *id = metric->store.id; + + if ((! metric->store.type) || strcasecmp(metric->store.type, store->type)) { + if (! (type = strdup(store->type))) + return -1; + } + if ((! metric->store.id) || strcasecmp(metric->store.id, store->id)) { + if (! (id = strdup(store->id))) { + if (type != metric->store.type) + free(type); + return -1; + } + } + + if (type != metric->store.type) { + if (metric->store.type) + free(metric->store.type); + metric->store.type = type; + } + if (id != metric->store.id) { + if (metric->store.id) + free(metric->store.id); + metric->store.id = id; + } + return 0; +} /* store_metric_store */ + /* The host_lock has to be acquired before calling this function. */ static sdb_avltree_t * get_host_children(sdb_host_t *host, int type) @@ -609,6 +640,7 @@ sdb_store_service(const char *hostname, const char *name, { sdb_host_t *host; sdb_avltree_t *services; + sdb_data_t d; int status = 0; @@ -631,8 +663,17 @@ sdb_store_service(const char *hostname, const char *name, sdb_object_deref(SDB_OBJ(host)); pthread_rwlock_unlock(&host_lock); + if (status) + return status; + if (sdb_plugin_store_service(hostname, name, last_update)) status = -1; + + /* record the hostname as an attribute */ + d.type = SDB_TYPE_STRING; + d.data.string = SDB_OBJ(host)->name; + if (sdb_store_service_attr(hostname, name, "hostname", &d, last_update)) + status = -1; return status; } /* sdb_store_service */ @@ -687,6 +728,7 @@ sdb_store_metric(const char *hostname, const char *name, sdb_store_obj_t *obj = NULL; sdb_host_t *host; sdb_metric_t *metric; + sdb_data_t d; sdb_avltree_t *metrics; @@ -716,7 +758,7 @@ sdb_store_metric(const char *hostname, const char *name, name, last_update, &obj); sdb_object_deref(SDB_OBJ(host)); - if (status || (! store)) { + if (status) { pthread_rwlock_unlock(&host_lock); return status; } @@ -724,29 +766,19 @@ sdb_store_metric(const char *hostname, const char *name, assert(obj); metric = METRIC(obj); - if ((! metric->store.type) || strcasecmp(metric->store.type, store->type)) { - if (metric->store.type) - free(metric->store.type); - metric->store.type = strdup(store->type); - } - if ((! metric->store.id) || strcasecmp(metric->store.id, store->id)) { - if (metric->store.id) - free(metric->store.id); - metric->store.id = strdup(store->id); - } - - if ((! metric->store.type) || (! metric->store.id)) { - if (metric->store.type) - free(metric->store.type); - if (metric->store.id) - free(metric->store.id); - metric->store.type = metric->store.id = NULL; - status = -1; - } + if (store) + if (store_metric_store(metric, store)) + status = -1; pthread_rwlock_unlock(&host_lock); if (sdb_plugin_store_metric(hostname, name, store, last_update)) status = -1; + + /* record the hostname as an attribute */ + d.type = SDB_TYPE_STRING; + d.data.string = SDB_OBJ(host)->name; + if (sdb_store_metric_attr(hostname, name, "hostname", &d, last_update)) + status = -1; return status; } /* sdb_store_metric */ diff --git a/t/unit/core/store_expr_test.c b/t/unit/core/store_expr_test.c index 5de5fdd..48c128c 100644 --- a/t/unit/core/store_expr_test.c +++ b/t/unit/core/store_expr_test.c @@ -309,23 +309,23 @@ struct { { SDB_OBJECT_INIT, TYPED_EXPR, -1, &namer, NULL, ATTRS }, true, "a", SDB_SERVICE, "s1", NULL, { + { SDB_TYPE_STRING, { .string = "hostname" } }, { SDB_TYPE_STRING, { .string = "k1" } }, { 0 }, { 0 }, { 0 }, - { 0 }, - }, 1, + }, 2, }, { { SDB_OBJECT_INIT, TYPED_EXPR, -1, &namer, NULL, ATTRS }, true, "a", SDB_SERVICE, "s1", "age >= 0s", { + { SDB_TYPE_STRING, { .string = "hostname" } }, { SDB_TYPE_STRING, { .string = "k1" } }, { 0 }, { 0 }, { 0 }, - { 0 }, - }, 1, + }, 2, }, { { SDB_OBJECT_INIT, TYPED_EXPR, -1, &namer, NULL, ATTRS }, true, @@ -378,23 +378,23 @@ struct { { SDB_OBJECT_INIT, TYPED_EXPR, -1, &namer, NULL, ATTRS }, true, "b", SDB_METRIC, "m2", NULL, { + { SDB_TYPE_STRING, { .string = "hostname" } }, { SDB_TYPE_STRING, { .string = "k1" } }, { SDB_TYPE_STRING, { .string = "k2" } }, { 0 }, { 0 }, - { 0 }, - }, 2, + }, 3, }, { { SDB_OBJECT_INIT, TYPED_EXPR, -1, &namer, NULL, ATTRS }, true, "b", SDB_METRIC, "m2", "age >= 0s", { + { SDB_TYPE_STRING, { .string = "hostname" } }, { SDB_TYPE_STRING, { .string = "k1" } }, { SDB_TYPE_STRING, { .string = "k2" } }, { 0 }, { 0 }, - { 0 }, - }, 2, + }, 3, }, { { SDB_OBJECT_INIT, TYPED_EXPR, -1, &namer, NULL, ATTRS }, true, diff --git a/t/unit/core/store_json_test.c b/t/unit/core/store_json_test.c index ff6a18e..704ad06 100644 --- a/t/unit/core/store_json_test.c +++ b/t/unit/core/store_json_test.c @@ -124,8 +124,7 @@ verify_json_output(sdb_strbuf_t *buf, const char *expected) struct { struct { - sdb_store_matcher_t *(*m)(sdb_store_expr_t *, - sdb_store_expr_t *); + sdb_store_matcher_t *(*m)(sdb_store_expr_t *, sdb_store_expr_t *); int field; sdb_data_t value; } filter; @@ -155,6 +154,9 @@ struct { "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}," "{\"name\": \"k3\", \"value\": 42, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": []}" @@ -162,7 +164,12 @@ struct { "{\"name\": \"m2\", " "\"timeseries\": false, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}" + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}" "]}," "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " @@ -170,16 +177,29 @@ struct { "{\"name\": \"m1\", " "\"timeseries\": false, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}" + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}" "], " "\"services\": [" "{\"name\": \"s1\", " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}," + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}," "{\"name\": \"s2\", " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}," "{\"name\": \"k1\", \"value\": 123, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": []}," @@ -215,6 +235,9 @@ struct { "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}," "{\"name\": \"k1\", \"value\": 123, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": []}" @@ -236,7 +259,12 @@ struct { "{\"name\": \"m2\", " "\"timeseries\": false, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}" + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}" "]}" "]" }, { { sdb_store_ge_matcher, SDB_FIELD_LAST_UPDATE, @@ -259,11 +287,19 @@ struct { "\"services\": [" "{\"name\": \"s1\", " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}," + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}," "{\"name\": \"s2\", " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}," "{\"name\": \"k1\", \"value\": 123, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": []}," @@ -298,6 +334,9 @@ struct { "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}," "{\"name\": \"k1\", \"value\": 123, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": []}" @@ -319,6 +358,9 @@ struct { "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}," "{\"name\": \"k3\", \"value\": 42, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": []}" @@ -326,7 +368,12 @@ struct { "{\"name\": \"m2\", " "\"timeseries\": false, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}" + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}" "]}," "{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " "\"update_interval\": \"0s\", \"backends\": [], " @@ -334,7 +381,12 @@ struct { "{\"name\": \"m1\", " "\"timeseries\": false, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}" + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h2\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}" "]}" "]" }, { { NULL, 0, SDB_DATA_INIT }, @@ -371,7 +423,12 @@ struct { "{\"name\": \"m2\", " "\"timeseries\": false, " "\"last_update\": \"1970-01-01 00:00:00 +0000\", " - "\"update_interval\": \"0s\", \"backends\": []}" + "\"update_interval\": \"0s\", \"backends\": [], " + "\"attributes\": [" + "{\"name\": \"hostname\", \"value\": \"h1\", " + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " + "\"update_interval\": \"0s\", \"backends\": []}" + "]}" "]}" "]" }, { { sdb_store_lt_matcher, SDB_FIELD_LAST_UPDATE, diff --git a/t/unit/frontend/query_test.c b/t/unit/frontend/query_test.c index 3e43c0a..7e15502 100644 --- a/t/unit/frontend/query_test.c +++ b/t/unit/frontend/query_test.c @@ -91,12 +91,19 @@ populate(void) "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h1\", " \ + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}," \ "{\"name\": \"k3\", \"value\": 42, " \ "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}]}," \ "{\"name\": \"m2\", \"timeseries\": false, " \ "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ - "\"update_interval\": \"0s\", \"backends\": []}]}" + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h1\", " \ + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}]}" #define HOST_H1_ARRAY "["HOST_H1"]" #define HOST_H1_LISTING \ "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " \ @@ -110,7 +117,11 @@ populate(void) "\"update_interval\": \"0s\", \"backends\": [], " \ "\"services\": [" \ "{\"name\": \"s1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " \ - "\"update_interval\": \"0s\", \"backends\": []}]}" + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}]}" #define SERVICE_H2_S1_ARRAY "["SERVICE_H2_S1"]" #define SERVICE_H2_S12_LISTING \ "[{\"name\": \"h2\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " \ @@ -129,6 +140,9 @@ populate(void) "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h1\", " \ + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}," \ "{\"name\": \"k3\", \"value\": 42, " \ "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": []}]}]}" @@ -139,7 +153,11 @@ populate(void) "\"metrics\": [" \ "{\"name\": \"m1\", \"timeseries\": false, " \ "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ - "\"update_interval\": \"0s\", \"backends\": []}]}]" + "\"update_interval\": \"0s\", \"backends\": [], " \ + "\"attributes\": [" \ + "{\"name\": \"hostname\", \"value\": \"h2\", " \ + "\"last_update\": \"1970-01-01 00:00:00 +0000\", " \ + "\"update_interval\": \"0s\", \"backends\": []}]}]}]" #define METRIC_H12_M12_LISTING \ "[{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " \ "\"update_interval\": \"0s\", \"backends\": [], " \ @@ -294,19 +312,19 @@ static struct { }, { "FETCH host 'h1'", - 0, SDB_CONNECTION_DATA, 851, SDB_CONNECTION_FETCH, HOST_H1, + 0, SDB_CONNECTION_DATA, 1110, SDB_CONNECTION_FETCH, HOST_H1, }, { "LOOKUP hosts MATCHING name = 'h1'", - 0, SDB_CONNECTION_DATA, 853, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, + 0, SDB_CONNECTION_DATA, 1112, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, }, { "FETCH host 'h1' FILTER age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 851, SDB_CONNECTION_FETCH, HOST_H1, + 0, SDB_CONNECTION_DATA, 1110, SDB_CONNECTION_FETCH, HOST_H1, }, { "LOOKUP hosts MATCHING name = 'h1' FILTER age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 853, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, + 0, SDB_CONNECTION_DATA, 1112, SDB_CONNECTION_LOOKUP, HOST_H1_ARRAY, }, { "FETCH host 'h1' FILTER age < 0s", /* never matches */ @@ -347,19 +365,19 @@ static struct { }, { "FETCH service 'h2'.'s1'", - 0, SDB_CONNECTION_DATA, 218, SDB_CONNECTION_FETCH, SERVICE_H2_S1, + 0, SDB_CONNECTION_DATA, 356, SDB_CONNECTION_FETCH, SERVICE_H2_S1, }, { "LOOKUP services MATCHING name = 's1'", - 0, SDB_CONNECTION_DATA, 220, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, + 0, SDB_CONNECTION_DATA, 358, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, }, { "FETCH service 'h2'.'s1' FILTER age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 218, SDB_CONNECTION_FETCH, SERVICE_H2_S1, + 0, SDB_CONNECTION_DATA, 356, SDB_CONNECTION_FETCH, SERVICE_H2_S1, }, { "LOOKUP services MATCHING name = 's1' FILTER age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 220, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, + 0, SDB_CONNECTION_DATA, 358, SDB_CONNECTION_LOOKUP, SERVICE_H2_S1_ARRAY, }, { "FETCH service 'h2'.'s1' FILTER age < 0s", /* never matches */ @@ -404,19 +422,19 @@ static struct { }, { "FETCH metric 'h1'.'m1'", - 0, SDB_CONNECTION_DATA, 368, SDB_CONNECTION_FETCH, METRIC_H1_M1, + 0, SDB_CONNECTION_DATA, 489, SDB_CONNECTION_FETCH, METRIC_H1_M1, }, { "LOOKUP metrics MATCHING name = 'm1'", - 0, SDB_CONNECTION_DATA, 605, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, + 0, SDB_CONNECTION_DATA, 864, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, }, { "FETCH metric 'h1'.'m1' FILTER age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 368, SDB_CONNECTION_FETCH, METRIC_H1_M1, + 0, SDB_CONNECTION_DATA, 489, SDB_CONNECTION_FETCH, METRIC_H1_M1, }, { "LOOKUP metrics MATCHING name = 'm1' FILTER age >= 0s", /* always matches */ - 0, SDB_CONNECTION_DATA, 605, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, + 0, SDB_CONNECTION_DATA, 864, SDB_CONNECTION_LOOKUP, METRIC_H12_M1_ARRAY, }, { "FETCH metric 'h1'.'m1' FILTER age < 0s", /* never matches */