mod_munin/mod_munin.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 4557 7e5c8186f121
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
module:set_global();
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local s_format = string.format;
4557
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
     4
local t_insert = table.insert;
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
     5
local t_concat = table.concat;
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local array = require"util.array";
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
local it = require"util.iterators";
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local mt = require"util.multitable";
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local meta = mt.new(); meta.data = module:shared"meta";
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local data = mt.new(); data.data = module:shared"data";
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local munin_listener = {};
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local munin_commands = {};
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
local node_name = module:get_option_string("munin_node_name", "localhost");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
local ignore_stats = module:get_option_set("munin_ignored_stats", { });
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
local function clean_fieldname(name)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	return (name:gsub("[^A-Za-z0-9_]", "_"):gsub("^[^A-Za-z_]", "_%1"));
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
function munin_listener.onconnect(conn)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	-- require"core.statsmanager".collect();
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	conn:write("# munin node at "..node_name.."\n");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
function munin_listener.onincoming(conn, line)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
	line = line and line:match("^[^\r\n]+");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	if type(line) ~= "string" then return end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
	-- module:log("debug", "incoming: %q", line);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
	local command = line:match"^%w+";
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	command = munin_commands[command];
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
	if not command then
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
		conn:write("# Unknown command.\n");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
		return;
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
	end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
	local ok, err = pcall(command, conn, line);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
	if not ok then
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
		module:log("error", "Error running %q: %s", line, err);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
		conn:close();
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
	end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
function munin_listener.ondisconnect() end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
function munin_commands.cap(conn)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
	conn:write("cap\n");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
1652
648ce9087902 mod_munin: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1628
diff changeset
    51
function munin_commands.list(conn)
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	conn:write(array(it.keys(data.data)):concat(" ") .. "\n");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
function munin_commands.config(conn, line)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
	-- TODO what exactly?
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
	local stat = line:match("%s(%S+)");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
	if not stat then conn:write("# Unknown service\n.\n"); return end
1652
648ce9087902 mod_munin: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1628
diff changeset
    59
	for _, _, k, value in meta:iter(stat, "", nil) do
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
		conn:write(s_format("%s %s\n", k, value));
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
	end
1652
648ce9087902 mod_munin: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1628
diff changeset
    62
	for _, name, k, value in meta:iter(stat, nil, nil) do
1680
accbf0db0246 mod_munin: Exclude ignored stats even if they happen to be included in data
Kim Alvefur <zash@zash.se>
parents: 1652
diff changeset
    63
		if name ~= "" and not ignore_stats:contains(name) then
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
			conn:write(s_format("%s.%s %s\n", name, k, value));
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
		end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
	end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
	conn:write(".\n");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
function munin_commands.fetch(conn, line)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
	local stat = line:match("%s(%S+)");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
	if not stat then conn:write("# Unknown service\n.\n"); return end
1652
648ce9087902 mod_munin: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1628
diff changeset
    73
	for _, name, value in data:iter(stat, nil) do
1680
accbf0db0246 mod_munin: Exclude ignored stats even if they happen to be included in data
Kim Alvefur <zash@zash.se>
parents: 1652
diff changeset
    74
		if not ignore_stats:contains(name) then
1696
44ddec97ad82 mod_munin: Use string.format flag instead of tostring when reporting values
Kim Alvefur <zash@zash.se>
parents: 1680
diff changeset
    75
			conn:write(s_format("%s.value %.12f\n", name, value));
1680
accbf0db0246 mod_munin: Exclude ignored stats even if they happen to be included in data
Kim Alvefur <zash@zash.se>
parents: 1652
diff changeset
    76
		end
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
	end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	conn:write(".\n");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
