summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2022-07-15 02:21:15 +0300
committerCosta Tsaousis <costa@netdata.cloud>2022-07-15 02:21:15 +0300
commitb00d05a98568d8200d33e8f98c4f4c6fe04b9777 (patch)
tree7ec53f85163c9aac360fe72adedf69d5afc8c713
parentfe6d4a329c33234c4ef9ef767ae3442fe64b8661 (diff)
added option "deepscan" to the API to have the server refresh the retention and recalculate the contexts on the fly
-rw-r--r--database/rrdcontext.c47
-rw-r--r--database/rrdcontext.h1
-rw-r--r--web/api/netdata-swagger.json6
-rw-r--r--web/api/netdata-swagger.yaml2
-rw-r--r--web/api/web_api_v1.c2
5 files changed, 38 insertions, 20 deletions
diff --git a/database/rrdcontext.c b/database/rrdcontext.c
index 412e81e437..22631b93cd 100644
--- a/database/rrdcontext.c
+++ b/database/rrdcontext.c
@@ -269,6 +269,7 @@ static inline void rrdcontext_release(RRDCONTEXT_ACQUIRED *rca) {
dictionary_acquired_item_release((DICTIONARY *)rc->rrdhost->rrdctx, (DICTIONARY_ITEM *)rca);
}
+static void rrdcontext_recalculate_context_retention(RRDCONTEXT *rc, RRD_FLAGS reason, int job_id);
static void rrdcontext_recalculate_host_retention(RRDHOST *host, RRD_FLAGS reason, int job_id);
#define rrdcontext_version_hash(host) rrdcontext_version_hash_with_callback(host, NULL, false, NULL)
@@ -2072,6 +2073,9 @@ int rrdcontext_to_json(RRDHOST *host, BUFFER *wb, RRDCONTEXT_TO_JSON_OPTIONS opt
RRDCONTEXT *rc = rrdcontext_acquired_value(rca);
+ if(options & RRDCONTEXT_OPTION_DEEPSCAN)
+ rrdcontext_recalculate_context_retention(rc, RRD_FLAG_NONE, -1);
+
struct rrdcontext_to_json t = {
.wb = wb,
.options = options|RRDCONTEXT_OPTION_SKIP_ID,
@@ -2088,6 +2092,9 @@ int rrdcontexts_to_json(RRDHOST *host, BUFFER *wb, RRDCONTEXT_TO_JSON_OPTIONS op
char node_uuid[UUID_STR_LEN];
uuid_unparse(*host->node_id, node_uuid);
+ if(options & RRDCONTEXT_OPTION_DEEPSCAN)
+ rrdcontext_recalculate_host_retention(host, RRD_FLAG_NONE, -1);
+
buffer_sprintf(wb, "{\n"
"\t\"hostname\": \"%s\""
",\n\t\"machine_guid\": \"%s\""
@@ -2295,30 +2302,34 @@ static uint64_t rrdcontext_version_hash_with_callback(
return hash;
}
-static void rrdcontext_recalculate_host_retention(RRDHOST *host, RRD_FLAGS reason, int job_id) {
- if(unlikely(!host || !host->rrdctx)) return;
+static void rrdcontext_recalculate_context_retention(RRDCONTEXT *rc, RRD_FLAGS reason, int job_id) {
+ RRDINSTANCE *ri;
+ dfe_start_read(rc->rrdinstances, ri) {
+ RRDMETRIC *rm;
+ dfe_start_read(ri->rrdmetrics, rm) {
- RRDCONTEXT *rc;
- dfe_start_read((DICTIONARY *)host->rrdctx, rc) {
- RRDINSTANCE *ri;
- dfe_start_read(rc->rrdinstances, ri) {
- RRDMETRIC *rm;
- dfe_start_read(ri->rrdmetrics, rm) {
+ if(job_id >= 0)
+ worker_is_busy(job_id);
+
+ rrd_flag_set_updated(rm, reason);
- if(job_id >= 0)
- worker_is_busy(job_id);
+ rrdmetric_trigger_updates(rm, true, false);
+ }
+ dfe_done(rm);
- rrd_flag_set_updated(rm, reason);
+ rrdinstance_trigger_updates(ri, true, false);
+ }
+ dfe_done(ri);
- rrdmetric_trigger_updates(rm, true, false);
- }
- dfe_done(rm);
+ rrdcontext_trigger_updates(rc, true, RRD_FLAG_NONE);
+}
- rrdinstance_trigger_updates(ri, true, false);
- }
- dfe_done(ri);
+static void rrdcontext_recalculate_host_retention(RRDHOST *host, RRD_FLAGS reason, int job_id) {
+ if(unlikely(!host || !host->rrdctx)) return;
- rrdcontext_trigger_updates(rc, true, RRD_FLAG_NONE);
+ RRDCONTEXT *rc;
+ dfe_start_read((DICTIONARY *)host->rrdctx, rc) {
+ rrdcontext_recalculate_context_retention(rc, reason, job_id);
}
dfe_done(rc);
}
diff --git a/database/rrdcontext.h b/database/rrdcontext.h
index 590fa20c2e..7e56159523 100644
--- a/database/rrdcontext.h
+++ b/database/rrdcontext.h
@@ -42,6 +42,7 @@ typedef enum {
RRDCONTEXT_OPTION_SHOW_QUEUED = (1 << 3),
RRDCONTEXT_OPTION_SHOW_FLAGS = (1 << 4),
RRDCONTEXT_OPTION_SHOW_DELETED = (1 << 5),
+ RRDCONTEXT_OPTION_DEEPSCAN = (1 << 6),
RRDCONTEXT_OPTION_SKIP_ID = (1 << 31), // internal use
} RRDCONTEXT_TO_JSON_OPTIONS;
diff --git a/web/api/netdata-swagger.json b/web/api/netdata-swagger.json
index 25d5103985..fecb17473f 100644
--- a/web/api/netdata-swagger.json
+++ b/web/api/netdata-swagger.json
@@ -105,7 +105,8 @@
"labels",
"queue",
"flags",
- "deleted"
+ "deleted",
+ "deepscan"
]
},
"default": [
@@ -162,7 +163,8 @@
"labels",
"queue",
"flags",
- "deleted"
+ "deleted",
+ "deepscan"
]
},
"default": [
diff --git a/web/api/netdata-swagger.yaml b/web/api/netdata-swagger.yaml
index 97e24b7383..72e805c1e3 100644
--- a/web/api/netdata-swagger.yaml
+++ b/web/api/netdata-swagger.yaml
@@ -88,6 +88,7 @@ paths:
- queue
- flags
- deleted
+ - deepscan
default:
- full
responses:
@@ -128,6 +129,7 @@ paths:
- queue
- flags
- deleted
+ - deepscan
default:
- full
responses:
diff --git a/web/api/web_api_v1.c b/web/api/web_api_v1.c
index dcd35b4b8a..bc851751f1 100644
--- a/web/api/web_api_v1.c
+++ b/web/api/web_api_v1.c
@@ -395,6 +395,8 @@ static RRDCONTEXT_TO_JSON_OPTIONS rrdcontext_to_json_parse_options(char *o) {
options |= RRDCONTEXT_OPTION_SHOW_DELETED;
else if(!strcmp(tok, "labels"))
options |= RRDCONTEXT_OPTION_SHOW_LABELS;
+ else if(!strcmp(tok, "deepscan"))
+ options |= RRDCONTEXT_OPTION_DEEPSCAN;
}
return options;