Software /
code /
prosody
Annotate
plugins/mod_http_openmetrics.lua @ 12386:2d3080d02960
net.websocket.frames: Replace bit fiddling code with util.struct
Fallback code for not having either the string.pack and string.unpack
functions available in Lua 5.4 or the struct lib is no longer needed
since the struct lib was imported as util.struct in 3ce3633527af
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 06 Mar 2022 15:13:50 +0100 |
parent | 11942:b4f77a7bf8ab |
child | 12977:74b9e05af71e |
rev | line source |
---|---|
11929
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 -- Export statistics in OpenMetrics format |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 -- |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2014 Daurnimator |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 -- Copyright (C) 2018 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 -- Copyright (C) 2021 Jonas Schäfer <jonas@zombofant.net> |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 -- |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 -- This module is MIT/X11 licensed. |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 module:set_global(); |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 local statsman = require "core.statsmanager"; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local ip = require "util.ip"; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 local get_metric_registry = statsman.get_metric_registry; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 local collect = statsman.collect; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 local get_metrics; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 local permitted_ips = module:get_option_set("openmetrics_allow_ips", { "::1", "127.0.0.1" }); |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 local permitted_cidr = module:get_option_string("openmetrics_allow_cidr"); |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 local function is_permitted(request) |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 local ip_raw = request.ip; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 if permitted_ips:contains(ip_raw) or |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 (permitted_cidr and ip.match(ip.new_ip(ip_raw), ip.parse_cidr(permitted_cidr))) then |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 return true; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 end |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 return false; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 end |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 function get_metrics(event) |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 if not is_permitted(event.request) then |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 return 403; -- Forbidden |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 end |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 local response = event.response; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 response.headers.content_type = "application/openmetrics-text; version=0.0.4"; |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 if collect then |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 -- Ensure to get up-to-date samples when running in manual mode |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 collect() |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 end |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 local registry = get_metric_registry() |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 if registry == nil then |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 response.headers.content_type = "text/plain; charset=utf-8" |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 response.status_code = 404 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 return "No statistics provider configured\n" |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 end |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 return registry:render(); |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 end |
85d51bfcf56b
mod_http_openmetrics: Imported from prosody-modules mod_prometheus @df2246b15075
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 |
11942
b4f77a7bf8ab
mod_http_openmetrics: Serve HTTP from global context
Kim Alvefur <zash@zash.se>
parents:
11929
diff
changeset
|
54 module:depends "http"; |
b4f77a7bf8ab
mod_http_openmetrics: Serve HTTP from global context
Kim Alvefur <zash@zash.se>
parents:
11929
diff
changeset
|
55 module:provides("http", { |
b4f77a7bf8ab
mod_http_openmetrics: Serve HTTP from global context
Kim Alvefur <zash@zash.se>
parents:
11929
diff
changeset
|
56 default_path = "metrics"; |
b4f77a7bf8ab
mod_http_openmetrics: Serve HTTP from global context
Kim Alvefur <zash@zash.se>
parents:
11929
diff
changeset
|
57 route = { |
b4f77a7bf8ab
mod_http_openmetrics: Serve HTTP from global context
Kim Alvefur <zash@zash.se>
parents:
11929
diff
changeset
|
58 GET = get_metrics; |
b4f77a7bf8ab
mod_http_openmetrics: Serve HTTP from global context
Kim Alvefur <zash@zash.se>
parents:
11929
diff
changeset
|
59 }; |
b4f77a7bf8ab
mod_http_openmetrics: Serve HTTP from global context
Kim Alvefur <zash@zash.se>
parents:
11929
diff
changeset
|
60 }); |