annotate mod_measure_storage/mod_measure_storage.lua @ 4249:64aa1d9d70ac

mod_rest: Catch and log errors in callback promise chain From the code it looks like it should be possible to reply to an error stanza, but it did not. Turns out I was saved by my local developer mode module which throws errors if an attempt is made to create an errror reply to an error stanza. However nothing collects this error from the promise, so all I got was confusion.
author Kim Alvefur <zash@zash.se>
date Sun, 15 Nov 2020 16:25:49 +0100
parents 04ae5b45e6c7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2297
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 module:set_global()
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local function return_args_after_calling(f, ...)
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 f();
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 return ...
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 end
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local function time_method(module, store_name, store_type, method_name, method_function)
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local opt_use_tags = module:get_option_boolean("measure_storage_tagged_metric", false);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local metric_name, metric_tags;
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 if opt_use_tags then
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 metric_name, metric_tags = "storage_operation", ("store_name:%s,store_type:%s,store_operation:%s"):format(store_name, store_type, method_name);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 else
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 metric_name = store_name.."_"..store_type.."_"..method_name;
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 end
2686
39cb2a51e779 mod_measure_storage: Pass the measurement type, fixes traceback
Kim Alvefur <zash@zash.se>
parents: 2297
diff changeset
17 local measure_operation_started = module:measure(metric_name, "times", metric_tags);
2297
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 return function (...)
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 module:log("debug", "Measuring storage operation %s (%s)", metric_name, metric_tags or "no tags");
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 local measure_operation_complete = measure_operation_started();
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 return return_args_after_calling(measure_operation_complete, method_function(...));
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 end;
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 end
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local function wrap_store(module, store_name, store_type, store)
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 local new_store = setmetatable({}, {
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 __index = function (t, method_name)
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local original_method = store[method_name];
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 if type(original_method) ~= "function" then
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 if original_method then
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 rawset(t, method_name, original_method);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 end
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 return original_method;
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 end
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local timed_method = time_method(module, store_name, store_type, method_name, original_method);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 rawset(t, method_name, timed_method);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 return timed_method;
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 end;
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 });
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 return new_store;
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 end
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local function hook_event(module)
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 module:hook("store-opened", function(event)
2693
04ae5b45e6c7 mod_measure_storage: Assume store type is "keyval" if missing
Kim Alvefur <zash@zash.se>
parents: 2686
diff changeset
46 event.store = wrap_store(module, event.store_name, event.store_type or "keyval", event.store);
2297
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 end);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 end
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 function module.load()
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 hook_event(module);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 function module.add_host(module)
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 hook_event(module);
992e40dab31d mod_measure_storage: Experimental new module to measure storage API operations (requires 0.10)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 end