# HG changeset patch # User Matthew Wild # Date 1472657072 -3600 # Node ID 992e40dab31d03195b7887e459380fd6eded6d2c # Parent 8c0bf3151e37981bed370e2b5a8ca0a7c30c3bbc mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10) diff -r 8c0bf3151e37 -r 992e40dab31d mod_measure_storage/mod_measure_storage.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_measure_storage/mod_measure_storage.lua Wed Aug 31 16:24:32 2016 +0100 @@ -0,0 +1,56 @@ +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, 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, event.store); + end); +end + +function module.load() + hook_event(module); +end + +function module.add_host(module) + hook_event(module); +end