Annotate

plugins/muc/occupant_id.lib.lua @ 11523:5f15ab7c6ae5

Statistics: Rewrite statistics backends to use OpenMetrics The metric subsystem of Prosody has had some shortcomings from the perspective of the current state-of-the-art in metric observability. The OpenMetrics standard [0] is a formalization of the data model (and serialization format) of the well-known and widely-used Prometheus [1] software stack. The previous stats subsystem of Prosody did not map well to that format (see e.g. [2] and [3]); the key reason is that it was trying to do too much math on its own ([2]) while lacking first-class support for "families" of metrics ([3]) and structured metric metadata (despite the `extra` argument to metrics, there was no standard way of representing common things like "tags" or "labels"). Even though OpenMetrics has grown from the Prometheus world of monitoring, it maps well to other popular monitoring stacks such as: - InfluxDB (labels can be mapped to tags and fields as necessary) - Carbon/Graphite (labels can be attached to the metric name with dot-separation) - StatsD (see graphite when assuming that graphite is used as backend, which is the default) The util.statsd module has been ported to use the OpenMetrics model as a proof of concept. An implementation which exposes the util.statistics backend data as Prometheus metrics is ready for publishing in prosody-modules (most likely as mod_openmetrics_prometheus to avoid breaking existing 0.11 deployments). At the same time, the previous measure()-based API had one major advantage: It is really simple and easy to use without requiring lots of knowledge about OpenMetrics or similar concepts. For that reason as well as compatibility with existing code, it is preserved and may even be extended in the future. However, code relying on the `stats-updated` event as well as `get_stats` from `statsmanager` will break because the data model has changed completely; in case of `stats-updated`, the code will simply not run (as the event was renamed in order to avoid conflicts); the `get_stats` function has been removed completely (so it will cause a traceback when it is attempted to be used). Note that the measure_*_event methods have been removed from the module API. I was unable to find any uses or documentation and thus deemed they should not be ported. Re-implementation is possible when necessary. [0]: https://openmetrics.io/ [1]: https://prometheus.io/ [2]: #959 [3]: #960
author Jonas Schäfer <jonas@wielicki.name>
date Sun, 18 Apr 2021 11:47:41 +0200
parent 11215:9ce0a899ff07
child 12108:e9882c4c397f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11215
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Implementation of https://xmpp.org/extensions/inbox/occupant-id.html
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- XEP-0421: Anonymous unique occupant identifiers for MUCs
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 -- (C) 2020 Maxime “pep” Buquet <pep@bouah.net>
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- (C) 2020 Matthew Wild <mwild1@gmail.com>
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local uuid = require "util.uuid";
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local hmac_sha256 = require "util.hashes".hmac_sha256;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local b64encode = require "util.encodings".base64.encode;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local xmlns_occupant_id = "urn:xmpp:occupant-id:0";
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local function get_occupant_id(room, occupant)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 if occupant.stable_id then
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 return occupant.stable_id;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local salt = room._data.occupant_id_salt;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 if not salt then
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 salt = uuid.generate();
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 room._data.occupant_id_salt = salt;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 occupant.stable_id = b64encode(hmac_sha256(occupant.bare_jid, salt));
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 return occupant.stable_id;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local function update_occupant(event)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 local stanza, room, occupant, dest_occupant = event.stanza, event.room, event.occupant, event.dest_occupant;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 -- "muc-occupant-pre-change" provides "dest_occupant" but not "occupant".
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 if dest_occupant ~= nil then
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 occupant = dest_occupant;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 -- strip any existing <occupant-id/> tags to avoid forgery
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 stanza:remove_children("occupant-id", xmlns_occupant_id);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 local unique_id = get_occupant_id(room, occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 stanza:tag("occupant-id", { xmlns = xmlns_occupant_id, id = unique_id }):up();
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 local function muc_private(event)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 local stanza, room = event.stanza, event.room;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 local occupant = room._occupants[stanza.attr.from];
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 update_occupant({
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 stanza = stanza,
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 room = room,
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 occupant = occupant,
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 });
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 if module:get_option_boolean("muc_occupant_id", true) then
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 module:add_feature(xmlns_occupant_id);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 module:hook("muc-disco#info", function (event)
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 event.reply:tag("feature", { var = xmlns_occupant_id }):up();
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 module:hook("muc-broadcast-presence", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 module:hook("muc-occupant-pre-join", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 module:hook("muc-occupant-pre-change", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 module:hook("muc-occupant-groupchat", update_occupant);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 module:hook("muc-private-message", muc_private);
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 return {
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 get_occupant_id = get_occupant_id;
9ce0a899ff07 MUC: Merge mod_muc_occupant_id into a sub-module (thanks pep.!)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 };