From fa22d40ba35519453adbfb3fa900035f30e7c1d6 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 24 Nov 2021 16:03:05 +0000 Subject: 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 --- plugins/mod_http_openmetrics.lua | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 plugins/mod_http_openmetrics.lua (limited to 'plugins/mod_http_openmetrics.lua') 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 +-- Copyright (C) 2021 Jonas Schäfer +-- +-- 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 -- cgit v1.2.3