Annotate

plugins/mod_mimicking.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 9986:9cb639ef5c72
child 11848:b4d4f0339e16
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- Prosody IM
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 -- Copyright (C) 2012 Florian Zeitz
9981
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
3 -- Copyright (C) 2019 Kim Alvefur
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 --
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 --
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
9981
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
9 local encodings = require "util.encodings";
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
10 assert(encodings.confusable, "This module requires that Prosody be built with ICU");
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
11 local skeleton = encodings.confusable.skeleton;
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9980
diff changeset
12
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local usage = require "util.prosodyctl".show_usage;
9984
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
14 local usermanager = require "core.usermanager";
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
15 local storagemanager = require "core.storagemanager";
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16
9984
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
17 local skeletons
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
18 function module.load()
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
19 if module.host ~= "*" then
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
20 skeletons = module:open_store("skeletons");
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
21 end
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
22 end
9983
f7d11503fdce mod_mimicking: Use new storage API
Kim Alvefur <zash@zash.se>
parents: 9982
diff changeset
23
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 module:hook("user-registered", function(user)
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
25 local skel = skeleton(user.username);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
26 local ok, err = skeletons:set(skel, { username = user.username });
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
27 if not ok then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
28 module:log("error", "Unable to store mimicry data (%q => %q): %s", user.username, skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
29 end
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end);
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31
9982
d09575dae242 mod_mimicking: Hook the correct event names
Kim Alvefur <zash@zash.se>
parents: 9981
diff changeset
32 module:hook("user-deleted", function(user)
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
33 local skel = skeleton(user.username);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
34 local ok, err = skeletons:set(skel, nil);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
35 if not ok and err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
36 module:log("error", "Unable to clear mimicry data (%q): %s", skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
37 end
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 end);
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39
9982
d09575dae242 mod_mimicking: Hook the correct event names
Kim Alvefur <zash@zash.se>
parents: 9981
diff changeset
40 module:hook("user-registering", function(user)
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
41 local existing, err = skeletons:get(skeleton(user.username));
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
42 if existing then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
43 module:log("debug", "Attempt to register username '%s' which could be confused with '%s'", user.username, existing.username);
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 user.allowed = false;
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
45 elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
46 module:log("error", "Unable to check if new username '%s' can be confused with any existing user: %s", err);
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 end
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 end);
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 function module.command(arg)
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 if (arg[1] ~= "bootstrap" or not arg[2]) then
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
52 usage("mod_mimicking bootstrap <host>", "Initialize username mimicry database");
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 return;
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 end
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 local host = arg[2];
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 local host_session = prosody.hosts[host];
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 if not host_session then
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 return "No such host";
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
9984
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
62
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 storagemanager.initialize_host(host);
9984
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
64 usermanager.initialize_host(host);
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65
9984
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
66 skeletons = storagemanager.open(host, "skeletons");
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
67
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
68 local count = 0;
9984
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9983
diff changeset
69 for user in usermanager.users(host) do
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
70 local skel = skeleton(user);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
71 local existing, err = skeletons:get(skel);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
72 if existing and existing.username ~= user then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
73 module:log("warn", "Existing usernames '%s' and '%s' are confusable", existing.username, user);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
74 elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
75 module:log("error", "Error checking for existing mimicry data (%q = %q): %s", user, skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
76 end
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
77 local ok, err = skeletons:set(skel, { username = user });
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
78 if ok then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
79 count = count + 1;
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
80 elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
81 module:log("error", "Unable to store mimicry data (%q => %q): %s", user, skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
82 end
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 end
9986
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
84 module:log("info", "%d usernames indexed", count);
9980
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 end