aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2016-07-27 14:04:36 +0100
committerMatthew Wild <mwild1@gmail.com>2016-07-27 14:04:36 +0100
commit0f8377e56a0fa4e6a46c96195445aeee07557c58 (patch)
tree5f7181b418ab7745db5d08dca082453032d06fec /core
parent5a7fc4ca74e70358290640312859a603aa580838 (diff)
downloadprosody-0f8377e56a0fa4e6a46c96195445aeee07557c58.tar.gz
prosody-0f8377e56a0fa4e6a46c96195445aeee07557c58.zip
statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Diffstat (limited to 'core')
-rw-r--r--core/statsmanager.lua92
1 files changed, 65 insertions, 27 deletions
diff --git a/core/statsmanager.lua b/core/statsmanager.lua
index 7771a2b3..d103c6a7 100644
--- a/core/statsmanager.lua
+++ b/core/statsmanager.lua
@@ -1,5 +1,4 @@
-local stats = require "util.statistics".new();
local config = require "core.configmanager";
local log = require "util.logger".init("stats");
local timer = require "util.timer";
@@ -11,46 +10,86 @@ if stats_config and not stats_interval then
log("error", "Invalid 'statistics_interval' setting, statistics will be disabled");
end
+local stats_provider_config = config.get("*", "statistics_provider");
+local stats_provider = stats_provider_config or "internal";
+
+local builtin_providers = {
+ internal = "util.statistics";
+};
+
+if stats_provider:match("^library:") then
+ stats_provider = stats_provider:match(":(.+)$");
+else
+ stats_provider = builtin_providers[stats_provider];
+ if not stats_provider then
+ log("error", "Unrecognized built-in statistics provider '%s', using internal instead", stats_provider_config);
+ stats_provider = builtin_providers["internal"];
+ end
+end
+
+local have_stats_provider, stats_lib = pcall(require, stats_provider);
+
+local stats, stats_err;
+
+if not have_stats_provider then
+ stats, stats_err = nil, stats_lib;
+else
+ local stats_config = config.get("*", "statistics_config");
+ stats, stats_err = stats_lib.new(stats_config);
+end
+
+if not stats then
+ log("error", "Error loading statistics provider '%s': %s", stats_provider, stats_err);
+end
+
local measure, collect;
local latest_stats = {};
local changed_stats = {};
local stats_extra = {};
-if stats_interval then
- log("debug", "Statistics collection is enabled every %d seconds", stats_interval);
+if stats then
function measure(type, name)
local f = assert(stats[type], "unknown stat type: "..type);
return f(name);
end
+end
- local mark_collection_start = measure("times", "stats.collection");
- local mark_processing_start = measure("times", "stats.processing");
+if stats_interval then
+ if stats.get_stats then
+ log("debug", "Statistics collection is enabled every %d seconds", stats_interval);
- function collect()
- local mark_collection_done = mark_collection_start();
- fire_event("stats-update");
- changed_stats, stats_extra = {}, {};
- for stat_name, getter in pairs(stats.get_stats()) do
- local type, value, extra = getter();
- local old_value = latest_stats[stat_name];
- latest_stats[stat_name] = value;
- if value ~= old_value then
- changed_stats[stat_name] = value;
- end
- if extra then
- stats_extra[stat_name] = extra;
+ local mark_collection_start = measure("times", "stats.collection");
+ local mark_processing_start = measure("times", "stats.processing");
+
+ function collect()
+ local mark_collection_done = mark_collection_start();
+ fire_event("stats-update");
+ changed_stats, stats_extra = {}, {};
+ for stat_name, getter in pairs(stats.get_stats()) do
+ local type, value, extra = getter();
+ local old_value = latest_stats[stat_name];
+ latest_stats[stat_name] = value;
+ if value ~= old_value then
+ changed_stats[stat_name] = value;
+ end
+ if extra then
+ stats_extra[stat_name] = extra;
+ end
end
+ mark_collection_done();
+ local mark_processing_done = mark_processing_start();
+ fire_event("stats-updated", { stats = latest_stats, changed_stats = changed_stats, stats_extra = stats_extra });
+ mark_processing_done();
+ return stats_interval;
end
- mark_collection_done();
- local mark_processing_done = mark_processing_start();
- fire_event("stats-updated", { stats = latest_stats, changed_stats = changed_stats, stats_extra = stats_extra });
- mark_processing_done();
- return stats_interval;
+ timer.add_task(stats_interval, collect);
+ prosody.events.add_handler("server-started", function () collect() end, -1);
+ else
+ log("error", "statistics_interval specified, but the selected statistics_provider (%s) does not support statistics collection", stats_provider_config or "internal");
end
+end
- timer.add_task(stats_interval, collect);
- prosody.events.add_handler("server-started", function () collect() end, -1);
-else
+if not stats_interval and stats_provider == "util.statistics" then
log("debug", "Statistics collection is disabled");
-- nop
function measure()
@@ -62,7 +101,6 @@ end
return {
measure = measure;
- collect = collect;
get_stats = function ()
return latest_stats, changed_stats, stats_extra;
end;