Annotate

spec/util_interpolation_spec.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 11308:5d4d90d1eabb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9737
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local template = [[
10350
75eab21b7968 util.interpolation: Test #1452
Kim Alvefur <zash@zash.se>
parents: 9737
diff changeset
2 {greet!?Hi}, {name?world}!
9737
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 ]];
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local expect1 = [[
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 Hello, WORLD!
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 ]];
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local expect2 = [[
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 Hello, world!
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 ]];
10350
75eab21b7968 util.interpolation: Test #1452
Kim Alvefur <zash@zash.se>
parents: 9737
diff changeset
10 local expect3 = [[
75eab21b7968 util.interpolation: Test #1452
Kim Alvefur <zash@zash.se>
parents: 9737
diff changeset
11 Hi, YOU!
75eab21b7968 util.interpolation: Test #1452
Kim Alvefur <zash@zash.se>
parents: 9737
diff changeset
12 ]];
10351
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
13 local template_array = [[
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
14 {foo#{idx}. {item}
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
15 }]]
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
16 local expect_array = [[
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
17 1. HELLO
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
18 2. WORLD
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
19 ]]
10412
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
20 local template_func_pipe = [[
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
21 {foo|sort#{idx}. {item}
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
22 }]]
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
23 local expect_func_pipe = [[
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
24 1. A
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
25 2. B
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
26 3. C
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
27 4. D
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
28 ]]
10352
dc1e6c2fb50a util.interpolation: Test map syntax
Kim Alvefur <zash@zash.se>
parents: 10351
diff changeset
29 local template_map = [[
dc1e6c2fb50a util.interpolation: Test map syntax
Kim Alvefur <zash@zash.se>
parents: 10351
diff changeset
30 {foo%{idx}: {item!}
dc1e6c2fb50a util.interpolation: Test map syntax
Kim Alvefur <zash@zash.se>
parents: 10351
diff changeset
31 }]]
dc1e6c2fb50a util.interpolation: Test map syntax
Kim Alvefur <zash@zash.se>
parents: 10351
diff changeset
32 local expect_map = [[
dc1e6c2fb50a util.interpolation: Test map syntax
Kim Alvefur <zash@zash.se>
parents: 10351
diff changeset
33 FOO: bar
dc1e6c2fb50a util.interpolation: Test map syntax
Kim Alvefur <zash@zash.se>
parents: 10351
diff changeset
34 ]]
11064
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
35 local template_not = [[
11065
95eb1a981ef6 util.interpolation: Add test for ~ when value is false (not just nil)
Matthew Wild <mwild1@gmail.com>
parents: 11064
diff changeset
36 {thing~Thing is falsy}{thing&Thing is truthy}
11064
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
37 ]]
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
38 local expect_not_true = [[
11065
95eb1a981ef6 util.interpolation: Add test for ~ when value is false (not just nil)
Matthew Wild <mwild1@gmail.com>
parents: 11064
diff changeset
39 Thing is truthy
11064
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
40 ]]
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
41 local expect_not_nil = [[
11065
95eb1a981ef6 util.interpolation: Add test for ~ when value is false (not just nil)
Matthew Wild <mwild1@gmail.com>
parents: 11064
diff changeset
42 Thing is falsy
95eb1a981ef6 util.interpolation: Add test for ~ when value is false (not just nil)
Matthew Wild <mwild1@gmail.com>
parents: 11064
diff changeset
43 ]]
95eb1a981ef6 util.interpolation: Add test for ~ when value is false (not just nil)
Matthew Wild <mwild1@gmail.com>
parents: 11064
diff changeset
44 local expect_not_false = [[
95eb1a981ef6 util.interpolation: Add test for ~ when value is false (not just nil)
Matthew Wild <mwild1@gmail.com>
parents: 11064
diff changeset
45 Thing is falsy
11064
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
46 ]]
9737
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 describe("util.interpolation", function ()
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 it("renders", function ()
10412
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
49 local render = require "util.interpolation".new("%b{}", string.upper, { sort = function (t) table.sort(t) return t end });
9737
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 assert.equal(expect1, render(template, { greet = "Hello", name = "world" }));
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 assert.equal(expect2, render(template, { greet = "Hello" }));
10350
75eab21b7968 util.interpolation: Test #1452
Kim Alvefur <zash@zash.se>
parents: 9737
diff changeset
52 assert.equal(expect3, render(template, { name = "you" }));
10351
72b23c5f74fb util.interpolation: Test array syntax
Kim Alvefur <zash@zash.se>
parents: 10350
diff changeset
53 assert.equal(expect_array, render(template_array, { foo = { "Hello", "World" } }));
10412
b788b5257945 util.interpolation: Test template filters
Kim Alvefur <zash@zash.se>
parents: 10352
diff changeset
54 assert.equal(expect_func_pipe, render(template_func_pipe, { foo = { "c", "a", "d", "b", } }));
10413
604096ce2f82 util.interpolation: Add commented test case for passing nil to filter
Kim Alvefur <zash@zash.se>
parents: 10412
diff changeset
55 -- assert.equal("", render(template_func_pipe, { foo = nil })); -- FIXME
10352
dc1e6c2fb50a util.interpolation: Test map syntax
Kim Alvefur <zash@zash.se>
parents: 10351
diff changeset
56 assert.equal(expect_map, render(template_map, { foo = { foo = "bar" } }));
11064
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
57 assert.equal(expect_not_true, render(template_not, { thing = true }));
af1e3b7d9ea3 util.interpolation: Add '~' as the opposite of '&' (render sub-block if falsy)
Matthew Wild <mwild1@gmail.com>
parents: 10413
diff changeset
58 assert.equal(expect_not_nil, render(template_not, { thing = nil }));
11065
95eb1a981ef6 util.interpolation: Add test for ~ when value is false (not just nil)
Matthew Wild <mwild1@gmail.com>
parents: 11064
diff changeset
59 assert.equal(expect_not_false, render(template_not, { thing = false }));
9737
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 end);
11308
5d4d90d1eabb util.interpolation: Add test for #1623
Kim Alvefur <zash@zash.se>
parents: 11065
diff changeset
61 it("fixes #1623", function ()
5d4d90d1eabb util.interpolation: Add test for #1623
Kim Alvefur <zash@zash.se>
parents: 11065
diff changeset
62 local render = require "util.interpolation".new("%b{}", string.upper, { x = string.lower });
5d4d90d1eabb util.interpolation: Add test for #1623
Kim Alvefur <zash@zash.se>
parents: 11065
diff changeset
63 assert.equal("", render("{foo?}", { }))
5d4d90d1eabb util.interpolation: Add test for #1623
Kim Alvefur <zash@zash.se>
parents: 11065
diff changeset
64 assert.equal("", render("{foo|x?}", { }))
5d4d90d1eabb util.interpolation: Add test for #1623
Kim Alvefur <zash@zash.se>
parents: 11065
diff changeset
65 end);
9737
3d6f5b20cca6 spec: Stub tests for util.interpolation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 end);