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);