Software /
code /
prosody-modules
Annotate
mod_prometheus/mod_prometheus.lua @ 4544:64fa2dd34d43
mod_prometheus: remove space between label k/v pairs
It is illegal in OpenMetrics and not needed in the old prometheus
format, so we better don't emit it.
author | Jonas Schäfer <jonas@wielicki.name> |
---|---|
date | Sun, 18 Apr 2021 13:42:07 +0200 |
parent | 4542:fb4a50bf60f1 |
child | 4555:1e70538e4641 |
rev | line source |
---|---|
3132
4ef28b6b4e87
mod_prometheus: Add my copyright.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3131
diff
changeset
|
1 -- Log statistics to Prometheus |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
2 -- |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
3 -- Copyright (C) 2014 Daurnimator |
3132
4ef28b6b4e87
mod_prometheus: Add my copyright.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3131
diff
changeset
|
4 -- Copyright (C) 2018 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
4544
64fa2dd34d43
mod_prometheus: remove space between label k/v pairs
Jonas Schäfer <jonas@wielicki.name>
parents:
4542
diff
changeset
|
5 -- Copyright (C) 2021 Jonas Schäfer <jonas@zombofant.net> |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
6 -- |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
7 -- This module is MIT/X11 licensed. |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
8 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
9 module:set_global(); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
10 |
3128
a34e7bd87b39
mod_prometheus: Optimise global lookups.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3127
diff
changeset
|
11 local tostring = tostring; |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
12 local t_insert = table.insert; |
3128
a34e7bd87b39
mod_prometheus: Optimise global lookups.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3127
diff
changeset
|
13 local t_concat = table.concat; |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
14 local socket = require "socket"; |
4542
fb4a50bf60f1
mod_prometheus: Invoke stats collection if in 'manual' mode
Kim Alvefur <zash@zash.se>
parents:
3952
diff
changeset
|
15 local statsman = require "core.statsmanager"; |
fb4a50bf60f1
mod_prometheus: Invoke stats collection if in 'manual' mode
Kim Alvefur <zash@zash.se>
parents:
3952
diff
changeset
|
16 local get_stats = statsman.get_stats; |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
17 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
18 local function escape(text) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
19 return text:gsub("\\", "\\\\"):gsub("\"", "\\\""):gsub("\n", "\\n"); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
20 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
21 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
22 local function escape_name(name) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
23 return name:gsub("[^A-Za-z0-9_]", "_"):gsub("^[^A-Za-z_]", "_%1"); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
24 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
25 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
26 local function get_timestamp() |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
27 -- Using LuaSocket for that because os.time() only has second precision. |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
28 return math.floor(socket.gettime() * 1000); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
29 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
30 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
31 local function repr_help(metric, docstring) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
32 docstring = docstring:gsub("\\", "\\\\"):gsub("\n", "\\n"); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
33 return "# HELP "..escape_name(metric).." "..docstring.."\n"; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
34 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
35 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
36 -- local allowed_types = { counter = true, gauge = true, histogram = true, summary = true, untyped = true }; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
37 -- local allowed_types = { "counter", "gauge", "histogram", "summary", "untyped" }; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
38 local function repr_type(metric, type_) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
39 -- if not allowed_types:contains(type_) then |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
40 -- return; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
41 -- end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
42 return "# TYPE "..escape_name(metric).." "..type_.."\n"; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
43 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
44 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
45 local function repr_label(key, value) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
46 return key.."=\""..escape(value).."\""; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
47 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
48 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
49 local function repr_labels(labels) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
50 local values = {} |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
51 for key, value in pairs(labels) do |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
52 t_insert(values, repr_label(escape_name(key), escape(value))); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
53 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
54 if #values == 0 then |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
55 return ""; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
56 end |
4544
64fa2dd34d43
mod_prometheus: remove space between label k/v pairs
Jonas Schäfer <jonas@wielicki.name>
parents:
4542
diff
changeset
|
57 return "{"..t_concat(values, ",").."}"; |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
58 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
59 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
60 local function repr_sample(metric, labels, value, timestamp) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
61 return escape_name(metric)..repr_labels(labels).." "..value.." "..timestamp.."\n"; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
62 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
63 |
3149
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
64 local allowed_extras = { min = true, max = true, average = true }; |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
65 local function insert_extras(data, key, name, timestamp, extra) |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
66 if not extra then |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
67 return false; |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
68 end |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
69 local has_extra = false; |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
70 for extra_name in pairs(allowed_extras) do |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
71 if extra[extra_name] then |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
72 local field = { |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
73 value = extra[extra_name], |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
74 labels = { |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
75 ["type"] = name, |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
76 field = extra_name, |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
77 }, |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
78 typ = "gauge"; |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
79 timestamp = timestamp, |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
80 }; |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
81 t_insert(data[key], field); |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
82 has_extra = true; |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
83 end |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
84 end |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
85 return has_extra; |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
86 end |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
87 |
3138
9817e45a79e6
mod_prometheus: Fetch statistics at every request.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3134
diff
changeset
|
88 local function parse_stats() |
3134
99ac6dda9878
mod_prometheus: Move timestamp generation to the stats-update event.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3133
diff
changeset
|
89 local timestamp = tostring(get_timestamp()); |
3138
9817e45a79e6
mod_prometheus: Fetch statistics at every request.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3134
diff
changeset
|
90 local data = {}; |
3149
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
91 local stats, changed_only, extras = get_stats(); |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
92 for stat, value in pairs(stats) do |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
93 -- module:log("debug", "changed_stats[%q] = %s", stat, tostring(value)); |
3149
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
94 local extra = extras[stat]; |
3138
9817e45a79e6
mod_prometheus: Fetch statistics at every request.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3134
diff
changeset
|
95 local host, sect, name, typ = stat:match("^/([^/]+)/([^/]+)/(.+):(%a+)$"); |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
96 if host == nil then |
3131
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
97 sect, name, typ = stat:match("^([^.]+)%.(.+):(%a+)$"); |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
98 elseif host == "*" then |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
99 host = nil; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
100 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
101 if sect:find("^mod_measure_.") then |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
102 sect = sect:sub(13); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
103 elseif sect:find("^mod_statistics_.") then |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
104 sect = sect:sub(16); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
105 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
106 |
3133
321fd53a3191
mod_prometheus: Put the name as a label, which fits better the usual Prosody model.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3132
diff
changeset
|
107 local key = escape_name("prosody_"..sect); |
3131
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
108 local field = { |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
109 value = value, |
3133
321fd53a3191
mod_prometheus: Put the name as a label, which fits better the usual Prosody model.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3132
diff
changeset
|
110 labels = { ["type"] = name}, |
3131
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
111 -- TODO: Use the other types where it makes sense. |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
112 typ = (typ == "rate" and "counter" or "gauge"), |
3134
99ac6dda9878
mod_prometheus: Move timestamp generation to the stats-update event.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3133
diff
changeset
|
113 timestamp = timestamp, |
3131
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
114 }; |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
115 if host then |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
116 field.labels.host = host; |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
117 end |
3131
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
118 if data[key] == nil then |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
119 data[key] = {}; |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
120 end |
3149
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
121 if not insert_extras(data, key, name, timestamp, extra) then |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
122 t_insert(data[key], field); |
ccbfe7df02dc
mod_prometheus: Expose min, max and average when available.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3138
diff
changeset
|
123 end |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
124 end |
3138
9817e45a79e6
mod_prometheus: Fetch statistics at every request.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3134
diff
changeset
|
125 return data; |
9817e45a79e6
mod_prometheus: Fetch statistics at every request.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3134
diff
changeset
|
126 end |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
127 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
128 local function get_metrics(event) |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
129 local response = event.response; |
3138
9817e45a79e6
mod_prometheus: Fetch statistics at every request.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3134
diff
changeset
|
130 response.headers.content_type = "text/plain; version=0.0.4"; |
4542
fb4a50bf60f1
mod_prometheus: Invoke stats collection if in 'manual' mode
Kim Alvefur <zash@zash.se>
parents:
3952
diff
changeset
|
131 if statsman.collect then |
fb4a50bf60f1
mod_prometheus: Invoke stats collection if in 'manual' mode
Kim Alvefur <zash@zash.se>
parents:
3952
diff
changeset
|
132 statsman.collect() |
fb4a50bf60f1
mod_prometheus: Invoke stats collection if in 'manual' mode
Kim Alvefur <zash@zash.se>
parents:
3952
diff
changeset
|
133 end |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
134 |
3127
36770ae1148f
mod_prometheus: Don’t shadow variables. [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3126
diff
changeset
|
135 local answer = {}; |
3138
9817e45a79e6
mod_prometheus: Fetch statistics at every request.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3134
diff
changeset
|
136 for key, fields in pairs(parse_stats()) do |
3131
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
137 t_insert(answer, repr_help(key, "TODO: add a description here.")); |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
138 t_insert(answer, repr_type(key, fields[1].typ)); |
ddd39ca7b953
mod_prometheus: Change the storage model for one which matches Prometheus better.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3128
diff
changeset
|
139 for _, field in pairs(fields) do |
3134
99ac6dda9878
mod_prometheus: Move timestamp generation to the stats-update event.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3133
diff
changeset
|
140 t_insert(answer, repr_sample(key, field.labels, field.value, field.timestamp)); |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
141 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
142 end |
3128
a34e7bd87b39
mod_prometheus: Optimise global lookups.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3127
diff
changeset
|
143 return t_concat(answer, ""); |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
144 end |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
145 |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
146 function module.add_host(module) |
3952
343dc9dd70dd
mod_prometheus: Ensure mod_http is loaded where the http interface is exposed (thanks Martin)
Kim Alvefur <zash@zash.se>
parents:
3149
diff
changeset
|
147 module:depends "http"; |
3125
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
148 module:provides("http", { |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
149 default_path = "metrics"; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
150 route = { |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
151 GET = get_metrics; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
152 }; |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
153 }); |
07a2ba55de4d
mod_prometheus: Add a new statistics export module, for Prometheus.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
154 end |