Skip to content

Commit 7a5650d

Browse files
authored
Merge pull request #4390 from esl/check-probe-metrics-types
Check probe metrics types
2 parents 89617b2 + ccc6eb9 commit 7a5650d

File tree

4 files changed

+87
-49
lines changed

4 files changed

+87
-49
lines changed

doc/operation-and-maintenance/MongooseIM-metrics.md

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@ All metrics are divided into the following groups:
2727
=== "Prometheus"
2828

2929
<h3>`counter`</h3>
30-
30+
3131
A monotonically increasing metric type. It is used for events like the number of stanzas processed by the system.
32-
32+
3333
**Example:**
3434
```
3535
# TYPE c2s_element_in_message_count counter
3636
# HELP c2s_element_in_message_count Event: c2s_element_in, Metric: message_count
3737
c2s_element_in_message_count{host_type="localhost"} 0
3838
```
39-
39+
4040
<h3>`gauge`</h3>
41-
41+
4242
A metric that represents a current value in the system.
43-
43+
4444
**Example:**
4545
```
4646
# TYPE mnesia_info_running_db_nodes gauge
@@ -49,9 +49,9 @@ All metrics are divided into the following groups:
4949
```
5050

5151
<h3>`histogram`</h3>
52-
52+
5353
A histogram collects values and groups them in buckets.
54-
54+
5555
**Example:**
5656
```
5757
# TYPE c2s_xmpp_element_size_in_byte_size histogram
@@ -61,35 +61,35 @@ All metrics are divided into the following groups:
6161
c2s_xmpp_element_size_in_byte_size_bucket{le="1073741824"} 0
6262
c2s_xmpp_element_size_in_byte_size_bucket{le="+Inf"} 0
6363
```
64-
64+
6565
=== "Exometer"
66-
66+
6767
<h3>`spiral`</h3>
68-
68+
6969
This kind of metric provides 2 values: `total` event count (e.g. stanzas processed) and a value in 60s window (`one` value).
7070
Dividing `one` value by 60 provides an average per-second value over last minute.
71-
71+
7272
**Example:** `[{total, 1000}, {one, 20}]`
73-
73+
7474
<h3>`counter`</h3>
75-
75+
7676
A simple monotonically increasing value. It consists of two properties:
77-
77+
7878
**Example:** `[{value, 12}, {ms_since_reset, 91761}]`
79-
79+
8080
<h3>`gauge`</h3>
81-
81+
8282
It is similar to a `counter` type but can be set to any value.
83-
83+
8484
* `value`
8585
* `ms_since_reset` - Time in milliseconds elapsed from the last metric update.
86-
86+
8787
**Example:** `[{value, 12}, {ms_since_reset, 91761}]`
8888

8989
<h3>`histogram`</h3>
90-
90+
9191
A histogram collects values over a sliding window of 60s and exposes the following stats:
92-
92+
9393
* `n` - A number of samples.
9494
* `mean` - An arithmetic mean.
9595
* `min`
@@ -228,26 +228,26 @@ Since Exometer doesn't support labels, the host types and tags are part of the m
228228
| Name | Type | Description (when it gets incremented) |
229229
| ---- | ---- | -------------------------------------- |
230230
| `wpool_rdbms_stats_workers` | gauge | Number of workers in the pool |
231-
| `wpool_rdbms_stats_recv_oct` | counter | Number of bytes received |
232-
| `wpool_rdbms_stats_recv_cnt` | counter | Number of packets received |
233-
| `wpool_rdbms_stats_recv_max` | gauge | Size of the largest packet, in bytes |
234-
| `wpool_rdbms_stats_send_oct` | counter | Number of bytes sent |
235-
| `wpool_rdbms_stats_send_max` | gauge | Size of the largest packet |
236-
| `wpool_rdbms_stats_send_cnt` | counter | Number of packets sent |
237-
| `wpool_rdbms_stats_send_pend` | counter | Number of bytes waiting to be sent |
231+
| `wpool_rdbms_stats_recv_oct` | gauge | Number of bytes received |
232+
| `wpool_rdbms_stats_recv_cnt` | gauge | Number of packets received |
233+
| `wpool_rdbms_stats_recv_max` | gauge | Size of the largest packet, in bytes |
234+
| `wpool_rdbms_stats_send_oct` | gauge | Number of bytes sent |
235+
| `wpool_rdbms_stats_send_max` | gauge | Size of the largest packet |
236+
| `wpool_rdbms_stats_send_cnt` | gauge | Number of packets sent |
237+
| `wpool_rdbms_stats_send_pend` | gauge | Number of bytes waiting to be sent |
238238

