aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
* | mod_c2s: Port to new OpenMetrics APIJonas Schäfer2021-04-181-10/+16
| |
* | Statistics: Rewrite statistics backends to use OpenMetricsJonas Schäfer2021-04-187-494/+1110
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* | util.prosodyctl.shell: Fix for different location of unpack in Lua 5.1Kim Alvefur2021-04-251-1/+2
| |
* | util.prosodyctl.shell: Fix for missing 'sep' arg to string.rep in Lua 5.1Kim Alvefur2021-04-251-1/+2
| |
* | util.prosodyctl.shell: Allow calling console commands with fewer shell quotesKim Alvefur2021-04-251-3/+2
| | | | | | | | | | | | | | | | E.g. `prosodyctl shell module reload disco example.com` becomes equivalent to `prosodyctl shell 'module:reload("disco", "example.com")`. Won't work for every possible command, but reduces the amount of shell quoting problems for most common commands.
* | mod_tls: Bail out if session got destroyed while sending <proceed/>Kim Alvefur2021-04-151-0/+1
| | | | | | | | | | | | | | Can happen in case opportunistic_writes is enabled and the session got destroyed while writing that tag. Thanks Ge0rG
* | core.sessionmanager: Add a dummy rawsend() method to resting sessionsKim Alvefur2021-04-151-0/+1
| | | | | | | | | | | | | | Should fix a traceback on attempted use after destruction, in case where opportunistic_writes was in use. Thanks Ge0rG
* | mod_c2s: Fix traceback if session was destroyed while opening stream (thanks ↵Kim Alvefur2021-04-141-0/+3
| | | | | | | | | | | | | | | | | | | | | | Ge0rG) Could happen with the 'opportunistic_writes' setting, since then the stream opening is written directly to the socket, which can in turn trigger session destruction if the socket somehow got closed just after the other sent their stream header. Error happens later when it tries to `hosts[session.host == nil].events`
* | util.xmppstream: Send <?xml?> declaration in same call as stream openKim Alvefur2021-04-141-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If network_settings.opportunistic_writes is enabled then this would previously have resulted in two socket writes, and possibly two packets being sent. This caused some issues in older versions of Gajim, which apparently expected the stream opening in the first packet, and thus it could not connect. With this change and opportunistic_writes enabled, the first packet should contain both the xml declaration and the stream open tag. Without opportunistic_writes, there should be no observable change. Tested with Gajim 1.1.2 (on same machine). Unsure if loopback behaves differently than the network here.
* | core.statsmanager: Allow special "manual" value for statistics_intervalKim Alvefur2021-04-062-6/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | When set, no periodic statistics collection is done by core.statsmanager, instead some module is expected to call collect() when it suits. Obviously only one such module should be enabled. Quoth jonas’ > correct way is to scrape the internal sources on each call to /metrics > in the context of Prometheus "manual" as opposed to "automatic", from the point of view of statsmanager.
* | Merge 0.11->trunkKim Alvefur2021-04-102-4/+15
|\|
| * mod_saslauth: Use a defined SASL errorKim Alvefur2021-03-181-1/+1
| |
| * mod_saslauth: Improve code styleKim Alvefur2021-03-181-1/+3
| | | | | | | | | | | | This many returns deserve their own line. `session["sasl_handler"]` style isn't used anywhere else.
| * mod_c2s: Log about missing conn on async state changesKim Alvefur2021-03-181-0/+4
| |
| * mod_c2s: Improve code styleKim Alvefur2021-03-181-2/+6
| | | | | | | | | | We don't use the quoted table indexing style that often, it's not needed here and it's enough to check for falsyness rather than `nil`.
| * mod_c2s: Fix traceback in session close when conn is nilKim Alvefur2021-03-171-2/+2
| | | | | | | | Unclear how this happens.
| * mod_saslauth: Don't throw errors in async code when connections are gonetmolitor2021-03-181-0/+1
| | | | | | | | Fixes #1515
| * mod_c2s: Don't throw errors in async code when connections are gonetmolitor2021-03-181-2/+2
| | | | | | | | Fixes #1507
* | core.statsmanager: Cover util.statistics work in processing measurementKim Alvefur2021-04-061-1/+1
| | | | | | | | | | | | | | | | | | Zash> Btw, this conditional and loop, shouldn't it be covered by the timing measurement? Zash> Isn't that where all the util.statistics work is done? MattJ> Yeah, it should Zash> ("the", but there's two ... which one‽) MattJ> Yeah... not sure :) MattJ> Processing I guess
* | core.hostmanager: Remove obsolete clearing of srv_hostsKim Alvefur2021-04-061-1/+0
| | | | | | | | Gone with s2sout.lib in 756b8821007a
* | mod_admin_shell: Remove obsolete checks related to s2sout.libKim Alvefur2021-04-061-14/+1
| | | | | | | | | | s2sout.lib was removed in 756b8821007a along with srv_hosts and srv_choice
* | mod_http_file_share: Include expiry time of the upload itself in tokenKim Alvefur2021-04-051-0/+1
| | | | | | | | | | | | Lets an external upload service know this so it can do expiry itself. Could possibly have been calculated based on the token expiry or issuance time, explicit > implicit.
* | mod_http_file_share: Include time of issuance in auth tokenKim Alvefur2021-04-051-1/+3
| | | | | | | | | | In case an external upload service wants to have the original creation time, or calculate the token expiry itself.
* | mod_http_file_share: Group related properties for readabilityKim Alvefur2021-04-051-2/+6
| |
* | mod_http_file_share: Log error opening file for writingKim Alvefur2021-04-051-2/+3
| | | | | | | | util.error.coerce() doesn't work well with iolib
* | mod_http_file_share: Fix logging of error opening fileKim Alvefur2021-04-051-1/+1
| | | | | | | | It's annoying that Lua interpolates the filename into the error message.
* | MUC: Allow overriding occupant object from groupchat message eventKim Alvefur2021-03-251-4/+9
| | | | | | | | | | | | | | Use case: Enable module that provides a virtual occupant object for bots Before, if there is no occupant then either some other part of MUC would reject the message or `occupant.nick` would have caused an error.
* | net.server_epoll: Remove unnecessary luacheck annotationsKim Alvefur2021-04-011-3/+3
| | | | | | | | | | Not sure why these were here to begin with, since it does use the 'self' argument and did so since they were added.
* | mod_http_file_share: Include storage in prune time measurementKim Alvefur2021-03-311-1/+1
| | | | | | | | Maybe the original idea was that you would measure storage separately?
* | mod_http_file_share: Add internal command to check files consistencyKim Alvefur2021-03-281-0/+18
| | | | | | | | | | | | Background: Found a few files in my store that did not match the size recorded in the slot, so I needed a way to check which which those were. As it was a bit too much to type into the shell I added it here instead.
* | util.datamapper: Fix spelling in testsKim Alvefur2021-03-281-2/+2
| |
* | mod_http_file_share: Fix reporting of missing filesKim Alvefur2021-03-281-2/+5
| | | | | | | | | | | | | | This just gave an unhelpful 500 error. It would be nice to have some wrapper code that could untangle the embedded filename in the io libs errors.
* | MUC: Report number of live rooms to statsmanagerKim Alvefur2021-03-281-0/+5
| | | | | | | | Should help inform on whether the cache size should be increased.
* | mod_http_file_share: Report number of items in caches to statsmanagerKim Alvefur2021-03-281-0/+8
| | | | | | | | | | | | This is neat, O(1) reporting, why don't we do this everywhere? Gives you an idea of how much stuff is in the caches, which may help inform decisions on whether the size is appropriate.
* | util.prosodyctl: Install plugins for current Lua versionKim Alvefur2021-03-161-2/+2
| | | | | | | | | | | | | | | | Fixes that luarocks defaults to installing the rock for its own runtime version of Lua. This only works with luarocks 3.x, it does nothing on 2.x as currently available from Debian.
* | util.envload: Add basic test of envload()Kim Alvefur2021-03-261-0/+22
| |
* | util.datamapper: Revert one special attribute to longer formKim Alvefur2021-03-261-1/+1
| | | | | | | | Had a name, using attr() broke it.
* | util.datamapper: Use attribute convenience function throughoutKim Alvefur2021-03-261-3/+4
| |
* | util.promise: Switch order of parameters to join()Matthew Wild2021-03-252-6/+4
| | | | | | | | | | This saves awkward fiddlery with varargs and also echoes the signature of pcall/xpcall.
* | util.promise: all()/all_settled() pass through non-promise valuesMatthew Wild2021-03-252-22/+63
| |
* | util.promise: Add join() convenience methodMatthew Wild2021-03-252-0/+37
| | | | | | | | | | | | Usage: promise.join(p1, p2, function (result1, result2) [...] end)
* | util.promise: Add support for arbitrary keys in all()/all_settled()Matthew Wild2021-03-252-15/+64
| |
* | mod_message: Stop advertising offline message support (mod_offline does that)Kim Alvefur2021-03-241-2/+0
| | | | | | | | mod_offline also already advertises this feature, so it's added twice.
* | util.datamapper: Don't include empty unwrapped arraysKim Alvefur2021-03-242-2/+8
| | | | | | | | | | | | Since there is no way to distinguish an empty such array from a zero-length array. Dropping it seems like the least annoying thing to do.
* | util.datamapper: Add test coverage of unwrapped arrays of objectsKim Alvefur2021-03-241-0/+14
| | | | | | | | | | Should the xml name/ns go on the array or the items schema? The later apparently.
* | util.datamapper: Fix error on attempt to coerce nil to somethingKim Alvefur2021-03-232-0/+4
| | | | | | | | | | | | Turns falsy values into nil instead of nothing, which ensures this function always has 1 return value, or table.insert({}) complains. Would still happen on some unexpected input, but that's actually a good thing.
* | mod_admin_shell: Sort timers by time in debug:timers()Kim Alvefur2021-03-231-1/+6
| | | | | | | | | | Easier to see which timers are happening soon vs further in the future if they are in some sensible order.
* | mod_c2s: Log a debug message before closing due to c2s_timeoutKim Alvefur2021-03-231-0/+1
| | | | | | | | | | | | | | It was confusing that the connection would just close without much explanation. Wanted this while investigating https://github.com/conversejs/converse.js/issues/2438
* | util.datamapper: Deal with locally built stanzas missing xmlnsKim Alvefur2021-03-233-10/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | So the problem is that xmlns is not inherited when building a stanza, and then :get_child(n, ns) with an explicit namespace does not find that such child tags. E.g. local t = st.stanza("foo", { xmlns = "urn:example:bar" }) :text_tag("hello", "world"); assert(t:get_child("hello", "urn:example:bar"), "This fails"); Meanwhile, during parsing (util.xmppstream or util.xml) child tags do get the parents xmlns when not overriding them. Thus, in the above example, if the stanza is passed trough `t = util.xml.parse(tostring(t))` then the assert succeeds. This change makes it so that it leaves out the namespace argument to :get_child when it is the same as the current/parent namespace, which behaves the same for both built and parsed stanzas.
* | util.datamapper: Factor out conversion from any value to XML stringKim Alvefur2021-03-222-58/+34
| | | | | | | | Since this was the last severely duplicated code left.