diff options
author | Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com> | 2021-01-14 18:50:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-14 18:50:33 +0200 |
commit | cd443de780118c46dd8f02530086667d00948373 (patch) | |
tree | e29f21e28eb9eeb1d11539216a9e623ac225d3de /database | |
parent | de6035c543296de179e359a415664106d66c3878 (diff) |
Support multiple chart label keys in data queries (#10483)
Diffstat (limited to 'database')
-rw-r--r-- | database/rrd.h | 4 | ||||
-rw-r--r-- | database/rrdlabels.c | 22 | ||||
-rw-r--r-- | database/rrdset.c | 4 |
3 files changed, 27 insertions, 3 deletions
diff --git a/database/rrd.h b/database/rrd.h index 20891409d4..86f4226348 100644 --- a/database/rrd.h +++ b/database/rrd.h @@ -211,6 +211,8 @@ extern int is_valid_label_value(char *value); extern int is_valid_label_key(char *key); extern void free_label_list(struct label *labels); extern struct label *label_list_lookup_key(struct label *head, char *key, uint32_t key_hash); +extern struct label *label_list_lookup_keylist(struct label *head, char *keylist); +extern int label_list_contains_keylist(struct label *head, char *keylist); extern int label_list_contains_key(struct label *head, char *key, uint32_t key_hash); extern int label_list_contains(struct label *head, struct label *check); extern struct label *merge_label_lists(struct label *lo_pri, struct label *hi_pri); @@ -223,7 +225,7 @@ void reload_host_labels(void); extern void rrdset_add_label_to_new_list(RRDSET *st, char *key, char *value, LABEL_SOURCE source); extern void rrdset_finalize_labels(RRDSET *st); extern void rrdset_update_labels(RRDSET *st, struct label *labels); -extern int rrdset_contains_label_key(RRDSET *st, char *key, uint32_t key_hash); +extern int rrdset_contains_label_keylist(RRDSET *st, char *key); extern struct label *rrdset_lookup_label_key(RRDSET *st, char *key, uint32_t key_hash); // ---------------------------------------------------------------------------- diff --git a/database/rrdlabels.c b/database/rrdlabels.c index b423f422a4..f9583769d5 100644 --- a/database/rrdlabels.c +++ b/database/rrdlabels.c @@ -159,6 +159,28 @@ int label_list_contains(struct label *head, struct label *check) return label_list_contains_key(head, check->key, check->key_hash); } +struct label *label_list_lookup_keylist(struct label *head, char *key) +{ + SIMPLE_PATTERN *pattern = NULL; + + pattern = simple_pattern_create(key, ",|\t\r\n\f\v", SIMPLE_PATTERN_EXACT); + + while (head != NULL) + { + if (simple_pattern_matches(pattern, head->key)) + break; + head = head->next; + } + simple_pattern_free(pattern); + return head; +} + +int label_list_contains_keylist(struct label *head, char *keylist) +{ + return (label_list_lookup_keylist(head, keylist) != NULL); +} + + /* Create a list with entries from both lists. If any entry in the low priority list is masked by an entry in the high priority list then delete it. */ diff --git a/database/rrdset.c b/database/rrdset.c index 163fbb0715..760f401184 100644 --- a/database/rrdset.c +++ b/database/rrdset.c @@ -1949,7 +1949,7 @@ void rrdset_update_labels(RRDSET *st, struct label *labels) rrdset_finalize_labels(st); } -int rrdset_contains_label_key(RRDSET *st, char *key, uint32_t key_hash) +int rrdset_contains_label_keylist(RRDSET *st, char *keylist) { struct label_index *labels = &st->state->labels; int ret; @@ -1958,7 +1958,7 @@ int rrdset_contains_label_key(RRDSET *st, char *key, uint32_t key_hash) return 0; netdata_rwlock_rdlock(&labels->labels_rwlock); - ret = label_list_contains_key(labels->head, key, key_hash); + ret = label_list_contains_keylist(labels->head, keylist); netdata_rwlock_unlock(&labels->labels_rwlock); return ret; |