view mod_measure_process/mod_measure_process.lua @ 4738:5aee8d86629a

mod_bookmarks2: Fix handling of nick and password elements This form of child retrieval fails when the stanza elements internally don't have an 'xmlns' attribute, which can happen sometimes for some reason, including when they have been constructed via the stanza builder API. When that is the case then the explicit namespace arguemnt does not match the nil value of the internal attribute. Calling `:get_child()` without the namespace argument does the right thing here, with both nil and the parent namespace as valid values for the internal attribute.
author Kim Alvefur <zash@zash.se>
date Wed, 03 Nov 2021 21:11:55 +0100
parents 025cf93acfe9
children adc6241e5d16
line wrap: on
line source

module:set_global()

local get_cpu_time = os.clock

local custom_metric = require "core.statsmanager".metric
local cpu_time = custom_metric(
	"counter", "process_cpu", "seconds",
	"CPU time used by Prosody as reported by clock(3)."
):with_labels()

local lfs = require "lfs"

module:hook("stats-update", function ()
	cpu_time:set(get_cpu_time())
end);

if lfs.attributes("/proc/self/statm", "mode") == "file" then
	local pagesize = module:get_option_number("memory_pagesize", 4096); -- getconf PAGESIZE

	local vsz = custom_metric(
		"gauge", "process_virtual_memory", "bytes",
		"Virtual memory size in bytes."
	):with_labels()
	local rss = custom_metric(
		"gauge", "process_resident_memory", "bytes",
		"Resident memory size in bytes."
	):with_labels()

	module:hook("stats-update", function ()
		local statm, err = io.open("/proc/self/statm");
		if not statm then
			module:log("error", tostring(err));
			return;
		end
		-- virtual memory (caches, opened librarys, everything)
		vsz:set(statm:read("*n") * pagesize);
		-- resident set size (actually used memory)
		rss:set(statm:read("*n") * pagesize);
		statm:close();
	end);
end

if lfs.attributes("/proc/self/fd", "mode") == "directory" then
	local open_fds = custom_metric(
		"gauge", "process_open_fds", "",
		"Number of open file descriptors."
	):with_labels()

	local has_posix, posix = pcall(require, "util.pposix")
	local max_fds
	if has_posix then
		max_fds = custom_metric(
			"gauge", "process_max_fds", "",
			"Maximum number of open file descriptors"
		):with_labels()
	else
		module:log("warn", "not reporting maximum number of file descriptors because mod_posix is not available")
	end

	module:hook("stats-update", function ()
		local count = 0
		for _ in lfs.dir("/proc/self/fd") do
			count = count + 1
		end
		open_fds:set(count)

		if has_posix then
			local ok, soft, hard = posix.getrlimit("NOFILE")
			if ok then
				max_fds:set(hard)
			end
		end
	end);
end