Mercurial > prosody-modules
comparison mod_pubsub_alertmanager/mod_pubsub_alertmanager.lua @ 4618:48132b6e1b16
mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
For integration with other things as pubsub subscribers.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 09 Jun 2021 01:14:46 +0200 |
parents | mod_pubsub_post/mod_pubsub_post.lua@c87181a98f29 |
children | b11001bd915d |
comparison
equal
deleted
inserted
replaced
4617:260a33eabbd3 | 4618:48132b6e1b16 |
---|---|
1 local st = require "util.stanza"; | |
2 local json = require "util.json"; | |
3 local uuid_generate = require "util.uuid".generate; | |
4 | |
5 module:depends("http"); | |
6 | |
7 local pubsub_service = module:depends("pubsub").service; | |
8 | |
9 local error_mapping = { | |
10 ["forbidden"] = 403; | |
11 ["item-not-found"] = 404; | |
12 ["internal-server-error"] = 500; | |
13 ["conflict"] = 409; | |
14 }; | |
15 | |
16 local function publish_payload(node, actor, item_id, payload) | |
17 local post_item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = item_id, }) | |
18 :add_child(payload); | |
19 local ok, err = pubsub_service:publish(node, actor, item_id, post_item); | |
20 module:log("debug", ":publish(%q, true, %q, %s) -> %q", node, item_id, payload:top_tag(), err or ""); | |
21 if not ok then | |
22 return error_mapping[err] or 500; | |
23 end | |
24 return 202; | |
25 end | |
26 | |
27 function handle_POST(event, path) | |
28 local request = event.request; | |
29 | |
30 local payload = json.decode(event.request.body); | |
31 if type(payload) ~= "table" then return 400; end | |
32 if payload.version ~= "4" then return 501; end | |
33 | |
34 for _, alert in ipairs(payload.alerts) do | |
35 local item = st.stanza("alerts", {xmlns = "urn:uuid:e3bec775-c607-4e9b-9a3f-94de1316d861:v4", status=alert.status}); | |
36 for k, v in pairs(alert.annotations) do | |
37 item:text_tag("annotation", v, { name=k }); | |
38 end | |
39 for k, v in pairs(alert.labels) do | |
40 item:text_tag("label", v, { name=k }); | |
41 end | |
42 item:tag("starts", { at = alert.startsAt}):up(); | |
43 if alert.endsAt then | |
44 item:tag("ends", { at = alert.endsAt }):up(); | |
45 end | |
46 if alert.generatorURL then | |
47 item:tag("link", { href=alert.generatorURL }):up(); | |
48 end | |
49 | |
50 local ret = publish_payload(path, request.ip, uuid_generate(), item); | |
51 if ret ~= 202 then | |
52 return ret | |
53 end | |
54 end | |
55 return 202; | |
56 end | |
57 | |
58 module:provides("http", { | |
59 route = { | |
60 ["POST /*"] = handle_POST; | |
61 }; | |
62 }); |