mod_pubsub_alertmanager/mod_pubsub_alertmanager.lua
author Nicholas George <wirlaburla@worlio.com>
Tue, 21 May 2024 01:09:12 -0500
changeset 5915 e7584fd5b191
parent 5489 67190744b1eb
permissions -rw-r--r--
mod_muc_restrict_pm: fix table in README
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1623
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";
4629
f7e26c43a9bc mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents: 4625
diff changeset
     3
local filters = { --[[ TODO what's useful? ]] };
4623
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
     4
local render = require "util.interpolation".new("%b{}", tostring, filters);
1623
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;
4622
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
     6
4629
f7e26c43a9bc mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents: 4625
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: 4625
diff changeset
     8
-- into for using instead of request IP
f7e26c43a9bc mod_pubsub_alertmanager: Add TODOs
Kim Alvefur <zash@zash.se>
parents: 4625
diff changeset
     9
4622
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
    10
module:depends("http");
1623
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
3018
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    14
local error_mapping = {
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    15
	["forbidden"] = 403;
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    16
	["item-not-found"] = 404;
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    17
	["internal-server-error"] = 500;
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    18
	["conflict"] = 409;
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    19
};
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    20
3021
8e48c0b233e0 mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents: 3020
diff changeset
    21
local function publish_payload(node, actor, item_id, payload)
3018
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
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: 3017
diff changeset
    23
		:add_child(payload);
3021
8e48c0b233e0 mod_pubsub_post: Factor out the 'actor' into an argument
Kim Alvefur <zash@zash.se>
parents: 3020
diff changeset
    24
	local ok, err = pubsub_service:publish(node, actor, item_id, post_item);
3018
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
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: 3017
diff changeset
    26
	if not ok then
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
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: 3017
diff changeset
    28
	end
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    29
	return 202;
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    30
end
1623
43c54a27bab2 mod_pubsub_post: Module to publish to pubsub nodes from a simple HTTP POST
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
5489
67190744b1eb mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents: 4631
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: 4631
diff changeset
    33
local path_configs = module:get_option("alertmanager_path_configs", {});
4625
ebc2c099a11b mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents: 4624
diff changeset
    34
3018
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    35
function handle_POST(event, path)
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    36
	local request = event.request;
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    37
5489
67190744b1eb mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents: 4631
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: 4631
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: 4631
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: 4631
diff changeset
    41
4622
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
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: 4556
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: 4556
diff changeset
    44
	if payload.version ~= "4" then return 501; end
3505
1df139b157fb mod_pubsub_post: Add support for WebSub authentication
Kim Alvefur <zash@zash.se>
parents: 3259
diff changeset
    45
4622
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
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: 4556
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: 4556
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: 4556
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: 4556
diff changeset
    50
		end
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
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: 4556
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: 4556
diff changeset
    53
		end
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
    54
		item:tag("starts", { at = alert.startsAt}):up();
4630
285efde5e8a5 mod_pubsub_alertmanager: Exclude "ends at" timestamp for unresolved alerts
Kim Alvefur <zash@zash.se>
parents: 4629
diff changeset
    55
		if alert.endsAt and alert.status == "resolved" then
4622
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
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: 4556
diff changeset
    57
		end
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
    58
		if alert.generatorURL then
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
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: 4556
diff changeset
    60
		end
3259
64d1dfbd1740 mod_pubsub_post: Ensure actor is non-nil (catch inability to determine IP or simliar)
Kim Alvefur <zash@zash.se>
parents: 3258
diff changeset
    61
4625
ebc2c099a11b mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents: 4624
diff changeset
    62
		local node = render(node_template, {alert = alert, path = path, payload = payload, request = request});
5489
67190744b1eb mod_pubsub_alertmanager: Support for per-path config overrides
Matthew Wild <mwild1@gmail.com>
parents: 4631
diff changeset
    63
		local ret = publish_payload(node, publisher, uuid_generate(), item);
4622
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
    64
		if ret ~= 202 then
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
    65
			return ret
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
    66
		end
3018
72dbc9b66de8 mod_pubsub_post: Change to support arbitrary XML payloads
Kim Alvefur <zash@zash.se>
parents: 3017
diff changeset
    67
	end
4622
48132b6e1b16 mod_pubsub_alertmanager: Publish Alertmanager alerts into pubsub
Kim Alvefur <zash@zash.se>
parents: 4556
diff changeset
    68
	return 202;
1623
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
4624
9b253cce7d88 mod_pubsub_alertmanager: Allow configuring template for <body> rendering
Kim Alvefur <zash@zash.se>
parents: 4623
diff changeset
    71
local template = module:get_option_string("alertmanager_body_template", [[
4623
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    72
*ALARM!*
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    73
Status: {status}
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    74
Starts at: {startsAt}{endsAt&
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    75
Ends at: {endsAt}}
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    76
Labels: {labels%
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    77
  {idx}: {item}}
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    78
Annotations: {annotations%
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    79
  {idx}: {item}}
4624
9b253cce7d88 mod_pubsub_alertmanager: Allow configuring template for <body> rendering
Kim Alvefur <zash@zash.se>
parents: 4623
diff changeset
    80
]]);
4623
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    81
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
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: 4622
diff changeset
    83
	local payload = event.payload;
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    84
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    85
	local data = {
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    86
		status = payload.attr.status,
4631
adda872fa9e1 mod_pubsub_alertmanager: Include status booleans in template input
Kim Alvefur <zash@zash.se>
parents: 4630
diff changeset
    87
		firing = "firing" == payload.attr.status,
adda872fa9e1 mod_pubsub_alertmanager: Include status booleans in template input
Kim Alvefur <zash@zash.se>
parents: 4630
diff changeset
    88
		resolved = "resolved" == payload.attr.status,
4623
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    89
		annotations = {},
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    90
		labels = {},
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    91
		endsAt = payload:find("ends/@at"),
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    92
		startsAt = payload:find("starts/@at"),
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
    93
	};
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
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: 4622
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: 4622
diff changeset
    96
	end
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
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: 4622
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: 4622
diff changeset
    99
	end
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
   100
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
   101
	return render(template, data);
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
   102
end);
b11001bd915d mod_pubsub_alertmanager: Add a plain text summary
Kim Alvefur <zash@zash.se>
parents: 4622
diff changeset
   103
1623
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;
4625
ebc2c099a11b mod_pubsub_alertmanager: Allow templating the pubsub node to publish to
Kim Alvefur <zash@zash.se>
parents: 4624
diff changeset
   107
		["POST"] = handle_POST;
1623
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
});