aboutsummaryrefslogtreecommitdiffstats
path: root/util
Commit message (Collapse)AuthorAgeFilesLines
* Statistics: Rewrite statistics backends to use OpenMetricsJonas Schäfer2021-04-183-209/+722
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* 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.
* 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.promise: Switch order of parameters to join()Matthew Wild2021-03-251-4/+2
| | | | | 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-251-22/+30
|
* util.promise: Add join() convenience methodMatthew Wild2021-03-251-0/+11
| | | | | | Usage: promise.join(p1, p2, function (result1, result2) [...] end)
* util.promise: Add support for arbitrary keys in all()/all_settled()Matthew Wild2021-03-251-15/+27
|
* util.datamapper: Don't include empty unwrapped arraysKim Alvefur2021-03-241-1/+4
| | | | | | 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: Fix error on attempt to coerce nil to somethingKim Alvefur2021-03-231-0/+3
| | | | | | 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.
* util.datamapper: Deal with locally built stanzas missing xmlnsKim Alvefur2021-03-231-5/+5
| | | | | | | | | | | | | | | | | | | | | 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-221-29/+17
| | | | Since this was the last severely duplicated code left.
* util.datamapper: Handle nested arrays or objects in arraysKim Alvefur2021-03-221-4/+22
|
* util.datamapper: Fix to skip parsing wrapped arrays that aren't thereKim Alvefur2021-03-221-2/+0
| | | | Turns out the unreachable error is reachable :D
* util.datamapper: Complete array building supportKim Alvefur2021-03-201-12/+3
|
* util.datamapper: Factor out handling of object properties for array reuseKim Alvefur2021-03-201-79/+82
|
* util.datamapper: Finally implement support for parsing arraysKim Alvefur2021-03-201-13/+9
|
* util.datamapper: Factor out extraction of the XML part to useKim Alvefur2021-03-201-40/+42
| | | | | | | | So extract_value() takes an XML tag and details about which part we're interested in and returns that. Factoring this out will help with array implementation since this will be common behavior.
* util.datamapper: Only get element name if there's an elementKim Alvefur2021-03-191-1/+3
| | | | Fixes error due to attempting to index a nil value
* util.datamapper: Fix arrays nesting one level too deepKim Alvefur2021-03-191-9/+9
|
* util.datamapper: Deal with type name changes in util.jsonschemaKim Alvefur2021-03-191-1/+1
|
* util.jsonschema: Rename types for improved readabilityKim Alvefur2021-03-181-3/+12
|
* util.datamapper: Limited support for unparsing simple arrays of stringsKim Alvefur2021-03-181-11/+41
|
* util.datamapper: Add initial support for parsing arraysKim Alvefur2021-03-181-9/+47
|
* util.datamapper: Factor out common schema unpackingKim Alvefur2021-03-141-80/+53
| | | | | This code extracts the bits from the schema that determines how the data is to be mapped to/from XML.
* util.datamapper: Separate extraction of xml from coercion to target typeKim Alvefur2021-03-141-34/+28
| | | | | | Now it gets the text, attribute or name first, then turns it into whatever the schema wants. This should be easier to further factor out into preparation for array support.
* util.datamapper: Use enum instead of mutually exclusive booleansKim Alvefur2021-03-141-20/+20
| | | | Cleaner and rules out invalid combinations.
* util.datamapper: Enumerated elementsKim Alvefur2021-03-121-1/+20
| | | | E.g. error conditions or chat states.
* util.datamapper: Add references with notesKim Alvefur2021-03-101-0/+3
|
* util.jsonschema: Restructure "type" keyword handlingKim Alvefur2021-03-091-9/+10
| | | | More in line with the other tests
* util.jsonschema: Syntax tweak to not upset syntax highlightingKim Alvefur2021-03-091-2/+2
| | | | | That whole condition stanza was shown as angry red, I think it's something with 'enum' being a key word in Teal.
* util.jsonschema: Implement "propertyNames"Kim Alvefur2021-03-091-0/+6
| | | | This is a bit special in Lua as tables are not limited to string keys
* util.jsonschema: Restructure handling of "properties" and "additionalProperties"Kim Alvefur2021-03-091-22/+8
| | | | This is a bit cleaner, I think
* util.jsonschema: Fix "uniqueItems" prematurely declaring a matchKim Alvefur2021-03-091-1/+0
|
* util.jsonschema: Implement the "prefixItems" keywordKim Alvefur2021-03-091-1/+12
| | | | This may have been what got me confused about "items" being an array.
* util.jsonschema: Implement the "contains" keywordKim Alvefur2021-03-091-0/+13
| | | | And apparently I had mistaken this for an array
* util.jsonschema: Allow a boolean as schemaKim Alvefur2021-03-091-0/+3
| | | | | | Apparently a schema must be either an object or a boolean. Not sure where I got this string shortcut from, but I think I will keep it as it is very convenient.
* util.jsonschema: Correct "items" keywordKim Alvefur2021-03-091-12/+4
| | | | | | Upon re-reading the JSON Schema spec, I found that 'items' wasn't a union of an array of schemas or a single schema, not sure where I got that from.
* util.datamapper: Add support for mapping of elements where only one ↵Kim Alvefur2021-03-071-0/+34
| | | | | | | attribute matters E.g. <feature var='foo'/> in XEP-0030 and some other simple specifications.
* util.datamapper: Add logic for "boolean" tags here the presence means trueKim Alvefur2021-03-071-3/+9
|
* util.datamapper: Invent extension for using tag name as valueKim Alvefur2021-03-061-2/+15
| | | | | Useful for certain enum-like uses where the element name is the relevant information, e.g. chat states.
* util.datamapper: Add 'unparse' for turning tables into XMLKim Alvefur2021-03-071-1/+102
|
* util.datamapper: Library for extracting data from stanzasKim Alvefur2021-03-071-0/+96
| | | | Based on the XML support in the OpenAPI specification.
* util.jsonschema: Library for JSON Schema validationKim Alvefur2021-03-061-0/+245
|
* util.gc: Fix check for Lua 5.4Kim Alvefur2021-03-161-1/+1
|
* util.rsm: Correctly coerce integer value for <index> (fix #1642)Kim Alvefur2021-03-061-0/+3
|
* util.rsm: Improve readability using compacter stanza building APIKim Alvefur2021-03-061-5/+5
| | | | At least I think :text_tag improves readability.
* util.prosodyctl.shell: Allow passing a single command as argumentKim Alvefur2021-03-051-0/+29
| | | | | | | | | | | | | | | | | | | | | | | | Test procedure: $ prosodyctl shell 'server:version()' Expect: > OK: hg:926d53af9a7a $ prosodyctl shell 'server:version()' 'hello' Expect: > Only one command is supported as argument $ prosodyctl shell 'lorem ipsum'; echo $? Expect: > Sorry, I couldn't understand that... console:1: syntax error near 'show' > 1 (error code) Thanks Menel for mentioning the feature