Skip to content

Commit b7cdd4f

Browse files
authored
Tablewise Mnesia Metrics ... Optimized collect_metric for summaries and better metric registrations (#113)
* persisting metrics using prometheus_sup:register_metrics/1 * adding per table size and memory usage in prometheus_mnesia_collector (#2) * adding per table size and memory usage in prometheus_mnesia_collector * fixing doc * making prometheus_summary:collect_metric more efficient (#3) * fixing formatting issues
1 parent 2719b3c commit b7cdd4f

File tree

3 files changed

+64
-22
lines changed

3 files changed

+64
-22
lines changed

src/collectors/mnesia/prometheus_mnesia_collector.erl

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ add_metric_family({Name, Type, Help, Metrics}, Callback) ->
122122
metrics(EnabledMetrics) ->
123123
{Participants, Coordinators} = get_tm_info(EnabledMetrics),
124124
MemoryUsage = get_memory_usage(),
125+
TablewiseMemoryUsage = get_tablewise_memory_usage(),
126+
TablewiseSize = get_tablewise_size(),
125127

126128
[{held_locks, gauge,
127129
"Number of held locks.",
@@ -149,7 +151,14 @@ metrics(EnabledMetrics) ->
149151
fun() -> mnesia:system_info(transaction_restarts) end},
150152
{memory_usage_bytes, gauge,
151153
"Total number of bytes allocated by all mnesia tables",
152-
fun() -> MemoryUsage end}].
154+
fun() -> MemoryUsage end},
155+
{tablewise_memory_usage_bytes, gauge,
156+
"Number of bytes allocated per mnesia table",
157+
fun() -> TablewiseMemoryUsage end},
158+
{tablewise_size, gauge,
159+
"Number of rows present per table",
160+
fun() -> TablewiseSize end}
161+
].
153162

154163
%%====================================================================
155164
%% Private Parts
@@ -189,4 +198,19 @@ get_memory_usage() ->
189198
Calculator = fun(Tab, Sum) ->
190199
mnesia:table_info(Tab, memory) + Sum
191200
end,
192-
lists:foldl(Calculator, 0, mnesia:system_info(tables)) * WordSize.
201+
lists:foldl(Calculator, 0, mnesia:system_info(tables)) * WordSize.
202+
203+
get_tablewise_memory_usage() ->
204+
WordSize = erlang:system_info(wordsize),
205+
Calculator =
206+
fun(Tab, Acc) ->
207+
[{[{table, Tab}], mnesia:table_info(Tab, memory) * WordSize} | Acc]
208+
end,
209+
lists:foldl(Calculator, [], mnesia:system_info(tables)).
210+
211+
get_tablewise_size() ->
212+
Calculator =
213+
fun(Tab, Acc) ->
214+
[{[{table, Tab}], mnesia:table_info(Tab, size)} | Acc]
215+
end,
216+
lists:foldl(Calculator, [], mnesia:system_info(tables)).

src/metrics/prometheus_summary.erl

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -294,12 +294,21 @@ values(Registry, Name) ->
294294
DU = prometheus_metric:mf_duration_unit(MF),
295295
Labels = prometheus_metric:mf_labels(MF),
296296
MFValues = load_all_values(Registry, Name),
297-
[begin
298-
{Count, Sum} = reduce_label_values(LabelValues, MFValues),
299-
{lists:zip(Labels, LabelValues), Count,
300-
prometheus_time:maybe_convert_to_du(DU, Sum)}
301-
end ||
302-
LabelValues <- collect_unique_labels(MFValues)]
297+
ReducedMap = lists:foldl(
298+
fun([L, C, IS, FS], ResAcc) ->
299+
{PrevCount, PrevSum} = maps:get(L, ResAcc, {0, 0}),
300+
ResAcc#{L => {PrevCount + C, PrevSum + IS + FS}}
301+
end,
302+
#{},
303+
MFValues),
304+
ReducedMapList = lists:sort(maps:to_list(ReducedMap)),
305+
lists:foldr(
306+
fun({LabelValues, {Count, Sum}}, Acc) ->
307+
[{lists:zip(Labels, LabelValues), Count,
308+
prometheus_time:maybe_convert_to_du(DU, Sum)} | Acc]
309+
end,
310+
[],
311+
ReducedMapList)
303312
end.
304313

305314
%%====================================================================
@@ -322,13 +331,22 @@ collect_mf(Registry, Callback) ->
322331
%% @private
323332
collect_metrics(Name, {CLabels, Labels, Registry, DU}) ->
324333
MFValues = load_all_values(Registry, Name),
325-
[begin
326-
{Count, Sum} = reduce_label_values(LabelValues, MFValues),
327-
prometheus_model_helpers:summary_metric(
328-
CLabels ++ lists:zip(Labels, LabelValues), Count,
329-
prometheus_time:maybe_convert_to_du(DU, Sum))
330-
end ||
331-
LabelValues <- collect_unique_labels(MFValues)].
334+
ReducedMap = lists:foldl(
335+
fun([L, C, IS, FS], ResAcc) ->
336+
{PrevCount, PrevSum} = maps:get(L, ResAcc, {0, 0}),
337+
ResAcc#{L => {PrevCount + C, PrevSum + IS + FS}}
338+
end,
339+
#{},
340+
MFValues),
341+
ReducedMapList = lists:sort(maps:to_list(ReducedMap)),
342+
lists:foldr(
343+
fun({LabelValues, {Count, Sum}}, Acc) ->
344+
[prometheus_model_helpers:summary_metric(
345+
CLabels ++ lists:zip(Labels, LabelValues), Count,
346+
prometheus_time:maybe_convert_to_du(DU, Sum)) | Acc]
347+
end,
348+
[],
349+
ReducedMapList).
332350

333351
%%====================================================================
334352
%% Private Parts
@@ -371,13 +389,6 @@ key(Registry, Name, LabelValues) ->
371389
Rnd = X band (?WIDTH-1),
372390
{Registry, Name, LabelValues, Rnd}.
373391

374-
collect_unique_labels(MFValues) ->
375-
lists:usort([L || [L, _, _, _] <- MFValues]).
376-
377-
reduce_label_values(Labels, MFValues) ->
378-
{lists:sum([C || [L, C, _, _] <- MFValues, L == Labels]),
379-
lists:sum([IS + FS || [L, _, IS, FS] <- MFValues, L == Labels])}.
380-
381392
reduce_values(Values) ->
382393
{lists:sum([C || [C, _, _] <- Values]),
383394
lists:sum([IS + FS || [_, IS, FS] <- Values])}.

src/prometheus_sup.erl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
-export([start_link/0]).
1010
%% Supervisor callbacks
1111
-export([init/1]).
12+
-export([register_metrics/1]).
1213

1314
-behaviour(supervisor).
1415

@@ -62,6 +63,12 @@ register_collectors() ->
6263
register_metrics() ->
6364
[declare_metric(Decl) || Decl <- default_metrics()].
6465

66+
register_metrics(Metrics) ->
67+
DefaultMetrics0 = default_metrics(),
68+
DefaultMetrics1 = lists:usort(DefaultMetrics0 ++ Metrics),
69+
application:set_env(prometheus, default_metrics, DefaultMetrics1),
70+
[declare_metric(Decl) || Decl <- Metrics].
71+
6572
setup_instrumenters() ->
6673
[prometheus_instrumenter:setup(Instrumenter) ||
6774
Instrumenter <- prometheus_instrumenter:enabled_instrumenters()].

0 commit comments

Comments
 (0)