summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosta Tsaousis <costa@netdata.cloud>2023-10-04 20:54:16 +0300
committerGitHub <noreply@github.com>2023-10-04 20:54:16 +0300
commit9fd9823e077869987e7d2b665fd46ac3e5a015ec (patch)
tree476937a7dd0a734e9f04678e6fd5cc69e88ba7c7
parent0904758540fe93fd92829960497e66d4a0a82a4d (diff)
journal: fix the 1 second latency in play mode (#16123)
provide a relative_to_absolute function that does not touch the current realtime time
-rw-r--r--collectors/systemd-journal.plugin/systemd-journal.c7
-rw-r--r--database/contexts/api_v1.c4
-rw-r--r--database/contexts/api_v2.c4
-rw-r--r--database/contexts/query_target.c5
-rw-r--r--libnetdata/libnetdata.c33
-rw-r--r--libnetdata/libnetdata.h3
-rw-r--r--web/api/queries/query.c2
-rw-r--r--web/api/queries/weights.c4
8 files changed, 39 insertions, 23 deletions
diff --git a/collectors/systemd-journal.plugin/systemd-journal.c b/collectors/systemd-journal.plugin/systemd-journal.c
index ea905a65c8..f0935b450f 100644
--- a/collectors/systemd-journal.plugin/systemd-journal.c
+++ b/collectors/systemd-journal.plugin/systemd-journal.c
@@ -2341,16 +2341,15 @@ static void function_systemd_journal(const char *transaction, char *function, in
// ------------------------------------------------------------------------
// validate parameters
- time_t expires = now_realtime_sec() + 1;
- time_t now_s;
+ time_t now_s = now_realtime_sec();
+ time_t expires = now_s + 1;
if(!after_s && !before_s) {
- now_s = now_realtime_sec();
before_s = now_s;
after_s = before_s - SYSTEMD_JOURNAL_DEFAULT_QUERY_DURATION;
}
else
- rrdr_relative_window_to_absolute(&after_s, &before_s, &now_s, false);
+ rrdr_relative_window_to_absolute(&after_s, &before_s, now_s);
if(after_s > before_s) {
time_t tmp = after_s;
diff --git a/database/contexts/api_v1.c b/database/contexts/api_v1.c
index d8446d8490..f144e6f7b8 100644
--- a/database/contexts/api_v1.c
+++ b/database/contexts/api_v1.c
@@ -366,7 +366,7 @@ int rrdcontext_to_json(RRDHOST *host, BUFFER *wb, time_t after, time_t before, R
RRDCONTEXT *rc = rrdcontext_acquired_value(rca);
if(after != 0 && before != 0)
- rrdr_relative_window_to_absolute(&after, &before, NULL, false);
+ rrdr_relative_window_to_absolute_query(&after, &before, NULL, false);
buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
struct rrdcontext_to_json t_contexts = {
@@ -403,7 +403,7 @@ int rrdcontexts_to_json(RRDHOST *host, BUFFER *wb, time_t after, time_t before,
uuid_unparse(*host->node_id, node_uuid);
if(after != 0 && before != 0)
- rrdr_relative_window_to_absolute(&after, &before, NULL, false);
+ rrdr_relative_window_to_absolute_query(&after, &before, NULL, false);
buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
buffer_json_member_add_string(wb, "hostname", rrdhost_hostname(host));
diff --git a/database/contexts/api_v2.c b/database/contexts/api_v2.c
index dacf962a30..5d2eb68d2c 100644
--- a/database/contexts/api_v2.c
+++ b/database/contexts/api_v2.c
@@ -1940,7 +1940,9 @@ int rrdcontext_to_json_v2(BUFFER *wb, struct api_v2_contexts_request *req, CONTE
}
if(req->after || req->before) {
- ctl.window.relative = rrdr_relative_window_to_absolute(&ctl.window.after, &ctl.window.before, &ctl.now, false);
+ ctl.window.relative = rrdr_relative_window_to_absolute_query(&ctl.window.after, &ctl.window.before, &ctl.now
+ , false
+ );
ctl.window.enabled = !(mode & CONTEXTS_V2_ALERT_TRANSITIONS);
}
else
diff --git a/database/contexts/query_target.c b/database/contexts/query_target.c
index 829640b909..d969691dde 100644
--- a/database/contexts/query_target.c
+++ b/database/contexts/query_target.c
@@ -1052,8 +1052,9 @@ QUERY_TARGET *query_target_create(QUERY_TARGET_REQUEST *qtr) {
if(query_target_has_percentage_of_group(qt))
qt->window.options &= ~RRDR_OPTION_PERCENTAGE;
- qt->internal.relative = rrdr_relative_window_to_absolute(&qt->window.after, &qt->window.before, &qt->window.now,
- unittest_running);
+ qt->internal.relative = rrdr_relative_window_to_absolute_query(&qt->window.after, &qt->window.before
+ , &qt->window.now, unittest_running
+ );
// prepare our local variables - we need these across all these functions
QUERY_TARGET_LOCALS qtl = {
diff --git a/libnetdata/libnetdata.c b/libnetdata/libnetdata.c
index 0fbf7e211d..159e89950f 100644
--- a/libnetdata/libnetdata.c
+++ b/libnetdata/libnetdata.c
@@ -1969,18 +1969,13 @@ int hash256_string(const unsigned char *string, size_t size, char *hash) {
}
#endif
-// Returns 1 if an absolute period was requested or 0 if it was a relative period
-bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running) {
- time_t now = now_realtime_sec() - 1;
- if(now_ptr)
- *now_ptr = now;
+bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t now) {
+ if(!now) now = now_realtime_sec();
int absolute_period_requested = -1;
- long long after_requested, before_requested;
-
- before_requested = *before;
- after_requested = *after;
+ time_t before_requested = *before;
+ time_t after_requested = *after;
// allow relative for before (smaller than API_RELATIVE_TIME_MAX)
if(ABS(before_requested) <= API_RELATIVE_TIME_MAX) {
@@ -2025,11 +2020,29 @@ bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t *now
// shift the query back to be in the present time
// (this may also happen because of the rules above)
if(before_requested > now) {
- long long delta = before_requested - now;
+ time_t delta = before_requested - now;
before_requested -= delta;
after_requested -= delta;
}
+ *before = before_requested;
+ *after = after_requested;
+
+ return (absolute_period_requested != 1);
+}
+
+// Returns 1 if an absolute period was requested or 0 if it was a relative period
+bool rrdr_relative_window_to_absolute_query(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running) {
+ time_t now = now_realtime_sec() - 1;
+
+ if(now_ptr)
+ *now_ptr = now;
+
+ time_t before_requested = *before;
+ time_t after_requested = *after;
+
+ int absolute_period_requested = rrdr_relative_window_to_absolute(&after_requested, &before_requested, now);
+
time_t absolute_minimum_time = now - (10 * 365 * 86400);
time_t absolute_maximum_time = now + (1 * 365 * 86400);
diff --git a/libnetdata/libnetdata.h b/libnetdata/libnetdata.h
index 164817044e..c337b3b5d4 100644
--- a/libnetdata/libnetdata.h
+++ b/libnetdata/libnetdata.h
@@ -989,7 +989,8 @@ int hash256_string(const unsigned char *string, size_t size, char *hash);
extern bool unittest_running;
#define API_RELATIVE_TIME_MAX (3 * 365 * 86400)
-bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running);
+bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t now);
+bool rrdr_relative_window_to_absolute_query(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running);
int netdata_base64_decode(const char *encoded, char *decoded, size_t decoded_size);
diff --git a/web/api/queries/query.c b/web/api/queries/query.c
index 6b392de745..8a4e94c969 100644
--- a/web/api/queries/query.c
+++ b/web/api/queries/query.c
@@ -2203,7 +2203,7 @@ bool query_target_calculate_window(QUERY_TARGET *qt) {
}
// convert our before_wanted and after_wanted to absolute
- rrdr_relative_window_to_absolute(&after_wanted, &before_wanted, NULL, unittest_running);
+ rrdr_relative_window_to_absolute_query(&after_wanted, &before_wanted, NULL, unittest_running);
query_debug_log(":relative2absolute after %ld, before %ld", after_wanted, before_wanted);
if (natural_points && (options & RRDR_OPTION_SELECTED_TIER) && tier > 0 && storage_tiers > 1) {
diff --git a/web/api/queries/weights.c b/web/api/queries/weights.c
index 25aca98167..fce7b8f247 100644
--- a/web/api/queries/weights.c
+++ b/web/api/queries/weights.c
@@ -1806,7 +1806,7 @@ int web_api_v12_weights(BUFFER *wb, QUERY_WEIGHTS_REQUEST *qwr) {
}
};
- if(!rrdr_relative_window_to_absolute(&qwr->after, &qwr->before, NULL, false))
+ if(!rrdr_relative_window_to_absolute_query(&qwr->after, &qwr->before, NULL, false))
buffer_no_cacheable(wb);
else
buffer_cacheable(wb);
@@ -1823,7 +1823,7 @@ int web_api_v12_weights(BUFFER *wb, QUERY_WEIGHTS_REQUEST *qwr) {
if(qwr->baseline_before <= API_RELATIVE_TIME_MAX)
qwr->baseline_before += qwr->after;
- rrdr_relative_window_to_absolute(&qwr->baseline_after, &qwr->baseline_before, NULL, false);
+ rrdr_relative_window_to_absolute_query(&qwr->baseline_after, &qwr->baseline_before, NULL, false);
if (qwr->baseline_before <= qwr->baseline_after) {
resp = HTTP_RESP_BAD_REQUEST;