aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/statsmanager.lua14
-rw-r--r--util/statistics.lua77
2 files changed, 56 insertions, 35 deletions
diff --git a/core/statsmanager.lua b/core/statsmanager.lua
index 83df6181..62d217ef 100644
--- a/core/statsmanager.lua
+++ b/core/statsmanager.lua
@@ -23,29 +23,21 @@ if stats_interval then
return f(name);
end
- local mark_collection_start = measure("duration", "stats.collection_time");
- local mark_processing_start = measure("duration", "stats.processing_time");
+ local mark_collection_start = measure("times", "stats.collection");
+ local mark_processing_start = measure("times", "stats.processing");
function collect()
local mark_collection_done = mark_collection_start();
changed_stats, stats_extra = {}, {};
- for name, getter in pairs(stats.get_stats()) do
+ for stat_name, getter in pairs(stats.get_stats()) do
local type, value, extra = getter();
- local stat_name = name..":"..type;
local old_value = latest_stats[stat_name];
latest_stats[stat_name] = value;
if value ~= old_value then
changed_stats[stat_name] = value;
end
if extra then
- print(stat_name, extra)
stats_extra[stat_name] = extra;
- if type == "duration" then
- local rate = extra.rate;
- local rate_name = name..":rate";
- latest_stats[rate_name] = rate;
- changed_stats[rate_name] = rate;
- end
end
end
mark_collection_done();
diff --git a/util/statistics.lua b/util/statistics.lua
index 9d332053..08c765ae 100644
--- a/util/statistics.lua
+++ b/util/statistics.lua
@@ -20,24 +20,45 @@ local function new_registry(config)
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 @@ local function new_registry(config)
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 = 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;
- 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],
- };
+ 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 @@ return {
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 @@ return {
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;