Software /
code /
prosody-modules
Comparison
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 |
comparison
equal
deleted
inserted
replaced
2296:8c0bf3151e37 | 2297:992e40dab31d |
---|---|
1 module:set_global() | |
2 | |
3 local function return_args_after_calling(f, ...) | |
4 f(); | |
5 return ... | |
6 end | |
7 | |
8 local function time_method(module, store_name, store_type, method_name, method_function) | |
9 local opt_use_tags = module:get_option_boolean("measure_storage_tagged_metric", false); | |
10 | |
11 local metric_name, metric_tags; | |
12 if opt_use_tags then | |
13 metric_name, metric_tags = "storage_operation", ("store_name:%s,store_type:%s,store_operation:%s"):format(store_name, store_type, method_name); | |
14 else | |
15 metric_name = store_name.."_"..store_type.."_"..method_name; | |
16 end | |
17 local measure_operation_started = module:measure(metric_name, metric_tags); | |
18 | |
19 return function (...) | |
20 module:log("debug", "Measuring storage operation %s (%s)", metric_name, metric_tags or "no tags"); | |
21 local measure_operation_complete = measure_operation_started(); | |
22 return return_args_after_calling(measure_operation_complete, method_function(...)); | |
23 end; | |
24 end | |
25 | |
26 local function wrap_store(module, store_name, store_type, store) | |
27 local new_store = setmetatable({}, { | |
28 __index = function (t, method_name) | |
29 local original_method = store[method_name]; | |
30 if type(original_method) ~= "function" then | |
31 if original_method then | |
32 rawset(t, method_name, original_method); | |
33 end | |
34 return original_method; | |
35 end | |
36 local timed_method = time_method(module, store_name, store_type, method_name, original_method); | |
37 rawset(t, method_name, timed_method); | |
38 return timed_method; | |
39 end; | |
40 }); | |
41 return new_store; | |
42 end | |
43 | |
44 local function hook_event(module) | |
45 module:hook("store-opened", function(event) | |
46 event.store = wrap_store(module, event.store_name, event.store_type, event.store); | |
47 end); | |
48 end | |
49 | |
50 function module.load() | |
51 hook_event(module); | |
52 end | |
53 | |
54 function module.add_host(module) | |
55 hook_event(module); | |
56 end |