diff options
author | Matthew Wild <mwild1@gmail.com> | 2021-11-24 16:03:05 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2021-11-24 16:03:05 +0000 |
commit | fa22d40ba35519453adbfb3fa900035f30e7c1d6 (patch) | |
tree | 2683ee81b069286d0459d52c2fa262a3d805aa5f /plugins | |
parent | 8a949f83e262f5ba4010c9ddb5cb7640c3c46c86 (diff) | |
download | prosody-fa22d40ba35519453adbfb3fa900035f30e7c1d6.tar.gz prosody-fa22d40ba35519453adbfb3fa900035f30e7c1d6.zip |
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
This version has several changes from the earlier mod_prometheus:
- Conversion of metrics into the text-based OpenMetrics format is moved to
util.openmetrics
- Support for IP-based access control
- Compatibility with earlier Prosody versions removed
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mod_http_openmetrics.lua | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/plugins/mod_http_openmetrics.lua b/plugins/mod_http_openmetrics.lua new file mode 100644 index 00000000..78cd6fd4 --- /dev/null +++ b/plugins/mod_http_openmetrics.lua @@ -0,0 +1,62 @@ +-- Export statistics in OpenMetrics format +-- +-- Copyright (C) 2014 Daurnimator +-- Copyright (C) 2018 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> +-- Copyright (C) 2021 Jonas Schäfer <jonas@zombofant.net> +-- +-- This module is MIT/X11 licensed. + +module:set_global(); + +local statsman = require "core.statsmanager"; +local ip = require "util.ip"; + +local get_metric_registry = statsman.get_metric_registry; +local collect = statsman.collect; + +local get_metrics; + +local permitted_ips = module:get_option_set("openmetrics_allow_ips", { "::1", "127.0.0.1" }); +local permitted_cidr = module:get_option_string("openmetrics_allow_cidr"); + +local function is_permitted(request) + local ip_raw = request.ip; + if permitted_ips:contains(ip_raw) or + (permitted_cidr and ip.match(ip.new_ip(ip_raw), ip.parse_cidr(permitted_cidr))) then + return true; + end + return false; +end + +function get_metrics(event) + if not is_permitted(event.request) then + return 403; -- Forbidden + end + + local response = event.response; + response.headers.content_type = "application/openmetrics-text; version=0.0.4"; + + if collect then + -- Ensure to get up-to-date samples when running in manual mode + collect() + end + + local registry = get_metric_registry() + if registry == nil then + response.headers.content_type = "text/plain; charset=utf-8" + response.status_code = 404 + return "No statistics provider configured\n" + end + + return registry:render(); +end + +function module.add_host(module) + module:depends "http"; + module:provides("http", { + default_path = "metrics"; + route = { + GET = get_metrics; + }; + }); +end |