Software /
code /
prosody
Annotate
plugins/mod_http_openmetrics.lua @ 12828:f33887f925e1
net.server_epoll: Remove delay on last main loop iteration when quitting
Main difference is that timers are not checked unconditionally before
each poll, only when running out of previous poll results (hidden by
util.poll). This removes a final poll at shutdown that usually delays
the 'not quitting' condition check by one second.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 06 Jan 2023 04:38:39 +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 }); |