diff --git a/src/dict/main.c b/src/dict/main.c index f298235e6b..4549c25f1a 100644 --- a/src/dict/main.c +++ b/src/dict/main.c @@ -27,7 +27,7 @@ static bool proctitle_updated; static void add_stats_string(string_t *str, struct stats_dist *stats, const char *name) { - str_printfa(str, ", %u %s:%"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64, + str_printfa(str, ", %u %s:%"PRIu64"/%.02f/%"PRIu64"/%"PRIu64, stats_dist_get_count(stats), name, stats_dist_get_min(stats)/1000, stats_dist_get_avg(stats)/1000, stats_dist_get_95th(stats)/1000, stats_dist_get_max(stats)/1000); diff --git a/src/lib/stats-dist.c b/src/lib/stats-dist.c index 52db4d353a..788847ae8f 100644 --- a/src/lib/stats-dist.c +++ b/src/lib/stats-dist.c @@ -87,12 +87,12 @@ uint64_t stats_dist_get_max(const struct stats_dist *stats) return stats->max; } -uint64_t stats_dist_get_avg(const struct stats_dist *stats) +double stats_dist_get_avg(const struct stats_dist *stats) { if (stats->count == 0) return 0; - return (stats->sum + stats->count/2) / stats->count; + return (double)stats->sum / stats->count; } static void stats_dist_ensure_sorted(struct stats_dist *stats) @@ -127,7 +127,7 @@ double stats_dist_get_variance(const struct stats_dist *stats) if (stats->count == 0) return 0; - double avg = (double)(int64_t)stats_dist_get_avg(stats); + double avg = stats_dist_get_avg(stats); double count = (stats->count < stats->sample_count) ? stats->count : stats->sample_count; diff --git a/src/lib/stats-dist.h b/src/lib/stats-dist.h index e21e638b85..82d53597af 100644 --- a/src/lib/stats-dist.h +++ b/src/lib/stats-dist.h @@ -21,7 +21,7 @@ uint64_t stats_dist_get_min(const struct stats_dist *stats); /* Returns events' maximum. */ uint64_t stats_dist_get_max(const struct stats_dist *stats); /* Returns events' average. */ -uint64_t stats_dist_get_avg(const struct stats_dist *stats); +double stats_dist_get_avg(const struct stats_dist *stats); /* Returns events' approximate (through random subsampling) median. */ uint64_t stats_dist_get_median(const struct stats_dist *stats); /* Returns events' variance */ diff --git a/src/lib/test-stats-dist.c b/src/lib/test-stats-dist.c index f6431d79ac..9c291624f7 100644 --- a/src/lib/test-stats-dist.c +++ b/src/lib/test-stats-dist.c @@ -3,6 +3,9 @@ #include "test-lib.h" #include "stats-dist.h" #include "sort.h" +#include "math.h" + +#define DBL_EQ(a, b) (fabs((a)-(b)) < 0.001) static void test_stats_dist_verify(const struct stats_dist *t, const int64_t *input, @@ -31,7 +34,8 @@ test_stats_dist_verify(const struct stats_dist *t, const int64_t *input, test_assert_idx(stats_dist_get_sum(t) == sum, input_size); test_assert_idx(stats_dist_get_min(t) == min, input_size); test_assert_idx(stats_dist_get_max(t) == max, input_size); - test_assert_idx(stats_dist_get_avg(t) == (sum + input_size/2)/input_size, input_size); + test_assert_idx(DBL_EQ(stats_dist_get_avg(t), (double)sum/input_size), + input_size); /* these aren't always fully accurate: */ test_assert_idx(stats_dist_get_median(t) >= copy[(input_size-1)/2] && @@ -86,7 +90,7 @@ void test_stats_dist(void) test_assert(stats_dist_get_sum(t) == (i-1)*i/2); test_assert(stats_dist_get_min(t) == 0); test_assert(stats_dist_get_max(t) == i-1); - test_assert(stats_dist_get_avg(t) == i/2); + test_assert(DBL_EQ(stats_dist_get_avg(t), 4999.500000)); /* just test that these work: */ test_assert(stats_dist_get_median(t) > 0 && stats_dist_get_median(t) < i-1); test_assert(stats_dist_get_95th(t) > 0 && stats_dist_get_95th(t) < i-1); diff --git a/src/stats/client-reader.c b/src/stats/client-reader.c index d4be3b8258..84423e0c87 100644 --- a/src/stats/client-reader.c +++ b/src/stats/client-reader.c @@ -51,7 +51,7 @@ static void reader_client_dump_stats(string_t *str, struct stats_dist *stats, else if (strcmp(field, "max") == 0) str_printfa(str, "%"PRIu64, stats_dist_get_max(stats)); else if (strcmp(field, "avg") == 0) - str_printfa(str, "%"PRIu64, stats_dist_get_avg(stats)); + str_printfa(str, "%.02f", stats_dist_get_avg(stats)); else if (strcmp(field, "median") == 0) str_printfa(str, "%"PRIu64, stats_dist_get_median(stats)); else if (strcmp(field, "variance") == 0)