diff options
author | Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> | 2022-04-12 08:18:40 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-12 08:18:40 +0300 |
commit | fedab0d7fa6f3b42cfc6e7c65ed13a32b7b907b5 (patch) | |
tree | 97feefebfb4aa91227476427b58d16d46f16c623 /database | |
parent | d5ad2681bb5ce1456ea5caa9b956617b36c2bd6a (diff) |
Add a chart label filter parameter in context data queries (#12652)
* Add function to filter chart labels
* Add new parameter to filter chart labels on context queries
* Change swagger
* Better formatting for swagger
Diffstat (limited to 'database')
-rw-r--r-- | database/rrd.h | 1 | ||||
-rw-r--r-- | database/rrdset.c | 36 |
2 files changed, 37 insertions, 0 deletions
diff --git a/database/rrd.h b/database/rrd.h index a305d8b4d3..071e1d0389 100644 --- a/database/rrd.h +++ b/database/rrd.h @@ -240,6 +240,7 @@ extern void rrdset_add_label_to_new_list(RRDSET *st, char *key, char *value, LAB extern void rrdset_finalize_labels(RRDSET *st); extern void rrdset_update_labels(RRDSET *st, struct label *labels); extern int rrdset_contains_label_keylist(RRDSET *st, char *key); +extern int rrdset_matches_label_keys(RRDSET *st, char *key, char *words[], uint32_t *hash_key_list, int *word_count, int size); extern struct label *rrdset_lookup_label_key(RRDSET *st, char *key, uint32_t key_hash); // ---------------------------------------------------------------------------- diff --git a/database/rrdset.c b/database/rrdset.c index 846b40d8ac..f8e471be7e 100644 --- a/database/rrdset.c +++ b/database/rrdset.c @@ -2043,3 +2043,39 @@ struct label *rrdset_lookup_label_key(RRDSET *st, char *key, uint32_t key_hash) } return ret; } + +static inline int k8s_space(char c) { + switch(c) { + case ':': + case ',': + return 1; + default: + return 0; + } +} + +int rrdset_matches_label_keys(RRDSET *st, char *keylist, char *words[], uint32_t *hash_key_list, int *word_count, int size) +{ + struct label_index *labels = &st->state->labels; + + if (!labels->head) + return 0; + + struct label *one_label; + + if (!*word_count) { + *word_count = quoted_strings_splitter(keylist, words, size, k8s_space, NULL, NULL, 0); + for (int i = 0; i < *word_count - 1; i += 2) { + hash_key_list[i] = simple_hash(words[i]); + } + } + + int ret = 1; + netdata_rwlock_rdlock(&labels->labels_rwlock); + for (int i = 0; ret && i < *word_count - 1; i += 2) { + one_label = label_list_lookup_key(labels->head, words[i], hash_key_list[i]); + ret = (one_label && !strcmp(one_label->value, words[i + 1])); + } + netdata_rwlock_unlock(&labels->labels_rwlock); + return ret; +} |