239239
=== "Exometer"
240240

241241
| Name | Type | Description (when it gets incremented) |
242242
|--------------------------------------------------------------|---------|----------------------------------------|
243-
| `[HostType, wpool_rdbms_stats, PoolTag, workers]` | counter | Number of workers in the pool |
244-
| `[HostType, wpool_rdbms_stats, PoolTag, recv_oct]` | spiral | Number of bytes received |
245-
| `[HostType, wpool_rdbms_stats, PoolTag, recv_cnt]` | spiral | Number of packets received |
246-
| `[HostType, wpool_rdbms_stats, PoolTag, recv_max]` | gauge | Size of the largest packet, in bytes |
247-
| `[HostType, wpool_rdbms_stats, PoolTag, send_oct]` | spiral | Number of bytes sent |
248-
| `[HostType, wpool_rdbms_stats, PoolTag, send_max]` | gauge | Size of the largest packet |
249-
| `[HostType, wpool_rdbms_stats, PoolTag, send_cnt]` | spiral | Number of packets sent |
250-
| `[HostType, wpool_rdbms_stats, PoolTag, send_pend]` | spiral | Number of bytes waiting to be sent |
243+
| `[HostType, wpool_rdbms_stats, PoolTag, workers]` | gauge | Number of workers in the pool |
244+
| `[HostType, wpool_rdbms_stats, PoolTag, recv_oct]` | gauge | Number of bytes received |
245+
| `[HostType, wpool_rdbms_stats, PoolTag, recv_cnt]` | gauge | Number of packets received |
246+
| `[HostType, wpool_rdbms_stats, PoolTag, recv_max]` | gauge | Size of the largest packet, in bytes |
247+
| `[HostType, wpool_rdbms_stats, PoolTag, send_oct]` | gauge | Number of bytes sent |
248+
| `[HostType, wpool_rdbms_stats, PoolTag, send_max]` | gauge | Size of the largest packet |
249+
| `[HostType, wpool_rdbms_stats, PoolTag, send_cnt]` | gauge | Number of packets sent |
250+
| `[HostType, wpool_rdbms_stats, PoolTag, send_pend]` | gauge | Number of bytes waiting to be sent |
251251

252252
When using a Rabbit worker pool, metrics defined in [mod_event_pusher_rabbit](../modules/mod_event_pusher_rabbit.md) are
253253
available.

