]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
modules/stats: split stats.list() into sub-objects
authorOto Šťáva <oto.stava@nic.cz>
Thu, 21 Mar 2024 10:49:05 +0000 (11:49 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Mon, 15 Apr 2024 14:28:37 +0000 (16:28 +0200)
modules/stats/stats.c

index ca3a932c54959ecb094093b5f162639475087d6d..968b46cba44cb978ea6476a2c822012d02a44b53 100644 (file)
@@ -57,10 +57,18 @@ enum const_metric {
 };
 struct const_metric_elm {
        const char *key;
+       const char *sup_key;
+       const char *sub_key;
        size_t val;
 };
 static struct const_metric_elm const_metrics[] = {
-       #define X(a,b) [metric_ ## a ## _ ## b] = { #a "." #b, 0 },
+       #define X(a,b) \
+               [metric_ ## a ## _ ## b] = { \
+                       .key = #a "." #b, \
+                       .sup_key = #a, \
+                       .sub_key = #b, \
+                       .val = 0 \
+               },
        CONST_METRICS(X)
        #undef X
 };
@@ -376,8 +384,15 @@ static char* stats_list(void *env, struct kr_module *module, const char *args)
        size_t args_len = args ? strlen(args) : 0;
        for (unsigned i = 0; i < metric_const_end; ++i) {
                struct const_metric_elm *elm = &const_metrics[i];
-               if (!args || strncmp(elm->key, args, args_len) == 0) {
-                       json_append_member(root, elm->key, json_mknumber(elm->val));
+               if (!args || strcmp(elm->sup_key, args) == 0) {
+                       JsonNode *sup = json_find_member(root, elm->sup_key);
+                       if (!sup) {
+                               sup = json_mkobject();
+                               json_append_member(root, elm->sup_key, sup);
+                       }
+                       if (kr_fails_assert(sup))
+                               break;
+                       json_append_member(sup, elm->sub_key, json_mknumber(elm->val));
                }
        }
        struct list_entry_context ctx = {