diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2023-10-04 20:54:16 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-04 20:54:16 +0300 |
commit | 9fd9823e077869987e7d2b665fd46ac3e5a015ec (patch) | |
tree | 476937a7dd0a734e9f04678e6fd5cc69e88ba7c7 | |
parent | 0904758540fe93fd92829960497e66d4a0a82a4d (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.c | 7 | ||||
-rw-r--r-- | database/contexts/api_v1.c | 4 | ||||
-rw-r--r-- | database/contexts/api_v2.c | 4 | ||||
-rw-r--r-- | database/contexts/query_target.c | 5 | ||||
-rw-r--r-- | libnetdata/libnetdata.c | 33 | ||||
-rw-r--r-- | libnetdata/libnetdata.h | 3 | ||||
-rw-r--r-- | web/api/queries/query.c | 2 | ||||
-rw-r--r-- | web/api/queries/weights.c | 4 |
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; |