# HG changeset patch # User Matthew Wild # Date 1469624770 -3600 # Node ID ebf2e77ac8a7d5350969f05d84ea4e6f9914a836 # Parent 1c8b63fe6472be3745d9010ce57a0932153c5706 statsmanager, util.statsd: Add built-in statsd provider diff -r 1c8b63fe6472 -r ebf2e77ac8a7 core/statsmanager.lua --- a/core/statsmanager.lua Wed Jul 27 14:04:36 2016 +0100 +++ b/core/statsmanager.lua Wed Jul 27 14:06:10 2016 +0100 @@ -15,6 +15,7 @@ local builtin_providers = { internal = "util.statistics"; + statsd = "util.statsd"; }; if stats_provider:match("^library:") then diff -r 1c8b63fe6472 -r ebf2e77ac8a7 util/statsd.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/statsd.lua Wed Jul 27 14:06:10 2016 +0100 @@ -0,0 +1,84 @@ +local socket = require "socket"; + +local time = require "socket".gettime; + +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, initial) + if initial then + send_gauge(name, initial); + end + return function (new_v) send_gauge(name, new_v); end + end; + counter = function (name, initial) + return function (delta) + send_gauge(name, delta, true); + end; + end; + rate = function (name) + return function () + send_counter(name, 1); + end; + end; + distribution = function (name, unit, type) --luacheck: ignore 212/unit 212/type + 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; +}