Software /
code /
prosody
Diff
core/statsmanager.lua @ 7533:4ef37ac69562
statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 29 Jul 2016 13:20:02 +0100 |
parent | 7524:b6f32bb3b584 |
child | 7664:4f145a9f1477 |
line wrap: on
line diff
--- a/core/statsmanager.lua Fri Jul 29 11:24:28 2016 +0200 +++ b/core/statsmanager.lua Fri Jul 29 13:20:02 2016 +0100 @@ -4,42 +4,53 @@ local timer = require "util.timer"; local fire_event = prosody.events.fire_event; -local stats_config = config.get("*", "statistics_interval"); -local stats_interval = tonumber(stats_config); +local stats_interval_config = config.get("*", "statistics_interval"); +local stats_interval = tonumber(stats_interval_config); 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 stats_provider_name; +local stats_provider_config = config.get("*", "statistics"); +local stats_provider = stats_provider_config; + +if not stats_provider and stats_interval then + stats_provider = "internal"; +elseif stats_provider and not stats_interval then + stats_interval = 60; +end local builtin_providers = { internal = "util.statistics"; statsd = "util.statsd"; }; -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"]; + +local stats, stats_err = false, nil; + +if stats_provider then + if stats_provider:sub(1,1) == ":" then + stats_provider = stats_provider:sub(2); + stats_provider_name = "external "..stats_provider; + elseif stats_provider then + stats_provider_name = "built-in "..stats_provider; + stats_provider = builtin_providers[stats_provider]; + if not stats_provider then + log("error", "Unrecognized statistics provider '%s', statistics will be disabled", stats_provider_config); + end + end + + local have_stats_provider, stats_lib = pcall(require, stats_provider); + 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); + stats_provider_name = stats_lib._NAME or stats_provider_name; 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 +if stats == nil then log("error", "Error loading statistics provider '%s': %s", stats_provider, stats_err); end @@ -53,51 +64,47 @@ local f = assert(stats[type], "unknown stat type: "..type); return f(name); end + + if stats_interval then + log("debug", "Statistics enabled using %s provider, collecting every %d seconds", stats_provider_name, stats_interval); + + 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"); + mark_collection_done(); + + if stats.get_stats then + 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 + 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(); + end + return stats_interval; + end + timer.add_task(stats_interval, collect); + prosody.events.add_handler("server-started", function () collect() end, -1); + else + log("debug", "Statistics enabled using %s provider, collection is disabled", stats_provider_name); + end +else + log("debug", "Statistics disabled"); + function measure() return measure; end end -if stats_interval then - log("debug", "Statistics collection is enabled every %d seconds", stats_interval); - - 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"); - mark_collection_done(); - - if stats.get_stats then - 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 - 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(); - end - return stats_interval; - end - timer.add_task(stats_interval, collect); - prosody.events.add_handler("server-started", function () collect() end, -1); -end - -if not stats_interval and stats_provider == "util.statistics" then - log("debug", "Statistics collection is disabled"); - -- nop - function measure() - return measure; - end - function collect() - end -end return { measure = measure;