view mod_measure_storage/mod_measure_storage.lua @ 4976:75b6e5df65f9

various: Improve error reporting if missing file server module on 0.12 If there is some error loading net.http.files then it would be swallowed by the pcall and then it would proceed to trying mod_http_files, which might cause unexpected behavior on 0.12 Ref #1765
author Kim Alvefur <zash@zash.se>
date Mon, 18 Jul 2022 22:47:54 +0200
parents 04ae5b45e6c7
children
line wrap: on
line source

module:set_global()

local function return_args_after_calling(f, ...)
	f();
	return ...
end

local function time_method(module, store_name, store_type, method_name, method_function)
	local opt_use_tags = module:get_option_boolean("measure_storage_tagged_metric", false);

	local metric_name, metric_tags;
	if opt_use_tags then
		metric_name, metric_tags = "storage_operation", ("store_name:%s,store_type:%s,store_operation:%s"):format(store_name, store_type, method_name);
	else
		metric_name = store_name.."_"..store_type.."_"..method_name;
	end
	local measure_operation_started = module:measure(metric_name, "times", metric_tags);

	return function (...)
		module:log("debug", "Measuring storage operation %s (%s)", metric_name, metric_tags or "no tags");
		local measure_operation_complete = measure_operation_started();
		return return_args_after_calling(measure_operation_complete, method_function(...));
	end;
end

local function wrap_store(module, store_name, store_type, store)
	local new_store = setmetatable({}, {
		__index = function (t, method_name)
			local original_method = store[method_name];
			if type(original_method) ~= "function" then
				if original_method then
					rawset(t, method_name, original_method);
				end
				return original_method;
			end
			local timed_method = time_method(module, store_name, store_type, method_name, original_method);
			rawset(t, method_name, timed_method);
			return timed_method;
		end;
	});
	return new_store;
end

local function hook_event(module)
	module:hook("store-opened", function(event)
		event.store = wrap_store(module, event.store_name, event.store_type or "keyval", event.store);
	end);
end

function module.load()
	hook_event(module);
end

function module.add_host(module)
	hook_event(module);
end