@cryptotaxi247 / netdata-1 / commits / 7ec5f5fba

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;