IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
prosody/util/statsd.lua

84 lines
2.0 KiB

local socket = require "socket";
local time = require "util.time".now
local function new(config)
if not config or not config.statsd_server then
return nil, "No statsd server specified in the config, please see https://prosody.im/doc/statistics";
end
local sock = socket.udp();
sock:setpeername(config.statsd_server, config.statsd_port or 8125);
local prefix = (config.prefix or "prosody")..".";
local function send_metric(s)
return sock:send(prefix..s);
end
local function send_gauge(name, amount, relative)
local s_amount = tostring(amount);
if relative and amount > 0 then
s_amount = "+"..s_amount;
end
return send_metric(name..":"..s_amount.."|g");
end
local function send_counter(name, amount)
return send_metric(name..":"..tostring(amount).."|c");
end
local function send_duration(name, duration)
return send_metric(name..":"..tostring(duration).."|ms");
end
local function send_histogram_sample(name, sample)
return send_metric(name..":"..tostring(sample).."|h");
end
local methods;
methods = {
amount = function (name, conf)
if conf and conf.initial then
send_gauge(name, conf.initial);
end
return function (new_v) send_gauge(name, new_v); end
end;
counter = function (name, conf) --luacheck: ignore 212/conf
return function (delta)
send_gauge(name, delta, true);
end;
end;
rate = function (name)
return function ()
send_counter(name, 1);
end;
end;
distribution = function (name, conf) --luacheck: ignore 212/conf
return function (value)
send_histogram_sample(name, value);
end;
end;
sizes = function (name)
name = name.."_size";
return function (value)
send_histogram_sample(name, value);
end;
end;
times = function (name)
return function ()
local start_time = time();
return function ()
local end_time = time();
local duration = end_time - start_time;
send_duration(name, duration*1000);
end
end;
end;
};
return methods;
end
return {
new = new;
}