Software /
code /
prosody-modules
Annotate
mod_pubsub_alertmanager/mod_pubsub_alertmanager.lua @ 5841:d3b69859553a
mod_password_policy: Change error type from 'cancel' to 'modify'
This makes more sense, as the problem relates to the data that has been
entered, and therefore the request could be retried with different data.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 08 Jan 2024 17:28:39 +0000 |
parent | 5485:67190744b1eb |
rev | line source |
---|---|
1619
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 local st = require "util.stanza"; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 local json = require "util.json"; |
4625
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4621
diff
changeset
|
3 local filters = { --[[ TODO what's useful? ]] }; |
4619
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
4 local render = require "util.interpolation".new("%b{}", tostring, filters); |
1619
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 local uuid_generate = require "util.uuid".generate; |
4618
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
6 |
4625
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4621
diff
changeset
|
7 -- TODO alertmanager supports inclusion of HTTP auth and OAuth, worth looking |
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4621
diff
changeset
|
8 -- into for using instead of request IP |
f7e26c43a9bc
mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents:
4621
diff
changeset
|
9 |
4618
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
10 module:depends("http"); |
1619
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local pubsub_service = module:depends("pubsub").service; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
3014
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
14 local error_mapping = { |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
15 ["forbidden"] = 403; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
16 ["item-not-found"] = 404; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
17 ["internal-server-error"] = 500; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
18 ["conflict"] = 409; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
19 }; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
20 |
3017
8e48c0b233e0
mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents:
3016
diff
changeset
|
21 local function publish_payload(node, actor, item_id, payload) |
3014
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
22 local post_item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = item_id, }) |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
23 :add_child(payload); |
3017
8e48c0b233e0
mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents:
3016
diff
changeset
|
24 local ok, err = pubsub_service:publish(node, actor, item_id, post_item); |
3014
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
25 module:log("debug", ":publish(%q, true, %q, %s) -> %q", node, item_id, payload:top_tag(), err or ""); |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
26 if not ok then |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
27 return error_mapping[err] or 500; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
28 end |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
29 return 202; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
30 end |
1619
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 |
5485
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4627
diff
changeset
|
32 local global_node_template = module:get_option_string("alertmanager_node_template", "{path?alerts}"); |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4627
diff
changeset
|
33 local path_configs = module:get_option("alertmanager_path_configs", {}); |
4621
ebc2c099a11b
mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents:
4620
diff
changeset
|
34 |
3014
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
35 function handle_POST(event, path) |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
36 local request = event.request; |
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
37 |
5485
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4627
diff
changeset
|
38 local config = path_configs[path] or {}; |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4627
diff
changeset
|
39 local node_template = config.node_template or global_node_template; |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4627
diff
changeset
|
40 local publisher = config.publisher or request.ip; |
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4627
diff
changeset
|
41 |
4618
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
42 local payload = json.decode(event.request.body); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
43 if type(payload) ~= "table" then return 400; end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
44 if payload.version ~= "4" then return 501; end |
3501
1df139b157fb
mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents:
3255
diff
changeset
|
45 |
4618
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
46 for _, alert in ipairs(payload.alerts) do |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
47 local item = st.stanza("alerts", {xmlns = "urn:uuid:e3bec775-c607-4e9b-9a3f-94de1316d861:v4", status=alert.status}); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
48 for k, v in pairs(alert.annotations) do |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
49 item:text_tag("annotation", v, { name=k }); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
50 end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
51 for k, v in pairs(alert.labels) do |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
52 item:text_tag("label", v, { name=k }); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
53 end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
54 item:tag("starts", { at = alert.startsAt}):up(); |
4626
285efde5e8a5
mod_pubsub_alertmanager: Exclude "ends at" timestamp for unresolved alerts
Kim Alvefur <zash@zash.se>
parents:
4625
diff
changeset
|
55 if alert.endsAt and alert.status == "resolved" then |
4618
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
56 item:tag("ends", { at = alert.endsAt }):up(); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
57 end |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
58 if alert.generatorURL then |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
59 item:tag("link", { href=alert.generatorURL }):up(); |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
60 end |
3255
64d1dfbd1740
mod_pubsub_post: Ensure actor is non-nil (catch inability to determine IP or simliar)
Kim Alvefur <zash@zash.se>
parents:
3254
diff
changeset
|
61 |
4621
ebc2c099a11b
mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents:
4620
diff
changeset
|
62 local node = render(node_template, {alert = alert, path = path, payload = payload, request = request}); |
5485
67190744b1eb
mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents:
4627
diff
changeset
|
63 local ret = publish_payload(node, publisher, uuid_generate(), item); |
4618
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
64 if ret ~= 202 then |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
65 return ret |
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
66 end |
3014
72dbc9b66de8
mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents:
3013
diff
changeset
|
67 end |
4618
48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents:
4552
diff
changeset
|
68 return 202; |
1619
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 end |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
4620
9b253cce7d88
mod_pubsub_alertmanager: Allow configuring template for <body> rendering
Kim Alvefur <zash@zash.se>
parents:
4619
diff
changeset
|
71 local template = module:get_option_string("alertmanager_body_template", [[ |
4619
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
72 *ALARM!* |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
73 Status: {status} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
74 Starts at: {startsAt}{endsAt& |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
75 Ends at: {endsAt}} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
76 Labels: {labels% |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
77 {idx}: {item}} |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
78 Annotations: {annotations% |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
79 {idx}: {item}} |
4620
9b253cce7d88
mod_pubsub_alertmanager: Allow configuring template for <body> rendering
Kim Alvefur <zash@zash.se>
parents:
4619
diff
changeset
|
80 ]]); |
4619
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
81 |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
82 module:hook("pubsub-summary/urn:uuid:e3bec775-c607-4e9b-9a3f-94de1316d861:v4", function(event) |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
83 local payload = event.payload; |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
84 |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
85 local data = { |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
86 status = payload.attr.status, |
4627
adda872fa9e1
mod_pubsub_alertmanager: Include status booleans in template input
Kim Alvefur <zash@zash.se>
parents:
4626
diff
changeset
|
87 firing = "firing" == payload.attr.status, |
adda872fa9e1
mod_pubsub_alertmanager: Include status booleans in template input
Kim Alvefur <zash@zash.se>
parents:
4626
diff
changeset
|
88 resolved = "resolved" == payload.attr.status, |
4619
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
89 annotations = {}, |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
90 labels = {}, |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
91 endsAt = payload:find("ends/@at"), |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
92 startsAt = payload:find("starts/@at"), |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
93 }; |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
94 for label in payload:childtags("label") do |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
95 data.labels[tostring(label.attr.name)] = label:get_text(); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
96 end |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
97 for annotation in payload:childtags("annotation") do |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
98 data.annotations[tostring(annotation.attr.name)] = annotation:get_text(); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
99 end |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
100 |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
101 return render(template, data); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
102 end); |
b11001bd915d
mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents:
4618
diff
changeset
|
103 |
1619
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 module:provides("http", { |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 route = { |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 ["POST /*"] = handle_POST; |
4621
ebc2c099a11b
mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents:
4620
diff
changeset
|
107 ["POST"] = handle_POST; |
1619
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 }; |
43c54a27bab2
mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 }); |