diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2023-05-05 22:10:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-05 22:10:06 +0300 |
commit | d395333d449a733e0e8f35e991387827f5abcfca (patch) | |
tree | 7980d1ff0c25c48465ba574d32b11a683481dcbc | |
parent | 9c41663852d960d4505f8f5d9dbd53ae5b442aef (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.c | 6 | ||||
-rw-r--r-- | database/contexts/query_scope.c | 18 | ||||
-rw-r--r-- | database/contexts/query_target.c | 28 | ||||
-rw-r--r-- | database/contexts/rrdcontext.h | 2 |
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); |