added sum dimension to histograms; fixes #2172
Costa Tsaousis (ktsaou) committed
May 10, 2017 at 22:12 UTC
7ec5f5fba428be0bbc6d0b9db502a8b91403963e
3 files changed
+39
-11
src/statistical.c
+30
-8
@@ -2,28 +2,50 @@
2
3
// --------------------------------------------------------------------------------------------------------------------
4
5
-long double average(long double *series, size_t entries) {
6
- if(unlikely(entries == 0))
5
+inline long double sum_and_count(long double *series, size_t entries, size_t *count) {
6
+ if(unlikely(entries == 0)) {
7
+ if(likely(count))
8
+ *count = 0;
9
+
10
return NAN;
11
+ }
12
+
13
+ if(unlikely(entries == 1)) {
14
+ if(likely(count))
15
+ *count = (isnan(series[0])?0:1);
16
9
- if(unlikely(entries == 1))
17
return series[0];
18
+ }
19
12
- size_t i, count = 0;
20
+ size_t i, c = 0;
21
long double sum = 0;
22
23
for(i = 0; i < entries ; i++) {
24
long double value = series[i];
25
if(unlikely(isnan(value) || isinf(value))) continue;
18
- count++;
26
+ c++;
27
sum += value;
28
}
29
22
- if(unlikely(count == 0))
30
+ if(likely(count))
31
+ *count = c;
32
+
33
+ if(unlikely(c == 0))
34
return NAN;
35
25
- if(unlikely(count == 1))
26
- return sum;
36
+ return sum;
37
+}
38
+
39
+inline long double sum(long double *series, size_t entries) {
40
+ return sum_and_count(series, entries, NULL);
41
+}
42
+
43
+inline long double average(long double *series, size_t entries) {
44
+ size_t count = 0;
45
+ long double sum = sum_and_count(series, entries, &count);
46
+
47
+ if(unlikely(count == 0))
48
+ return NAN;
49
50
return sum / (long double)count;
51
}
src/statistical.h
+2
-1
@@ -10,7 +10,8 @@ extern long double standard_deviation(long double *series, size_t entries);
10
extern long double single_exponential_smoothing(long double *series, size_t entries, long double alpha);
11
extern long double double_exponential_smoothing(long double *series, size_t entries, long double alpha, long double beta, long double *forecast);
12
extern long double holtwinters(long double *series, size_t entries, long double alpha, long double beta, long double gamma, long double *forecast);
13
-
13
+extern long double sum_and_count(long double *series, size_t entries, size_t *count);
14
+extern long double sum(long double *series, size_t entries);
15
extern long double median_on_sorted_series(long double *series, size_t entries);
16
extern long double *copy_series(long double *series, size_t entries);
17
extern void sort_series(long double *series, size_t entries);
src/statsd.c
+7
-2
@@ -50,11 +50,13 @@ typedef struct statsd_histogram_extensions {
50
collected_number last_percentile;
51
collected_number last_median;
52
collected_number last_stddev;
53
+ collected_number last_sum;
54
RRDDIM *rd_min;
55
RRDDIM *rd_max;
56
RRDDIM *rd_percentile;
57
RRDDIM *rd_median;
58
RRDDIM *rd_stddev;
59
+ RRDDIM *rd_sum;
60
long double values[]; // dynamic array of values collected
61
} STATSD_METRIC_HISTOGRAM_EXTENSIONS;
62
@@ -1365,6 +1367,7 @@ static inline void statsd_private_chart_timer_or_histogram(STATSD_METRIC *m, con
1367
m->histogram.ext->rd_percentile = rrddim_add(m->st, statsd.histogram_percentile_str, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
1368
m->histogram.ext->rd_median = rrddim_add(m->st, "median", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
1369
m->histogram.ext->rd_stddev = rrddim_add(m->st, "stddev", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
1370
+ m->histogram.ext->rd_sum = rrddim_add(m->st, "sum", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
1371
1372
if(m->options & STATSD_METRIC_OPTION_CHART_DIMENSION_COUNT)
1373
m->rd_count = rrddim_add(m->st, "events", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
@@ -1376,6 +1379,7 @@ static inline void statsd_private_chart_timer_or_histogram(STATSD_METRIC *m, con
1379
rrddim_set_by_pointer(m->st, m->histogram.ext->rd_percentile, m->histogram.ext->last_percentile);
1380
rrddim_set_by_pointer(m->st, m->histogram.ext->rd_median, m->histogram.ext->last_median);
1381
rrddim_set_by_pointer(m->st, m->histogram.ext->rd_stddev, m->histogram.ext->last_stddev);
1382
+ rrddim_set_by_pointer(m->st, m->histogram.ext->rd_sum, m->histogram.ext->last_sum);
1383
rrddim_set_by_pointer(m->st, m->rd_value, m->last);
1384
1385
if(m->rd_count)
@@ -1451,12 +1455,13 @@ static inline void statsd_flush_timer_or_histogram(STATSD_METRIC *m, const char
1455
long double *series = m->histogram.ext->values;
1456
sort_series(series, len);
1457
1454
- m->histogram.ext->last_min = (collected_number)roundl(series[0] * 1000.0);
1455
- m->histogram.ext->last_max = (collected_number)roundl(series[len - 1] * 1000.0);
1458
+ m->histogram.ext->last_min = (collected_number)roundl(series[0] * 1000);
1459
+ m->histogram.ext->last_max = (collected_number)roundl(series[len - 1] * 1000);
1460
m->last = (collected_number)roundl(average(series, len) * 1000);
1461
m->histogram.ext->last_percentile = (collected_number)roundl(average(series, (size_t)floor((double)len * statsd.histogram_percentile / 100.0)) * 1000);
1462
m->histogram.ext->last_median = (collected_number)roundl(median_on_sorted_series(series, len) * 1000);
1463
m->histogram.ext->last_stddev = (collected_number)roundl(standard_deviation(series, len) * 1000);
1464
+ m->histogram.ext->last_sum = (collected_number)roundl(sum(series, len) * 1000);
1465
1466
m->reset = 1;
1467
updated = 1;