core/statsmanager.lua
author Matthew Wild <mwild1@gmail.com>
Sun, 17 Mar 2024 10:10:24 +0000
changeset 13464 a688947fab1e
parent 12976 ead41e25ebc0
permissions -rw-r--r--
mod_bosh: Set base_type on session This fixes a traceback with mod_saslauth. Ideally we move this to util.session at some point, though.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11579
diff changeset
     2
local config = require "prosody.core.configmanager";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11579
diff changeset
     3
local log = require "prosody.util.logger".init("stats");
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11579
diff changeset
     4
local timer = require "prosody.util.timer";
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
local fire_event = prosody.events.fire_event;
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11579
diff changeset
     6
local array = require "prosody.util.array";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11579
diff changeset
     7
local timed = require "prosody.util.openmetrics".timed;
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
     9
local stats_interval_config = config.get("*", "statistics_interval");
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    10
local stats_interval = tonumber(stats_interval_config);
11519
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
    11
if stats_interval_config and not stats_interval and stats_interval_config ~= "manual" then
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
	log("error", "Invalid 'statistics_interval' setting, statistics will be disabled");
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
end
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    15
local stats_provider_name;
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    16
local stats_provider_config = config.get("*", "statistics");
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    17
local stats_provider = stats_provider_config;
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    18
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    19
if not stats_provider and stats_interval then
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    20
	stats_provider = "internal";
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    21
elseif stats_provider and not stats_interval then
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    22
	stats_interval = 60;
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    23
end
11519
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
    24
if stats_interval_config == "manual" then
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
    25
	stats_interval = nil;
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
    26
end
7524
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    27
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    28
local builtin_providers = {
12976
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11579
diff changeset
    29
	internal = "prosody.util.statistics";
ead41e25ebc0 core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11579
diff changeset
    30
	statsd = "prosody.util.statsd";
7524
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    31
};
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    32
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    33
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    34
local stats, stats_err = false, nil;
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    35
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    36
if stats_provider then
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    37
	if stats_provider:sub(1,1) == ":" then
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    38
		stats_provider = stats_provider:sub(2);
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    39
		stats_provider_name = "external "..stats_provider;
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    40
	elseif stats_provider then
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    41
		stats_provider_name = "built-in "..stats_provider;
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    42
		stats_provider = builtin_providers[stats_provider];
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    43
		if not stats_provider then
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    44
			log("error", "Unrecognized statistics provider '%s', statistics will be disabled", stats_provider_config);
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    45
		end
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    46
	end
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    47
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    48
	local have_stats_provider, stats_lib = pcall(require, stats_provider);
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    49
	if not have_stats_provider then
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    50
		stats, stats_err = nil, stats_lib;
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    51
	else
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    52
		local stats_config = config.get("*", "statistics_config");
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    53
		stats, stats_err = stats_lib.new(stats_config);
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    54
		stats_provider_name = stats_lib._NAME or stats_provider_name;
7524
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    55
	end
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    56
end
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    57
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
    58
if stats == nil then
7524
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    59
	log("error", "Error loading statistics provider '%s': %s", stats_provider, stats_err);
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    60
end
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    61
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    62
local measure, collect, metric, cork, uncork;
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
7524
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
    64
