@cryptotaxi247 / netdata-1 / commits / d395333d4

On data and weight queries now instances filter matches also instance_id@node_id (#15021)

instances filter now matches also instance_id@node_id

Costa Tsaousis committed May 5, 2023 at 22:10 UTC d395333d449a733e0e8f35e991387827f5abcfca
4 files changed +35 -19
database/contexts/api_v2.c
+3 -3
@@ -108,7 +108,7 @@ struct rrdcontext_to_json_v2_data {
108
109 struct {
110 FTS_MATCH host_match;
111 - char host_uuid_buffer[UUID_STR_LEN];
111 + char host_node_id_str[UUID_STR_LEN];
112 SIMPLE_PATTERN *pattern;
113 FTS_INDEX fts;
114 } q;
@@ -271,7 +271,7 @@ static ssize_t rrdcontext_to_json_v2_add_host(void *data, RRDHOST *host, bool qu
271 if(ctl->q.pattern && (
272 full_text_search_string(&ctl->q.fts, ctl->q.pattern, host->hostname) ||
273 full_text_search_char(&ctl->q.fts, ctl->q.pattern, host->machine_guid) ||
274 - (ctl->q.pattern && full_text_search_char(&ctl->q.fts, ctl->q.pattern, ctl->q.host_uuid_buffer)))) {
274 + (ctl->q.pattern && full_text_search_char(&ctl->q.fts, ctl->q.pattern, ctl->q.host_node_id_str)))) {
275 ctl->q.host_match = FTS_MATCHED_HOST;
276 do_contexts = true;
277 }
@@ -497,7 +497,7 @@ int rrdcontext_to_json_v2(BUFFER *wb, struct api_v2_contexts_request *req, CONTE
497
498 ssize_t ret = query_scope_foreach_host(ctl.nodes.scope_pattern, ctl.nodes.pattern,
499 rrdcontext_to_json_v2_add_host, &ctl,
500 - &ctl.versions, ctl.q.host_uuid_buffer);
500 + &ctl.versions, ctl.q.host_node_id_str);
501
502 if(unlikely(ret < 0)) {
503 buffer_flush(wb);
database/contexts/query_scope.c
+10 -8
@@ -5,10 +5,10 @@
5 ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN *hosts_sp,
6 foreach_host_cb_t cb, void *data,
7 struct query_versions *versions,
8 - char *host_uuid_buffer) {
8 + char *host_node_id_str) {
9 char uuid[UUID_STR_LEN];
10 - if(!host_uuid_buffer) host_uuid_buffer = uuid;
11 - host_uuid_buffer[0] = '\0';
10 + if(!host_node_id_str) host_node_id_str = uuid;
11 + host_node_id_str[0] = '\0';
12
13 RRDHOST *host;
14 ssize_t added = 0;
@@ -19,15 +19,17 @@ ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN
19
20 dfe_start_read(rrdhost_root_index, host) {
21 if(host->node_id)
22 - uuid_unparse_lower(*host->node_id, host_uuid_buffer);
22 + uuid_unparse_lower(*host->node_id, host_node_id_str);
23 + else
24 + host_node_id_str[0] = '\0';
25
26 SIMPLE_PATTERN_RESULT match = SP_MATCHED_POSITIVE;
27 if(scope_hosts_sp) {
28 match = simple_pattern_matches_string_extract(scope_hosts_sp, host->hostname, NULL, 0);
29 if(match == SP_NOT_MATCHED) {
30 match = simple_pattern_matches_extract(scope_hosts_sp, host->machine_guid, NULL, 0);
29 - if(match == SP_NOT_MATCHED && *host_uuid_buffer)
30 - match = simple_pattern_matches_extract(scope_hosts_sp, host_uuid_buffer, NULL, 0);
31 + if(match == SP_NOT_MATCHED && *host_node_id_str)
32 + match = simple_pattern_matches_extract(scope_hosts_sp, host_node_id_str, NULL, 0);
33 }
34 }
35
@@ -40,8 +42,8 @@ ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN
42 match = simple_pattern_matches_string_extract(hosts_sp, host->hostname, NULL, 0);
43 if(match == SP_NOT_MATCHED) {
44 match = simple_pattern_matches_extract(hosts_sp, host->machine_guid, NULL, 0);
43 - if(match == SP_NOT_MATCHED && *host_uuid_buffer)
44 - match = simple_pattern_matches_extract(hosts_sp, host_uuid_buffer, NULL, 0);
45 + if(match == SP_NOT_MATCHED && *host_node_id_str)
46 + match = simple_pattern_matches_extract(hosts_sp, host_node_id_str, NULL, 0);
47 }
48 }
49
database/contexts/query_target.c
+21 -7
@@ -207,7 +207,7 @@ typedef struct query_target_locals {
207
208 size_t metrics_skipped_due_to_not_matching_timeframe;
209
210 - char host_uuid_buffer[UUID_STR_LEN];
210 + char host_node_id_str[UUID_STR_LEN];
211 QUERY_NODE *qn; // temp to pass on callbacks, ignore otherwise - no need to free
212 } QUERY_TARGET_LOCALS;
213
@@ -699,7 +699,8 @@ static inline SIMPLE_PATTERN_RESULT query_instance_matches(QUERY_INSTANCE *qi,
699 SIMPLE_PATTERN *instances_sp,
700 bool match_ids,
701 bool match_names,
702 - size_t version) {
702 + size_t version,
703 + char *host_node_id_str) {
704 SIMPLE_PATTERN_RESULT ret = SP_MATCHED_POSITIVE;
705
706 if(instances_sp) {
@@ -713,6 +714,12 @@ static inline SIMPLE_PATTERN_RESULT query_instance_matches(QUERY_INSTANCE *qi,
714 ret = simple_pattern_matches_string_extract(instances_sp, query_instance_id_fqdn(qi, version), NULL, 0);
715 if (ret == SP_NOT_MATCHED && match_names)
716 ret = simple_pattern_matches_string_extract(instances_sp, query_instance_name_fqdn(qi, version), NULL, 0);
717 +
718 + if (ret == SP_NOT_MATCHED && match_ids && host_node_id_str[0]) {
719 + char buffer[RRD_ID_LENGTH_MAX + 1];
720 + snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s@%s", rrdinstance_acquired_id(qi->ria), host_node_id_str);
721 + ret = simple_pattern_matches_extract(instances_sp, buffer, NULL, 0);
722 + }
723 }
724
725 return ret;
@@ -742,7 +749,7 @@ static bool query_instance_add(QUERY_TARGET_LOCALS *qtl, QUERY_NODE *qn, QUERY_C
749
750 if(queryable_instance && filter_instances)
751 queryable_instance = (SP_MATCHED_POSITIVE == query_instance_matches(
745 - qi, ri, qt->instances.pattern, qtl->match_ids, qtl->match_names, qt->request.version));
752 + qi, ri, qt->instances.pattern, qtl->match_ids, qtl->match_names, qt->request.version, qtl->host_node_id_str));
753
754 if(queryable_instance)
755 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) {
885 QUERY_NODE *qn = query_node_allocate(qt, host);
886
887 if(host->node_id) {
881 - if(!qtl->host_uuid_buffer[0])
888 + if(!qtl->host_node_id_str[0])
889 uuid_unparse_lower(*host->node_id, qn->node_id);
890 else
884 - memcpy(qn->node_id, qtl->host_uuid_buffer, sizeof(qn->node_id));
891 + memcpy(qn->node_id, qtl->host_node_id_str, sizeof(qn->node_id));
892 }
893 else
894 qn->node_id[0] = '\0';
@@ -1098,6 +1105,11 @@ QUERY_TARGET *query_target_create(QUERY_TARGET_REQUEST *qtr) {
1105 }
1106
1107 if(host) {
1108 + if(host->node_id)
1109 + uuid_unparse_lower(*host->node_id, qtl.host_node_id_str);
1110 + else
1111 + qtl.host_node_id_str[0] = '\0';
1112 +
1113 // single host query
1114 qt->versions.contexts_hard_hash = dictionary_version(host->rrdctx.contexts);
1115 qt->versions.contexts_soft_hash = dictionary_version(host->rrdctx.hub_queue);
@@ -1110,7 +1122,7 @@ QUERY_TARGET *query_target_create(QUERY_TARGET_REQUEST *qtr) {
1122 query_scope_foreach_host(qt->nodes.scope_pattern, qt->nodes.pattern,
1123 query_node_add, &qtl,
1124 &qt->versions,
1113 - qtl.host_uuid_buffer);
1125 + qtl.host_node_id_str);
1126
1127 // we need the available db retention for this call
1128 // so it has to be done last
@@ -1136,6 +1148,8 @@ ssize_t weights_foreach_rrdmetric_in_context(RRDCONTEXT_ACQUIRED *rca,
1148 if(!rc || rrd_flag_is_deleted(rc))
1149 return 0;
1150
1151 + char host_node_id_str[UUID_STR_LEN] = "";
1152 +
1153 bool proceed = true;
1154
1155 ssize_t count = 0;
@@ -1148,7 +1162,7 @@ ssize_t weights_foreach_rrdmetric_in_context(RRDCONTEXT_ACQUIRED *rca,
1162
1163 if(instances_sp) {
1164 QUERY_INSTANCE qi = { .ria = ria, };
1151 - SIMPLE_PATTERN_RESULT ret = query_instance_matches(&qi, ri, instances_sp, match_ids, match_names, version);
1165 + SIMPLE_PATTERN_RESULT ret = query_instance_matches(&qi, ri, instances_sp, match_ids, match_names, version, host_node_id_str);
1166 qi.ria = NULL;
1167 query_instance_release(&qi);
1168
database/contexts/rrdcontext.h
+1 -1
@@ -496,7 +496,7 @@ typedef ssize_t (*foreach_host_cb_t)(void *data, RRDHOST *host, bool queryable);
496 ssize_t query_scope_foreach_host(SIMPLE_PATTERN *scope_hosts_sp, SIMPLE_PATTERN *hosts_sp,
497 foreach_host_cb_t cb, void *data,
498 struct query_versions *versions,
499 - char *host_uuid_buffer);
499 + char *host_node_id_str);
500
501 typedef ssize_t (*foreach_context_cb_t)(void *data, RRDCONTEXT_ACQUIRED *rca, bool queryable_context);
502 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);