diff options
author | Costa Tsaousis <costa@netdata.cloud> | 2023-07-20 23:27:46 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-20 23:27:46 +0300 |
commit | d36fb28d73cac93412b15a0e23df08fd18b28879 (patch) | |
tree | 5e1e6be4ee94e1edc6effe68babc56b1acd97849 /web | |
parent | cc2de625739ef318361d90ed4ffa72a0a235405f (diff) |
fix the calculation of incremental-sum (#15468)
* fix the calculation of incremental-sum
* for query planning use at least 400 points
Diffstat (limited to 'web')
-rw-r--r-- | web/api/queries/incremental_sum/incremental_sum.h | 28 | ||||
-rw-r--r-- | web/api/queries/query.c | 5 |
2 files changed, 20 insertions, 13 deletions
diff --git a/web/api/queries/incremental_sum/incremental_sum.h b/web/api/queries/incremental_sum/incremental_sum.h index dd6483b2ca..f110c58611 100644 --- a/web/api/queries/incremental_sum/incremental_sum.h +++ b/web/api/queries/incremental_sum/incremental_sum.h @@ -12,19 +12,20 @@ struct tg_incremental_sum { size_t count; }; -static inline void tg_incremental_sum_create(RRDR *r, const char *options __maybe_unused) { - r->time_grouping.data = onewayalloc_callocz(r->internal.owa, 1, sizeof(struct tg_incremental_sum)); -} - // resets when switches dimensions // so, clear everything to restart static inline void tg_incremental_sum_reset(RRDR *r) { struct tg_incremental_sum *g = (struct tg_incremental_sum *)r->time_grouping.data; - g->first = 0; - g->last = 0; + g->first = NAN; + g->last = NAN; g->count = 0; } +static inline void tg_incremental_sum_create(RRDR *r, const char *options __maybe_unused) { + r->time_grouping.data = onewayalloc_mallocz(r->internal.owa, sizeof(struct tg_incremental_sum)); + tg_incremental_sum_reset(r); +} + static inline void tg_incremental_sum_free(RRDR *r) { onewayalloc_freez(r->internal.owa, r->time_grouping.data); r->time_grouping.data = NULL; @@ -34,7 +35,11 @@ static inline void tg_incremental_sum_add(RRDR *r, NETDATA_DOUBLE value) { struct tg_incremental_sum *g = (struct tg_incremental_sum *)r->time_grouping.data; if(unlikely(!g->count)) { - g->first = value; + if(isnan(g->first)) + g->first = value; + else + g->last = value; + g->count++; } else { @@ -48,19 +53,16 @@ static inline NETDATA_DOUBLE tg_incremental_sum_flush(RRDR *r, RRDR_VALUE_FLAGS NETDATA_DOUBLE value; - if(unlikely(!g->count)) { + if(unlikely(!g->count || isnan(g->first) || isnan(g->last))) { value = 0.0; *rrdr_value_options_ptr |= RRDR_VALUE_EMPTY; } - else if(unlikely(g->count == 1)) { - value = 0.0; - } else { value = g->last - g->first; } - g->first = 0.0; - g->last = 0.0; + g->first = g->last; + g->last = NAN; g->count = 0; return value; diff --git a/web/api/queries/query.c b/web/api/queries/query.c index 74a925bc3d..ef8ee7e623 100644 --- a/web/api/queries/query.c +++ b/web/api/queries/query.c @@ -17,6 +17,7 @@ #include "percentile/percentile.h" #include "trimmed_mean/trimmed_mean.h" +#define QUERY_PLAN_MIN_POINTS 400 #define POINTS_TO_EXPAND_QUERY 5 // ---------------------------------------------------------------------------- @@ -996,6 +997,10 @@ static size_t query_metric_best_tier_for_timeframe(QUERY_METRIC *qm, time_t afte if(unlikely(after_wanted == before_wanted || points_wanted <= 0)) return query_metric_first_working_tier(qm); + if(points_wanted < QUERY_PLAN_MIN_POINTS) + // when selecting tiers, aim for a resolution of at least QUERY_PLAN_MIN_POINTS points + points_wanted = (before_wanted - after_wanted) > QUERY_PLAN_MIN_POINTS ? QUERY_PLAN_MIN_POINTS : before_wanted - after_wanted; + time_t min_first_time_s = 0; time_t max_last_time_s = 0; |