if stats then
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    65
	function metric(type_, name, unit, description, labels, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    66
		local registry = stats.metric_registry
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    67
		local f = assert(registry[type_], "unknown metric family type: "..type_);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    68
		return f(registry, name, unit or "", description or "", labels, extra);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    69
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    70
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    71
	local function new_legacy_metric(stat_type, name, unit, description, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    72
		local label_keys = array()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    73
		local conf = extra or {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    74
		if fixed_label_key then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    75
			label_keys:push(fixed_label_key)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    76
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    77
		unit = unit or ""
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    78
		local mf = metric(stat_type, "prosody_" .. name, unit, description, label_keys, conf);
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    79
		if fixed_label_key then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    80
			mf = mf:with_partial_label(fixed_label_value)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    81
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    82
		return mf:with_labels()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    83
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    84
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    85
	local function unwrap_legacy_extra(extra, type_, name, unit)
11579
76d32b2ca5eb statsmanager: remove "legacy" wording
Jonas Schäfer <jonas@wielicki.name>
parents: 11527
diff changeset
    86
		local description = extra and extra.description or name.." "..type_
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    87
		unit = extra and extra.unit or unit
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    88
		return description, unit
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    89
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    90
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    91
	-- These wrappers provide the pre-OpenMetrics interface of statsmanager
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    92
	-- and moduleapi (module:measure).
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    93
	local legacy_metric_wrappers = {
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    94
		amount = function(name, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    95
			local initial = 0
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    96
			if type(extra) == "number" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    97
				initial = extra
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    98
			else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
    99
				initial = extra and extra.initial or initial
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   100
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   101
			local description, unit = unwrap_legacy_extra(extra, "amount", name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   102
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   103
			local m = new_legacy_metric("gauge", name, unit, description, fixed_label_key, fixed_label_value)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   104
			m:set(initial or 0)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   105
			return function(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   106
				m:set(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   107
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   108
		end;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   109
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   110
		counter = function(name, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   111
			if type(extra) == "number" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   112
				-- previous versions of the API allowed passing an initial
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   113
				-- value here; we do not allow that anymore, it is not a thing
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   114
				-- which makes sense with counters
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   115
				extra = nil
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   116
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   117
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   118
			local description, unit = unwrap_legacy_extra(extra, "counter", name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   119
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   120
			local m = new_legacy_metric("counter", name, unit, description, fixed_label_key, fixed_label_value)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   121
			m:set(0)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   122
			return function(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   123
				m:add(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   124
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   125
		end;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   126
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   127
		rate = function(name, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   128
			if type(extra) == "number" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   129
				-- previous versions of the API allowed passing an initial
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   130
				-- value here; we do not allow that anymore, it is not a thing
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   131
				-- which makes sense with counters
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   132
				extra = nil
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   133
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   134
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   135
			local description, unit = unwrap_legacy_extra(extra, "counter", name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   136
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   137
			local m = new_legacy_metric("counter", name, unit, description, fixed_label_key, fixed_label_value)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   138
			m:set(0)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   139
			return function()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   140
				m:add(1)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   141
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   142
		end;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   143
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   144
		times = function(name, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   145
			local conf = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   146
			if extra and extra.buckets then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   147
				conf.buckets = extra.buckets
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   148
			else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   149
				conf.buckets = { 0.001, 0.01, 0.1, 1.0, 10.0, 100.0 }
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   150
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   151
			local description, _ = unwrap_legacy_extra(extra, "times", name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   152
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   153
			local m = new_legacy_metric("histogram", name, "seconds", description, fixed_label_key, fixed_label_value, conf)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   154
			return function()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   155
				return timed(m)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   156
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   157
		end;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   158
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   159
		sizes = function(name, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   160
			local conf = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   161
			if extra and extra.buckets then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   162
				conf.buckets = extra.buckets
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   163
			else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   164
				conf.buckets = { 1024, 4096, 32768, 131072, 1048576, 4194304, 33554432, 134217728, 1073741824 }
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   165
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   166
			local description, _ = unwrap_legacy_extra(extra, "sizes", name)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   167
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   168
			local m = new_legacy_metric("histogram", name, "bytes", description, fixed_label_key, fixed_label_value, conf)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   169
			return function(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   170
				m:sample(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   171
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   172
		end;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   173
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   174
		distribution = function(name, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   175
			if type(extra) == "string" then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   176
				-- compat with previous API
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   177
				extra = { unit = extra }
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   178
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   179
			local description, unit = unwrap_legacy_extra(extra, "distribution", name, "")
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   180
			local m = new_legacy_metric("summary", name, unit, description, fixed_label_key, fixed_label_value)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   181
			return function(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   182
				m:sample(v)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   183
			end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   184
		end;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   185
	};
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   186
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   187
	-- Argument order switched here to support the legacy statsmanager.measure
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   188
	-- interface.
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   189
	function measure(stat_type, name, extra, fixed_label_key, fixed_label_value)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   190
		local wrapper = assert(legacy_metric_wrappers[stat_type], "unknown legacy metric type "..stat_type)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   191
		return wrapper(name, fixed_label_key, fixed_label_value, extra)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   192
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   193
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   194
	if stats.cork then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   195
		function cork()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   196
			return stats:cork()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   197
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   198
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   199
		function uncork()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   200
			return stats:uncork()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   201
		end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   202
	else
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   203
		function cork() end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   204
		function uncork() end
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   205
	end
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   206
11519
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   207
	if stats_interval or stats_interval_config == "manual" then
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   208
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   209
		local mark_collection_start = measure("times", "stats.collection");
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   210
		local mark_processing_start = measure("times", "stats.processing");
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   211
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   212
		function collect()
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   213
			local mark_collection_done = mark_collection_start();
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   214
			fire_event("stats-update");
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   215
			-- ensure that the backend is uncorked, in case it got stuck at
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   216
			-- some point, to avoid infinite resource use
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   217
			uncork()
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   218
			mark_collection_done();
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   219
			local manual_result = nil
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   220
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   221
			if stats.metric_registry then
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   222
				-- only if supported by the backend, we fire the event which
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   223
				-- provides the current metric values
11510
9a3ebdd65f9c core.statsmanager: Cover util.statistics work in processing measurement
Kim Alvefur <zash@zash.se>
parents: 10888
diff changeset
   224
				local mark_processing_done = mark_processing_start();
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   225
				local metric_registry = stats.metric_registry;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   226
				fire_event("openmetrics-updated", { metric_registry = metric_registry })
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   227
				mark_processing_done();
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   228
				manual_result = metric_registry;
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   229
			end
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   230
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   231
			return stats_interval, manual_result;
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   232
		end
11519
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   233
		if stats_interval then
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   234
			log("debug", "Statistics enabled using %s provider, collecting every %d seconds", stats_provider_name, stats_interval);
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   235
			timer.add_task(stats_interval, collect);
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   236
			prosody.events.add_handler("server-started", function () collect() end, -1);
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   237
			prosody.events.add_handler("server-stopped", function () collect() end, -1);
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   238
		else
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   239
			log("debug", "Statistics enabled using %s provider, no scheduled collection", stats_provider_name);
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   240
		end
7536
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   241
	else
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   242
		log("debug", "Statistics enabled using %s provider, collection is disabled", stats_provider_name);
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   243
	end
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   244
else
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   245
	log("debug", "Statistics disabled");
4ef37ac69562 statsmanager: Refactor to simplify logic. Notably renames 'statistics_provider' to 'statistics', and external libs now just begin with ':'
Matthew Wild <mwild1@gmail.com>
parents: 7527
diff changeset
   246
	function measure() return measure; end
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   247
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   248
	local dummy_mt = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   249
	function dummy_mt.__newindex()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   250
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   251
	function dummy_mt:__index()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   252
		return self
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   253
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   254
	function dummy_mt:__call()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   255
		return self
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   256
	end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   257
	local dummy = {}
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   258
	setmetatable(dummy, dummy_mt)
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   259
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   260
	function metric() return dummy; end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   261
	function cork() end
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   262
	function uncork() end
7524
1c8b63fe6472 statsmanager: Add 'stats_provider' option, to allow selecting alternative API providers to util.statistics
Matthew Wild <mwild1@gmail.com>
parents: 6913
diff changeset
   263
end
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   264
11519
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   265
local exported_collect = nil;
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   266
if stats_interval_config == "manual" then
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   267
	exported_collect = collect;
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   268
end
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   269
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   270
return {
11519
10d13e0554f9 core.statsmanager: Allow special "manual" value for statistics_interval
Kim Alvefur <zash@zash.se>
parents: 11510
diff changeset
   271
	collect = exported_collect;
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   272
	measure = measure;
11527
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   273
	cork = cork;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   274
	uncork = uncork;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   275
	metric = metric;
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   276
	get_metric_registry = function ()
5f15ab7c6ae5 Statistics: Rewrite statistics backends to use OpenMetrics
Jonas Schäfer <jonas@wielicki.name>
parents: 11519
diff changeset
   277
		return stats and stats.metric_registry or nil
6913
82765a4ec799 statsmanager: Add get() method
Matthew Wild <mwild1@gmail.com>
parents: 6585
diff changeset
   278
	end;
6557
6c22bec3e8d0 statsmanager, prosody: New core module and API for gathering statistics about the running server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   279
};