src/instrument/mongoose_instrument.erl

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
-type handler_key() :: atom(). % key in the `instrumentation' section of the config file
4747
-type handler_fun() :: fun((event_name(), labels(), config(), measurements()) -> any()).
4848
-type handlers() :: {[handler_fun()], config()}.
49+
-type handler_map() :: #{labels() => handlers()}.
4950
-type execution_time() :: integer().
5051
-type measure_fun(Result) :: fun((execution_time(), Result) -> measurements()).
5152
-type handler_module_opts() :: #{atom() => any()}.
@@ -274,16 +275,45 @@ set_up_and_register_event(EventName, Labels, Config, Events) ->
274275
{ExistingLabels, _, _} = maps:next(maps:iterator(HandlerMap)),
275276
case label_keys(ExistingLabels) of
276277
LabelKeys ->
277-
Handlers = do_set_up(EventName, Labels, Config),
278-
Events#{EventName := HandlerMap#{Labels => Handlers}};
278+
handle_metrics_config(EventName, Labels, Config, HandlerMap, Events);
279279
ExistingKeys ->
280280
{error, #{what => inconsistent_labels,
281281
event_name => EventName, labels => Labels,
282282
existing_label_keys => ExistingKeys}}
283283
end;
284284
#{} ->
285+
handle_metrics_config(EventName, Labels, Config, new, Events)
286+
end.
287+
288+
-spec handle_metrics_config(event_name(), labels(), config(), handler_map() | new, event_map()) ->
289+
event_map() | {error, map()}.
290+
handle_metrics_config(EventName, Labels, Config, HandlerMap, Events) ->
291+
case filter_improper_probe_metrics(Config) of
292+
{ok, _} ->
285293
Handlers = do_set_up(EventName, Labels, Config),
286-
Events#{EventName => #{Labels => Handlers}}
294+
case HandlerMap of
295+
new ->
296+
Events#{EventName => #{Labels => Handlers}};
297+
_ ->
298+
Events#{EventName := HandlerMap#{Labels => Handlers}}
299+
end;
300+
{error, FilteredMetrics} ->
301+
{error, #{what => non_gauge_metrics_in_probe,
302+
event_name => EventName, labels => Labels,
303+
improper_metrics => FilteredMetrics}}
304+
end.
305+
306+
-spec filter_improper_probe_metrics(config()) -> {ok, #{}} | {error, metrics()}.
307+
filter_improper_probe_metrics(Config) ->
308+
case Config of
309+
#{probe := _, metrics := Metrics} ->
310+
FilteredMetrics = maps:filter(fun(_, V) -> V =/= gauge end, Metrics),
311+
case map_size(FilteredMetrics) of
312+
0 -> {ok, FilteredMetrics};
313+
_ -> {error, FilteredMetrics}
314+
end;
315+
_ ->
316+
{ok, #{}}
287317
end.
288318

289319
-spec do_set_up(event_name(), labels(), config()) -> handlers().

src/wpool/mongoose_wpool_rdbms.erl

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ instrumentation(global, Tag) ->
4545
% Services use global pools. Since the same number of labels for a metric is expected, for an
4646
% event, global pool has to emit an event under a different name.
4747
[{wpool_global_rdbms_stats, #{pool_tag => Tag},
48-
#{probe => #{module => ?MODULE}, metrics => rdbms_data_stats_measurement_types()}}];
48+
#{probe => #{module => ?MODULE}, metrics => gauges([workers | inet_stats()])}}];
4949
instrumentation(HostType, Tag) ->
5050
[{wpool_rdbms_stats, #{host_type => HostType, pool_tag => Tag},
51-
#{probe => #{module => ?MODULE}, metrics => rdbms_data_stats_measurement_types()}}].
51+
#{probe => #{module => ?MODULE}, metrics => gauges([workers | inet_stats()])}}].
5252

5353
-spec probe(mongoose_instrument:event_name(), mongoose_instrument:labels()) ->
5454
mongoose_instrument:measurements().
@@ -166,12 +166,6 @@ empty_inet_stats_measurements() ->
166166
send_cnt => 0,
167167
send_pend => 0}.
168168

169-
rdbms_data_stats_measurement_types() ->
170-
#{workers => counter,
171-
recv_oct => spiral,
172-
recv_cnt => spiral,
173-
recv_max => gauge,
174-
send_oct => spiral,
175-
send_max => gauge,
176-
send_cnt => spiral,
177-
send_pend => spiral}.
169+
-spec gauges([mongoose_instrument:metric_name()]) -> mongoose_instrument:metrics().
170+
gauges(Keys) ->
171+
maps:from_keys(Keys, gauge).

test/mongoose_instrument_SUITE.erl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ api_test_cases() ->
3737
set_up_and_span_with_error,
3838
span_fails_when_not_set_up,
3939
set_up_probe,
40+
set_up_probe_with_incorrect_metric_type,
4041
set_up_failing_probe,
4142
set_up_and_tear_down_probe,
4243
unexpected_events,
@@ -224,6 +225,19 @@ set_up_probe(Config) ->
224225
fun(L) -> length(L) > 1 end),
225226
?assertEqual([ExpectedEvent, ExpectedEvent], History2).
226227

228+
set_up_probe_with_incorrect_metric_type(Config) ->
229+
Event = ?config(event, Config),
230+
Cfg = #{metrics => #{test_metric => gauge},
231+
probe => #{module => ?MODULE, interval => 1}},
232+
Cfg1 = #{metrics => ImproperMetrics = #{test_metric => spiral},
233+
probe => #{module => ?MODULE, interval => 1}},
234+
Specs = [{Event, #{key => value1}, Cfg},
235+
{Event, #{key => value2}, Cfg1}],
236+
?assertError(#{what := non_gauge_metrics_in_probe, improper_metrics := ImproperMetrics},
237+
mongoose_instrument:set_up(Event, ?LABELS, Cfg1)),
238+
?assertError(#{what := non_gauge_metrics_in_probe, improper_metrics := ImproperMetrics},
239+
mongoose_instrument:set_up(Specs)).
240+
227241
set_up_failing_probe(Config) ->
228242
Event = ?config(event, Config),
229243
Labels = ?LABELS,

0 commit comments

Comments
 (0)