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;