function munin_commands.quit(conn)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
	conn:close();
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
module:hook("stats-updated", function (event)
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
	local all_stats, this = event.stats_extra;
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
	local host, sect, name, typ, key;
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
	for stat, value in pairs(event.changed_stats) do
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
		if not ignore_stats:contains(stat) then
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
			this = all_stats[stat];
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
			-- module:log("debug", "changed_stats[%q] = %s", stat, tostring(value));
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
			host, sect, name, typ = stat:match("^/([^/]+)/([^/]+)/(.+):(%a+)$");
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
			if host == nil then
3134
c47cd8dbd310 mod_munin: Allow names containing any number of “:”.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3133
diff changeset
    94
				sect, name, typ = stat:match("^([^.]+)%.(.+):(%a+)$");
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
			elseif host == "*" then
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
				host = nil;
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
			end
1902
d85ddd3e588a mod_munin: Fix syntax error
Kim Alvefur <zash@zash.se>
parents: 1901
diff changeset
    98
			if sect:find("^mod_measure_.") then
1901
effd909d05b0 mod_munin: Strip mod_measure_ and mod_statistics_ from section names
Kim Alvefur <zash@zash.se>
parents: 1696
diff changeset
    99
				sect = sect:sub(13);
1902
d85ddd3e588a mod_munin: Fix syntax error
Kim Alvefur <zash@zash.se>
parents: 1901
diff changeset
   100
			elseif sect:find("^mod_statistics_.") then
1901
effd909d05b0 mod_munin: Strip mod_measure_ and mod_statistics_ from section names
Kim Alvefur <zash@zash.se>
parents: 1696
diff changeset
   101
				sect = sect:sub(16);
effd909d05b0 mod_munin: Strip mod_measure_ and mod_statistics_ from section names
Kim Alvefur <zash@zash.se>
parents: 1696
diff changeset
   102
			end
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
			key = clean_fieldname(s_format("%s_%s_%s", host or "global", sect, typ));
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
			if not meta:get(key) then
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   106
				if host then
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   107
					meta:set(key, "", "graph_title", s_format("%s %s on %s", sect, typ, host));
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   108
				else
3133
2ffc268ba2fa mod_munin: Don’t use host when it is nil.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 1902
diff changeset
   109
					meta:set(key, "", "graph_title", s_format("Global %s %s", sect, typ));
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
				end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   111
				meta:set(key, "", "graph_vlabel", this and this.units or typ);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   112
				meta:set(key, "", "graph_category", sect);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   113
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   114
				meta:set(key, name, "label", name);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   115
			elseif not meta:get(key, name, "label") then
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   116
				meta:set(key, name, "label", name);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   117
			end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   118
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   119
			data:set(key, name, value);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   120
		end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   121
	end
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   122
end);
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   123
4557
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   124
local function openmetrics_handler(event)
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   125
	local registry = event.metric_registry
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   126
	local host, sect, name, typ, key;
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   127
	for family_name, metric_family in pairs(registry:get_metric_families()) do
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   128
		if not ignore_stats:contains(family_name) then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   129
			-- module:log("debug", "changed_stats[%q] = %s", stat, tostring(value));
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   130
			local host_key
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   131
			if metric_family.label_keys[1] == "host" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   132
				host_key = 1
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   133
			end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   134
			if family_name:sub(1, 12) == "prosody_mod_" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   135
				sect, name = family_name:match("^prosody_mod_([^/]+)/(.+)$")
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   136
			else
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   137
				sect, name = family_name:match("^([^_]+)_(.+)$")
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   138
			end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   139
			name = clean_fieldname(name)
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   140
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   141
			local metric_type = metric_family.type_
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   142
			if metric_type == "gauge" or metric_type == "unknown" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   143
				typ = "GAUGE"
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   144
			else
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   145
				typ = "DCOUNTER"
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   146
			end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   147
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   148
			for labelset, metric in metric_family:iter_metrics() do
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   149
				host = host_key and labelset[host_key] or "global"
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   150
				local name_parts = {}
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   151
				for i, label in ipairs(labelset) do
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   152
					if i ~= host_key then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   153
						t_insert(name_parts, label)
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   154
					end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   155
				end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   156
				local full_name = t_concat(name_parts, "_")
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   157
				local display_name = #name_parts > 0 and full_name or name
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   158
				key = clean_fieldname(s_format("%s_%s_%s", host or "global", sect, name));
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   159
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   160
				local unit
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   161
				local factor = 1
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   162
				unit = metric_family.unit
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   163
				if unit == "seconds" and typ == "DCOUNTER" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   164
					factor = 100
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   165
					unit = "%time"
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   166
				elseif typ == "DCOUNTER" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   167
					unit = unit .. "/s"
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   168
				end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   169
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   170
				if not meta:get(key, "") then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   171
					meta:set(key, "", "graph_title", s_format(metric_family.description));
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   172
					if unit ~= "" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   173
						meta:set(key, "", "graph_vlabel", unit);
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   174
					end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   175
					meta:set(key, "", "graph_category", sect);
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   176
				end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   177
				if not meta:get(key, display_name) then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   178
					meta:set(key, display_name, "label", display_name);
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   179
					meta:set(key, display_name, "type", typ)
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   180
				end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   181
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   182
				for suffix, extra_labels, value in metric:iter_samples() do
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   183
					if metric_type == "histogram" or metric_type == "summary" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   184
						if suffix == "_sum" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   185
							data:set(key, display_name, value * factor)
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   186
						end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   187
					elseif suffix == "_total" or suffix == "" then
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   188
						data:set(key, display_name, value * factor)
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   189
					end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   190
				end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   191
			end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   192
		end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   193
	end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   194
end
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   195
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   196
module:hook("openmetrics-updated", openmetrics_handler);
7e5c8186f121 mod_munin: Port to new OpenMetrics based statistics module
Jonas Schäfer <jonas@wielicki.name>
parents: 3134
diff changeset
   197
1628
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   198
module:provides("net", {
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   199
	listener = munin_listener;
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   200
	default_mode = "*l";
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   201
	default_port = 4949;
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   202
});
0f20390f6fa5 mod_munin: Implementation of the Munin collection protocol
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   203