Software /
code /
prosody
Diff
util/statistics.lua @ 6555:7b2d16c14659
statsmanager, util.statistics: API changes, remove debugging
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 21 Jan 2015 01:26:06 +0000 |
parent | 6553:0e29c05c3503 |
child | 6562:2b5ced5ca31f |
line wrap: on
line diff
--- a/util/statistics.lua Tue Jan 20 12:33:20 2015 +0000 +++ b/util/statistics.lua Wed Jan 21 01:26:06 2015 +0000 @@ -20,24 +20,45 @@ local duration_sample_interval = config.duration_sample_interval or 5; local duration_max_samples = config.duration_max_stored_samples or 5000; + local function get_distribution_stats(events, n_actual_events, since, new_time, units) + local n_stored_events = #events; + t_sort(events); + local sum = 0; + for i = 1, n_stored_events do + sum = sum + events[i]; + end + + return { + samples = events; + sample_count = n_stored_events; + count = n_actual_events, + rate = n_actual_events/(new_time-since); + average = n_stored_events > 0 and sum/n_stored_events or 0, + min = events[1] or 0, + max = events[n_stored_events] or 0, + units = units, + }; + end + + local registry = {}; local methods; methods = { amount = function (name, initial) local v = initial or 0; - registry[name] = function () return "amount", v; end + registry[name..":amount"] = function () return "amount", v; end return function (new_v) v = new_v; end end; counter = function (name, initial) local v = initial or 0; - registry[name] = function () return "amount", v; end + registry[name..":amount"] = function () return "amount", v; end return function (delta) v = v + delta; end; end; rate = function (name) local since, n = time(), 0; - registry[name] = function () + registry[name..":rate"] = function () local t = time(); local stats = { rate = n/(t-since); @@ -50,35 +71,43 @@ n = n + 1; end; end; - duration = function (name) + distribution = function (name, unit, type) + type = type or "distribution"; local events, last_event = {}, 0; local n_actual_events = 0; local since = time(); - registry[name] = function () - local n_stored_events = #events; - t_sort(events); - local sum = 0; - for i = 1, n_stored_events do - sum = sum + events[i]; - end - + registry[name..":"..type] = function () local new_time = time(); - - local stats = { - samples = events; - sample_count = n_stored_events; - count = n_actual_events, - rate = n_actual_events/(new_time-since); - average = n_stored_events > 0 and sum/n_stored_events or 0, - min = events[1], - max = events[n_stored_events], - }; - + local stats = get_distribution_stats(events, n_actual_events, since, new_time, unit); events, last_event = {}, 0; n_actual_events = 0; since = new_time; + return type, stats.average, stats; + end; + return function (value) + n_actual_events = n_actual_events + 1; + if n_actual_events%duration_sample_interval > 0 then + last_event = (last_event%duration_max_samples) + 1; + events[last_event] = value; + end + end; + end; + sizes = function (name) + return methods.distribution(name, "bytes", "size"); + end; + times = function (name) + local events, last_event = {}, 0; + local n_actual_events = 0; + local since = time(); + + registry[name..":duration"] = function () + local new_time = time(); + local stats = get_distribution_stats(events, n_actual_events, since, new_time, "seconds"); + events, last_event = {}, 0; + n_actual_events = 0; + since = new_time; return "duration", stats.average, stats; end; @@ -111,7 +140,7 @@ n_buckets = n_buckets or 100; local events, n_events = duration.samples, duration.sample_count; if not (events and n_events) then - return nil, "not a valid duration stat"; + return nil, "not a valid distribution stat"; end local histogram = {}; @@ -124,7 +153,7 @@ get_percentile = function (duration, pc) local events, n_events = duration.samples, duration.sample_count; if not (events and n_events) then - return nil, "not a valid duration stat"; + return nil, "not a valid distribution stat"; end return percentile(events, n_events, pc); end;