summaryrefslogtreecommitdiffstats
path: root/database
diff options
context:
space:
mode:
authorStelios Fragkakis <52996999+stelfrag@users.noreply.github.com>2021-01-14 18:50:33 +0200
committerGitHub <noreply@github.com>2021-01-14 18:50:33 +0200
commitcd443de780118c46dd8f02530086667d00948373 (patch)
treee29f21e28eb9eeb1d11539216a9e623ac225d3de /database
parentde6035c543296de179e359a415664106d66c3878 (diff)
Support multiple chart label keys in data queries (#10483)
Diffstat (limited to 'database')
-rw-r--r--database/rrd.h4
-rw-r--r--database/rrdlabels.c22
-rw-r--r--database/rrdset.c4
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;