Skip to content

Commit

Permalink
fix the calculation of incremental-sum (#15468)
Browse files Browse the repository at this point in the history
* fix the calculation of incremental-sum

* for query planning use at least 400 points
  • Loading branch information
ktsaou committed Jul 20, 2023
1 parent cc2de62 commit d36fb28
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 13 deletions.
28 changes: 15 additions & 13 deletions web/api/queries/incremental_sum/incremental_sum.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {
Expand All @@ -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;
Expand Down
5 changes: 5 additions & 0 deletions web/api/queries/query.c
Original file line number Diff line number Diff line change
Expand Up @@ -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

// ----------------------------------------------------------------------------
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit d36fb28

Please sign in to comment.