mod_debug_traceback/mod_debug_traceback.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 4226 02292b892fce
child 5854 0358fcf14cd6
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4218
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
module:set_global();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local traceback = require "util.debug".traceback;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
local pposix = require "util.pposix";
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
local os_date = os.date;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
local render_filename = require "util.interpolation".new("%b{}", function (s) return s; end, {
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
	yyyymmdd = function (t)
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
		return os_date("%Y%m%d", t);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
	end;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
	hhmmss = function (t)
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
		return os_date("%H%M%S", t);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	end;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
});
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
local count = 0;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
local function get_filename(filename_template)
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
	filename_template = filename_template;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
	return render_filename(filename_template, {
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
		paths = prosody.paths;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
		pid = pposix.getpid();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
		count = count;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
		time = os.time();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
	});
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
end
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
local default_filename_template = "{paths.data}/traceback-{pid}-{count}.log";
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
local filename_template = module:get_option_string("debug_traceback_filename", default_filename_template);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
local signal_name = module:get_option_string("debug_traceback_signal", "SIGUSR1");
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
function dump_traceback()
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
	module:log("info", "Received %s, writing traceback", signal_name);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
	local tb = traceback();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
	module:fire_event("debug_traceback/triggered", { traceback = tb });
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
	local f, err = io.open(get_filename(filename_template), "a+");
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
	if not f then
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
		module:log("error", "Unable to write traceback: %s", err);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
		return;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
	end
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
	f:write("-- Traceback generated at ", os.date("%b %d %H:%M:%S"), " --\n");
4221
983565f42063 mod_debug_traceback: Fix to use the cached traceback
Matthew Wild <mwild1@gmail.com>
parents: 4218
diff changeset
    43
	f:write(tb, "\n");
4218
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
	f:write("-- End of traceback --\n");
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
	f:close();
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
	count = count + 1;
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
end
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
local mod_posix = module:depends("posix");
4226
02292b892fce mod_debug_traceback: Fix global lookup warning on 0.11.x
Matthew Wild <mwild1@gmail.com>
parents: 4221
diff changeset
    50
if rawget(mod_posix, "features") and mod_posix.features.signal_events then
4218
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
	module:hook("signal/"..signal_name, dump_traceback);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
else
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
	require"util.signal".signal(signal_name, dump_traceback);
5841d54cb6c6 mod_debug_traceback: Descendent of mod_traceback with some additional features
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
end