# HG changeset patch # User Emmanuel Gil Peyrot # Date 1529620314 -7200 # Node ID ddd39ca7b953a346d284b67bde62a52a17e521f6 # Parent c47cd8dbd310b716575932ba8c920edf1a9b9ed8 mod_prometheus: Change the storage model for one which matches Prometheus better. diff -r c47cd8dbd310 -r ddd39ca7b953 mod_prometheus/mod_prometheus.lua --- a/mod_prometheus/mod_prometheus.lua Fri Jun 22 00:28:59 2018 +0200 +++ b/mod_prometheus/mod_prometheus.lua Fri Jun 22 00:31:54 2018 +0200 @@ -8,14 +8,11 @@ module:depends "http"; local tostring = tostring; -local s_format = string.format; local t_insert = table.insert; local t_concat = table.concat; local socket = require "socket"; -local mt = require "util.multitable"; -local meta = mt.new(); meta.data = module:shared"meta"; -local data = mt.new(); data.data = module:shared"data"; +local data = {}; local function escape(text) return text:gsub("\\", "\\\\"):gsub("\"", "\\\""):gsub("\n", "\\n"); @@ -65,13 +62,14 @@ module:hook("stats-updated", function (event) local all_stats, this = event.stats_extra; - local host, sect, name, typ, key; - for stat, value in pairs(event.changed_stats) do + local host, sect, name, typ; + data = {}; + for stat, value in pairs(event.stats) do this = all_stats[stat]; -- module:log("debug", "changed_stats[%q] = %s", stat, tostring(value)); host, sect, name, typ = stat:match("^/([^/]+)/([^/]+)/(.+):(%a+)$"); if host == nil then - sect, name, typ, host = stat:match("^([^.]+)%.([^:]+):(%a+)$"); + sect, name, typ = stat:match("^([^.]+)%.(.+):(%a+)$"); elseif host == "*" then host = nil; end @@ -80,23 +78,21 @@ elseif sect:find("^mod_statistics_.") then sect = sect:sub(16); end - key = escape_name(s_format("%s_%s_%s", host or "global", sect, typ)); - if not meta:get(key) then - if host then - meta:set(key, "", "graph_title", s_format("%s %s on %s", sect, typ, host)); - else - meta:set(key, "", "graph_title", s_format("Global %s %s", sect, typ, host)); - end - meta:set(key, "", "graph_vlabel", this and this.units or typ); - meta:set(key, "", "graph_category", sect); - - meta:set(key, name, "label", name); - elseif not meta:get(key, name, "label") then - meta:set(key, name, "label", name); + local key = escape_name("prosody_"..sect.."_"..name); + local field = { + value = value, + labels = {}, + -- TODO: Use the other types where it makes sense. + typ = (typ == "rate" and "counter" or "gauge"), + }; + if host then + field.labels.host = host; end - - data:set(key, name, value); + if data[key] == nil then + data[key] = {}; + end + t_insert(data[key], field); end end); @@ -106,12 +102,11 @@ local answer = {}; local timestamp = tostring(get_timestamp()); - for section, content in pairs(data.data) do - for key, value in pairs(content) do - local name = "prosody_"..section.."_"..key; - t_insert(answer, repr_help(name, "TODO: add a description here.")); - t_insert(answer, repr_type(name, "gauge")); - t_insert(answer, repr_sample(name, {}, value, timestamp)); + for key, fields in pairs(data) do + t_insert(answer, repr_help(key, "TODO: add a description here.")); + t_insert(answer, repr_type(key, fields[1].typ)); + for _, field in pairs(fields) do + t_insert(answer, repr_sample(key, field.labels, field.value, timestamp)); end end return t_concat(answer, "");