Code

store: Store a service/metric's parent hostname as an attribute.
authorSebastian Harl <sh@tokkee.org>
Thu, 14 May 2015 22:43:12 +0000 (00:43 +0200)
committerSebastian Harl <sh@tokkee.org>
Thu, 14 May 2015 22:43:12 +0000 (00:43 +0200)
src/core/store.c
t/unit/core/store_expr_test.c
t/unit/core/store_json_test.c
t/unit/frontend/query_test.c

index cb3189d72245690941c6d010a41dfa6d5da7f927..ea30da90116d9925cd148e39f7577e346503ba42 100644 (file)
@@ -640,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;
 
@@ -667,6 +668,12 @@ sdb_store_service(const char *hostname, const char *name,
 
        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 */
 
@@ -721,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;
 
@@ -765,6 +773,12 @@ sdb_store_metric(const char *hostname, const char *name,
 
        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 */
 
index 5de5fdd0b4e877b1501de2662eb0e22fc91d4d5f..48c128c0573b5943e2fdfec200958be71e51bb64 100644 (file)
@@ -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,
index ff6a18edc3ae8f095988129231430b893a0a5b03..704ad067fc52d9fba04a8ea5bbe901a3013583c6 100644 (file)
@@ -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,
index 0f25493b397aa8991179553a27644c11a88a8d51..73f3042ee9516a8605346393ab4ca456cdb2dd5c 100644 (file)
@@ -91,19 +91,30 @@ 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 SERVICE_H2_S1 \
        "{\"name\": \"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\": []}]}]}"
 
 #define METRIC_H1_M1 \
        "{\"name\": \"h1\", \"last_update\": \"1970-01-01 00:00:00 +0000\", " \
@@ -113,6 +124,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\": []}]}]}"
@@ -239,11 +253,11 @@ static struct {
        /* hosts */
        {
                SDB_HOST, "h1", NULL, NULL,
-               0, SDB_CONNECTION_DATA, 851, HOST_H1,
+               0, SDB_CONNECTION_DATA, 1110, HOST_H1,
        },
        {
                SDB_HOST, "h1", NULL, "age >= 0s", /* always matches */
-               0, SDB_CONNECTION_DATA, 851, HOST_H1,
+               0, SDB_CONNECTION_DATA, 1110, HOST_H1,
        },
        {
                SDB_HOST, "h1", NULL, "age < 0s", /* never matches */
@@ -260,11 +274,11 @@ static struct {
        /* services */
        {
                SDB_SERVICE, "h2", "s1", NULL,
-               0, SDB_CONNECTION_DATA, 218, SERVICE_H2_S1,
+               0, SDB_CONNECTION_DATA, 356, SERVICE_H2_S1,
        },
        {
                SDB_SERVICE, "h2", "s1", "age >= 0s", /* always matches */
-               0, SDB_CONNECTION_DATA, 218, SERVICE_H2_S1,
+               0, SDB_CONNECTION_DATA, 356, SERVICE_H2_S1,
        },
        {
                SDB_SERVICE, "h2", "s1", "age < 0s", /* never matches */
@@ -289,11 +303,11 @@ static struct {
        /* metrics */
        {
                SDB_METRIC, "h1", "m1", NULL,
-               0, SDB_CONNECTION_DATA, 368, METRIC_H1_M1,
+               0, SDB_CONNECTION_DATA, 489, METRIC_H1_M1,
        },
        {
                SDB_METRIC, "h1", "m1", "age >= 0s", /* always matches */
-               0, SDB_CONNECTION_DATA, 368, METRIC_H1_M1,
+               0, SDB_CONNECTION_DATA, 489, METRIC_H1_M1,
        },
        {
                SDB_METRIC, "h1", "m1", "age < 0s", /* never matches */