mod_measure_modules/mod_measure_modules.lua
author Kim Alvefur <zash@zash.se>
Fri, 06 Oct 2023 18:34:39 +0200
changeset 5672 ecfd7aece33b
permissions -rw-r--r--
mod_measure_modules: Report module statuses via OpenMetrics Someone in the chat asked about a health check endpoint, which reminded me of mod_http_status, which provides access to module statuses with full details. After that, this idea came about, which seems natural. As noted in the README, it could be used to monitor that critical modules are in fact loaded correctly. As more modules use the status API, the more useful this module and mod_http_status becomes.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5672
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
module:set_global();
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local mm = require "core.modulemanager";
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local sm = require "core.statsmanager";
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local measure_status = sm.metric("gauge", "prosody_module_status", "", "Prosody module status", { "host"; "module" });
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local status_priorities = { error = 3; warn = 2; info = 1; core = 0 };
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
function module.add_host(module)
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
	local measure = measure_status:with_partial_label(module.host);
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
	if module.global then
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
		measure = measure_status:with_partial_label(":global");
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
	end
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
	-- Already loaded modules
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
	local modules = mm.get_modules(module.host);
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
	for name, mod in pairs(modules) do
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
		measure:with_labels(name):set(status_priorities[mod.module.status_type] or 0);
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
	end
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
	-- TODO hook module load and unload
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	-- Future changes
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
	module:hook("module-status/updated", function(event)
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
		local mod = mm.get_module(event.name);
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
		measure:with_labels(event.name):set(status_priorities[mod and mod.module.status_type] or 0);
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
	end);
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
end
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
ecfd7aece33b mod_measure_modules: Report module statuses via OpenMetrics
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
module:add_host(); -- Initialize global context