# HG changeset patch # User Jonas Schäfer # Date 1619590815 -7200 # Node ID 7e5c8186f121ebb17525150dcf67be1a60dfa36b # Parent c87181a98f292d0abb63096f6d11fd73131b66c6 mod_munin: Port to new OpenMetrics based statistics module diff -r c87181a98f29 -r 7e5c8186f121 mod_munin/mod_munin.lua --- a/mod_munin/mod_munin.lua Mon Apr 26 02:49:25 2021 +0200 +++ b/mod_munin/mod_munin.lua Wed Apr 28 08:20:15 2021 +0200 @@ -1,6 +1,8 @@ module:set_global(); local s_format = string.format; +local t_insert = table.insert; +local t_concat = table.concat; local array = require"util.array"; local it = require"util.iterators"; local mt = require"util.multitable"; @@ -119,6 +121,80 @@ end end); +local function openmetrics_handler(event) + local registry = event.metric_registry + local host, sect, name, typ, key; + for family_name, metric_family in pairs(registry:get_metric_families()) do + if not ignore_stats:contains(family_name) then + -- module:log("debug", "changed_stats[%q] = %s", stat, tostring(value)); + local host_key + if metric_family.label_keys[1] == "host" then + host_key = 1 + end + if family_name:sub(1, 12) == "prosody_mod_" then + sect, name = family_name:match("^prosody_mod_([^/]+)/(.+)$") + else + sect, name = family_name:match("^([^_]+)_(.+)$") + end + name = clean_fieldname(name) + + local metric_type = metric_family.type_ + if metric_type == "gauge" or metric_type == "unknown" then + typ = "GAUGE" + else + typ = "DCOUNTER" + end + + for labelset, metric in metric_family:iter_metrics() do + host = host_key and labelset[host_key] or "global" + local name_parts = {} + for i, label in ipairs(labelset) do + if i ~= host_key then + t_insert(name_parts, label) + end + end + local full_name = t_concat(name_parts, "_") + local display_name = #name_parts > 0 and full_name or name + key = clean_fieldname(s_format("%s_%s_%s", host or "global", sect, name)); + + local unit + local factor = 1 + unit = metric_family.unit + if unit == "seconds" and typ == "DCOUNTER" then + factor = 100 + unit = "%time" + elseif typ == "DCOUNTER" then + unit = unit .. "/s" + end + + if not meta:get(key, "") then + meta:set(key, "", "graph_title", s_format(metric_family.description)); + if unit ~= "" then + meta:set(key, "", "graph_vlabel", unit); + end + meta:set(key, "", "graph_category", sect); + end + if not meta:get(key, display_name) then + meta:set(key, display_name, "label", display_name); + meta:set(key, display_name, "type", typ) + end + + for suffix, extra_labels, value in metric:iter_samples() do + if metric_type == "histogram" or metric_type == "summary" then + if suffix == "_sum" then + data:set(key, display_name, value * factor) + end + elseif suffix == "_total" or suffix == "" then + data:set(key, display_name, value * factor) + end + end + end + end + end +end + +module:hook("openmetrics-updated", openmetrics_handler); + module:provides("net", { listener = munin_listener; default_mode = "*l";