Software /
code /
prosody-modules
Diff
mod_measure_storage/mod_measure_storage.lua @ 2297:992e40dab31d
mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 31 Aug 2016 16:24:32 +0100 |
child | 2686:39cb2a51e779 |
line wrap: on
line diff
--- /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