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 }); |
