summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2023-05-05 22:10:06 +0300
committerGitHub <noreply@github.com>2023-05-05 22:10:06 +0300
commitd395333d449a733e0e8f35e991387827f5abcfca (patch)
tree7980d1ff0c25c48465ba574d32b11a683481dcbc
parent9c41663852d960d4505f8f5d9dbd53ae5b442aef (diff)
On data and weight queries now instances filter matches also instance_id@node_id (#15021)
instances filter now matches also instance_id@node_id
-rw-r--r--database/contexts/api_v2.c6
-rw-r--r--database/contexts/query_scope.c18
-rw-r--r--database/contexts/query_target.c28
-rw-r--r--database/contexts/rrdcontext.h2
4 files changed, 35 insertions, 19 deletions
diff --git a/database/contexts/api_v2.c b/database/contexts/api_v2.c
index 0d753b8789..a08d1509c2 100644
--- a/database/contexts/api_v2.c
+++ b/database/contexts/api_v2.c
@@ -108,7 +108,7 @@ struct rrdcontext_to_json_v2_data {
struct {
FTS_MATCH host_match;
- char host_uuid_buffer[UUID_STR_LEN];
+ char host_node_id_str[UUID_STR_LEN];
SIMPLE_PATTERN *pattern;
FTS_INDEX fts;
} q;
@@ -271,7 +271,7 @@ static ssize_t rrdcontext_to_json_v2_add_host(void *data, RRDHOST *host, bool qu
if(ctl->q.pattern && (
full_text_search_string(&ctl->q.fts, ctl->q.pattern, host->hostname) ||
full_text_search_char(&ctl->q.fts, ctl->q.pattern, host->machine_guid) ||
- (ctl->q.pattern && full_text_search_char(&ctl->q.fts, ctl->q.pattern, ctl->q.host_uuid_buffer)))) {
+ (ctl->q.pattern && full_text_search_char(&ctl->q.fts, ctl->q.pattern, ctl->q.host_node_id_str)))) {
ctl->q.host_match = FTS_MATCHED_HOST;
do_contexts = true;
}
@@ -497,7 +497,7 @@ int rrdcontext_to_json_v2(BUFFER *wb, struct api_v2_contexts_request *req, CONTE
ssize_t ret = query_scope_foreach_host(ctl.nodes.scope_pattern, ctl.nodes.pattern,
rrdcontext_to_json_v2_add_host, &ctl,
- &ctl.versions, ctl.q.host_uuid_buffer);
+ &ctl.versions, ctl.q.host_node_id_str);
if(unlikely(ret < 0)) {
buffer_flush(wb);
diff --git a/database/contexts/query_scope.c b/database/contexts/query_scope.c
index ae04f643f1..f3bcd0b3fa 100644
--- a/database/contexts/query_scope.c
+++ b/database/contexts/query_scope.c
@@ -5,10 +5,10 @@
ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN *hosts_sp,
foreach_host_cb_t cb, void *data,
struct query_versions *versions,
- char *host_uuid_buffer) {
+ char *host_node_id_str) {
char uuid[UUID_STR_LEN];
- if(!host_uuid_buffer) host_uuid_buffer = uuid;
- host_uuid_buffer[0] = '\0';
+ if(!host_node_id_str) host_node_id_str = uuid;
+ host_node_id_str[0] = '\0';
RRDHOST *host;
ssize_t added = 0;
@@ -19,15 +19,17 @@ ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN
dfe_start_read(rrdhost_root_index, host) {
if(host->node_id)
- uuid_unparse_lower(*host->node_id, host_uuid_buffer);
+ uuid_unparse_lower(*host->node_id, host_node_id_str);
+ else
+ host_node_id_str[0] = '\0';
SIMPLE_PATTERN_RESULT match = SP_MATCHED_POSITIVE;
if(scope_hosts_sp) {
match = simple_pattern_matches_string_extract(scope_hosts_sp, host->hostname, NULL, 0);
if(match == SP_NOT_MATCHED) {
match = simple_pattern_matches_extract(scope_hosts_sp, host->machine_guid, NULL, 0);
- if(match == SP_NOT_MATCHED && *host_uuid_buffer)
- match = simple_pattern_matches_extract(scope_hosts_sp, host_uuid_buffer, NULL, 0);
+ if(match == SP_NOT_MATCHED && *host_node_id_str)
+ match = simple_pattern_matches_extract(scope_hosts_sp, host_node_id_str, NULL, 0);
}
}
@@ -40,8 +42,8 @@ ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN
match = simple_pattern_matches_string_extract(hosts_sp, host->hostname, NULL, 0);
if(match == SP_NOT_MATCHED) {
match = simple_pattern_matches_extract(hosts_sp, host->machine_guid, NULL, 0);
- if(match == SP_NOT_MATCHED && *host_uuid_buffer)
- match = simple_pattern_matches_extract(hosts_sp, host_uuid_buffer, NULL, 0);
+ if(match == SP_NOT_MATCHED && *host_node_id_str)
+ match = simple_pattern_matches_extract(hosts_sp, host_node_id_str, NULL, 0);
}
}
diff --git a/database/contexts/query_target.c b/database/contexts/query_target.c
index 19ab8caadd..69386a3f8b 100644
--- a/database/contexts/query_target.c
+++ b/database/contexts/query_target.c
@@ -207,7 +207,7 @@ typedef struct query_target_locals {
size_t metrics_skipped_due_to_not_matching_timeframe;
- char host_uuid_buffer[UUID_STR_LEN];
+ char host_node_id_str[UUID_STR_LEN];
QUERY_NODE *qn; // temp to pass on callbacks, ignore otherwise - no need to free
} QUERY_TARGET_LOCALS;
@@ -699,7 +699,8 @@ static inline SIMPLE_PATTERN_RESULT query_instance_matches(QUERY_INSTANCE *qi,
SIMPLE_PATTERN *instances_sp,
bool match_ids,
bool match_names,
- size_t version) {
+ size_t version,
+ char *host_node_id_str) {
SIMPLE_PATTERN_RESULT ret = SP_MATCHED_POSITIVE;
if(instances_sp) {
@@ -713,6 +714,12 @@ static inline SIMPLE_PATTERN_RESULT query_instance_matches(QUERY_INSTANCE *qi,
ret = simple_pattern_matches_string_extract(instances_sp, query_instance_id_fqdn(qi, version), NULL, 0);
if (ret == SP_NOT_MATCHED && match_names)
ret = simple_pattern_matches_string_extract(instances_sp, query_instance_name_fqdn(qi, version), NULL, 0);
+
+ if (ret == SP_NOT_MATCHED && match_ids && host_node_id_str[0]) {
+ char buffer[RRD_ID_LENGTH_MAX + 1];
+ snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s@%s", rrdinstance_acquired_id(qi->ria), host_node_id_str);
+ ret = simple_pattern_matches_extract(instances_sp, buffer, NULL, 0);
+ }
}
return ret;
@@ -742,7 +749,7 @@ static bool query_instance_add(QUERY_TARGET_LOCALS *qtl, QUERY_NODE *qn, QUERY_C
if(queryable_instance && filter_instances)
queryable_instance = (SP_MATCHED_POSITIVE == query_instance_matches(
- qi, ri, qt->instances.pattern, qtl->match_ids, qtl->match_names, qt->request.version));
+ qi, ri, qt->instances.pattern, qtl->match_ids, qtl->match_names, qt->request.version, qtl->host_node_id_str));
if(queryable_instance)
queryable_instance = query_instance_matches_labels(ri, qt->instances.chart_label_key_pattern, qt->instances.labels_pattern);
@@ -878,10 +885,10 @@ static ssize_t query_node_add(void *data, RRDHOST *host, bool queryable_host) {
QUERY_NODE *qn = query_node_allocate(qt, host);
if(host->node_id) {
- if(!qtl->host_uuid_buffer[0])
+ if(!qtl->host_node_id_str[0])
uuid_unparse_lower(*host->node_id, qn->node_id);
else
- memcpy(qn->node_id, qtl->host_uuid_buffer, sizeof(qn->node_id));
+ memcpy(qn->node_id, qtl->host_node_id_str, sizeof(qn->node_id));
}
else
qn->node_id[0] = '\0';
@@ -1098,6 +1105,11 @@ QUERY_TARGET *query_target_create(QUERY_TARGET_REQUEST *qtr) {
}
if(host) {
+ if(host->node_id)
+ uuid_unparse_lower(*host->node_id, qtl.host_node_id_str);
+ else
+ qtl.host_node_id_str[0] = '\0';
+
// single host query
qt->versions.contexts_hard_hash = dictionary_version(host->rrdctx.contexts);
qt->versions.contexts_soft_hash = dictionary_version(host->rrdctx.hub_queue);
@@ -1110,7 +1122,7 @@ QUERY_TARGET *query_target_create(QUERY_TARGET_REQUEST *qtr) {
query_scope_foreach_host(qt->nodes.scope_pattern, qt->nodes.pattern,
query_node_add, &qtl,
&qt->versions,
- qtl.host_uuid_buffer);
+ qtl.host_node_id_str);
// we need the available db retention for this call
// so it has to be done last
@@ -1136,6 +1148,8 @@ ssize_t weights_foreach_rrdmetric_in_context(RRDCONTEXT_ACQUIRED *rca,
if(!rc || rrd_flag_is_deleted(rc))
return 0;
+ char host_node_id_str[UUID_STR_LEN] = "";
+
bool proceed = true;
ssize_t count = 0;
@@ -1148,7 +1162,7 @@ ssize_t weights_foreach_rrdmetric_in_context(RRDCONTEXT_ACQUIRED *rca,
if(instances_sp) {
QUERY_INSTANCE qi = { .ria = ria, };
- SIMPLE_PATTERN_RESULT ret = query_instance_matches(&qi, ri, instances_sp, match_ids, match_names, version);
+ SIMPLE_PATTERN_RESULT ret = query_instance_matches(&qi, ri, instances_sp, match_ids, match_names, version, host_node_id_str);
qi.ria = NULL;
query_instance_release(&qi);
diff --git a/database/contexts/rrdcontext.h b/database/contexts/rrdcontext.h
index 71e1a391ca..5328483d6e 100644
--- a/database/contexts/rrdcontext.h
+++ b/database/contexts/rrdcontext.h
@@ -496,7 +496,7 @@ typedef ssize_t (*foreach_host_cb_t)(void *data, RRDHOST *host, bool queryable);
ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN *hosts_sp,
foreach_host_cb_t cb, void *data,
struct query_versions *versions,
- char *host_uuid_buffer);
+ char *host_node_id_str);
typedef ssize_t (*foreach_context_cb_t)(void *data, RRDCONTEXT_ACQUIRED *rca, bool queryable_context);
ssize_t query_scope_foreach_context(RRDHOST *host, const char *scope_contexts, SIMPLE_PATTERN *scope_contexts_sp, SIMPLE_PATTERN *contexts_sp, foreach_context_cb_t cb, bool queryable_host, void *data);