Skip to content

Commit 53ba8ab

Browse files
committed
Added functions match_remove/1,3,4 to all metrics
match_remove can be used to selectively remove values for multiple labels. The match head and match condition use the same rules as the match speficiation parts of the same name.
1 parent b38f87d commit 53ba8ab

12 files changed

+382
-10
lines changed

src/metrics/prometheus_boolean.erl

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242
remove/1,
4343
remove/2,
4444
remove/3,
45+
match_remove/1,
46+
match_remove/3,
47+
match_remove/4,
4548
reset/1,
4649
reset/2,
4750
reset/3,
@@ -208,6 +211,27 @@ remove(Name, LabelValues) ->
208211
remove(Registry, Name, LabelValues) ->
209212
prometheus_metric:remove_labels(?TABLE, Registry, Name, LabelValues).
210213

214+
%% @equiv match_remove(default, Name, [], [])
215+
match_remove(Name) ->
216+
match_remove(default, Name, [], []).
217+
218+
%% @equiv match_remove(default, Name, LMatchHead, LMatchCond)
219+
match_remove(Name, LMatchHead, LMatchCond) ->
220+
match_remove(default, Name, LMatchHead, LMatchCond).
221+
222+
%% @doc Remove the value of the boolean matched by `Registry', `Name',
223+
%% `LMatchHead' and `LMatchCond'.
224+
%%
225+
%% Raises `{unknown_metric, Registry, Name}' error if boolean with name `Name'
226+
%% can't be found in `Registry'.<br/>
227+
%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
228+
%% mismatch.
229+
%% Returns the number of removed entries.
230+
%% @end
231+
match_remove(Registry, Name, LMatchHead, LMatchCond) ->
232+
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LMatchHead),
233+
ets:select_delete(?TABLE, delete_match_spec(Registry, Name, LMatchHead, LMatchCond)).
234+
211235
%% @equiv reset(default, Name, [])
212236
reset(Name) ->
213237
reset(default, Name, []).
@@ -295,7 +319,10 @@ collect_metrics(Name, {CLabels, Labels, Registry}) ->
295319
%%====================================================================
296320

297321
deregister_select(Registry, Name) ->
298-
[{{{Registry, Name, '_'}, '_'}, [], [true]}].
322+
delete_match_spec(Registry, Name, '_', []).
323+
324+
delete_match_spec(Registry, Name, LMatchHead, LMatchCond) ->
325+
[{{{Registry, Name, LMatchHead}, '_'}, LMatchCond, [true]}].
299326

300327
set_(Registry, Name, LabelValues, Value) ->
301328
case ets:update_element(?TABLE, {Registry, Name, LabelValues},

src/metrics/prometheus_counter.erl

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@
6565
remove/1,
6666
remove/2,
6767
remove/3,
68+
match_remove/1,
69+
match_remove/3,
70+
match_remove/4,
6871
reset/1,
6972
reset/2,
7073
reset/3,
@@ -229,6 +232,27 @@ remove(Registry, Name, LabelValues) ->
229232
_ -> true
230233
end.
231234

235+
%% @equiv match_remove(default, Name, [], [])
236+
match_remove(Name) ->
237+
match_remove(default, Name, [], []).
238+
239+
%% @equiv match_remove(default, Name, LMatchHead, LMatchCond)
240+
match_remove(Name, LMatchHead, LMatchCond) ->
241+
match_remove(default, Name, LMatchHead, LMatchCond).
242+
243+
%% @doc Remove the value of the counter matched by `Registry', `Name',
244+
%% `LMatchHead' and `LMatchCond'.
245+
%%
246+
%% Raises `{unknown_metric, Registry, Name}' error if boolean with name `Name'
247+
%% can't be found in `Registry'.<br/>
248+
%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
249+
%% mismatch.
250+
%% Returns the number of removed entries.
251+
%% @end
252+
match_remove(Registry, Name, LMatchHead, LMatchCond) ->
253+
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LMatchHead),
254+
ets:select_delete(?TABLE, delete_match_spec(Registry, Name, LMatchHead, LMatchCond)).
255+
232256
%% @equiv reset(default, Name, [])
233257
reset(Name) ->
234258
reset(default, Name, []).
@@ -325,7 +349,10 @@ collect_metrics(Name, {CLabels, Labels, Registry}) ->
325349
%%====================================================================
326350

327351
deregister_select(Registry, Name) ->
328-
[{{{Registry, Name, '_', '_'}, '_', '_'}, [], [true]}].
352+
delete_match_spec(Registry, Name, '_', []).
353+
354+
delete_match_spec(Registry, Name, LMatchHead, LMatchCond) ->
355+
[{{{Registry, Name, LMatchHead, '_'}, '_', '_'}, LMatchCond, [true]}].
329356

330357
insert_metric(Registry, Name, LabelValues, Value, ConflictCB) ->
331358
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),

src/metrics/prometheus_gauge.erl

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@
6868
remove/1,
6969
remove/2,
7070
remove/3,
71+
match_remove/1,
72+
match_remove/3,
73+
match_remove/4,
7174
reset/1,
7275
reset/2,
7376
reset/3,
@@ -370,6 +373,26 @@ remove(Name, LabelValues) ->
370373
remove(Registry, Name, LabelValues) ->
371374
prometheus_metric:remove_labels(?TABLE, Registry, Name, LabelValues).
372375

376+
%% @equiv match_remove(default, Name, [], [])
377+
match_remove(Name) ->
378+
match_remove(default, Name, [], []).
379+
380+
%% @equiv match_remove(default, Name, LMatchHead, LMatchCond)
381+
match_remove(Name, LMatchHead, LMatchCond) ->
382+
match_remove(default, Name, LMatchHead, LMatchCond).
383+
384+
%% @doc Remove the value of the gauge matched by `Registry', `Name',
385+
%% `LMatchHead' and `LMatchCond'.
386+
%%
387+
%% Raises `{unknown_metric, Registry, Name}' error if boolean with name `Name'
388+
%% can't be found in `Registry'.<br/>
389+
%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
390+
%% mismatch.
391+
%% @end
392+
match_remove(Registry, Name, LMatchHead, LMatchCond) ->
393+
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LMatchHead),
394+
ets:select_delete(?TABLE, delete_match_spec(Registry, Name, LMatchHead, LMatchCond)).
395+
373396
%% @equiv reset(default, Name, [])
374397
reset(Name) ->
375398
reset(default, Name, []).
@@ -469,7 +492,10 @@ maybe_insert_metric_for_inc(Registry, Name, LabelValues, Value) ->
469492
end.
470493

471494
deregister_select(Registry, Name) ->
472-
[{{{Registry, Name, '_'}, '_', '_'}, [], [true]}].
495+
delete_match_spec(Registry, Name, '_', []).
496+
497+
delete_match_spec(Registry, Name, LMatchHead, LMatchCond) ->
498+
[{{{Registry, Name, LMatchHead}, '_', '_'}, LMatchCond, [true]}].
473499

474500
insert_metric(Registry, Name, LabelValues, Value, ConflictCB) ->
475501
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),

src/metrics/prometheus_histogram.erl

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
remove/1,
5050
remove/2,
5151
remove/3,
52+
match_remove/1,
53+
match_remove/3,
54+
match_remove/4,
5255
reset/1,
5356
reset/2,
5457
reset/3,
@@ -299,6 +302,28 @@ remove(Registry, Name, LabelValues) ->
299302
_ -> true
300303
end.
301304

305+
%% @equiv match_remove(default, Name, [], [])
306+
match_remove(Name) ->
307+
match_remove(default, Name, [], []).
308+
309+
%% @equiv match_remove(default, Name, LMatchHead, LMatchCond)
310+
match_remove(Name, LMatchHead, LMatchCond) ->
311+
match_remove(default, Name, LMatchHead, LMatchCond).
312+
313+
%% @doc Remove the value of the histogram matched by `Registry', `Name',
314+
%% `LMatchHead' and `LMatchCond'.
315+
%%
316+
%% Raises `{unknown_metric, Registry, Name}' error if histogram with name
317+
%% `Name' can't be found in `Registry'.<br/>
318+
%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
319+
%% mismatch.
320+
%% Returns the number of removed entries.
321+
%% @end
322+
match_remove(Registry, Name, LMatchHead, LMatchCond) ->
323+
MF = prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LMatchHead),
324+
Buckets = prometheus_metric:mf_data(MF),
325+
ets:select_delete(?TABLE, delete_match_spec(Registry, Name, LMatchHead, LMatchCond, Buckets)).
326+
302327
%% @equiv reset(default, Name, [])
303328
reset(Name) ->
304329
reset(default, Name, []).
@@ -529,9 +554,12 @@ load_all_values(Registry, Name, Bounds) ->
529554
ets:match(?TABLE, list_to_tuple(QuerySpec)).
530555

531556
deregister_select(Registry, Name, Buckets) ->
557+
delete_match_spec(Registry, Name, '_', [], Buckets).
558+
559+
delete_match_spec(Registry, Name, LMatchHead, LMatchCond, Buckets) ->
532560
BoundCounters = lists:duplicate(length(Buckets), '_'),
533-
MetricSpec = [{Registry, Name, '_', '_'}, '_', '_', '_'] ++ BoundCounters,
534-
[{list_to_tuple(MetricSpec), [], [true]}].
561+
MetricSpec = [{Registry, Name, LMatchHead, '_'}, '_', '_', '_'] ++ BoundCounters,
562+
[{list_to_tuple(MetricSpec), LMatchCond, [true]}].
535563

536564
delete_metrics(Registry, Buckets) ->
537565
BoundCounters = lists:duplicate(length(Buckets), '_'),

src/metrics/prometheus_quantile_summary.erl

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
remove/1,
5050
remove/2,
5151
remove/3,
52+
match_remove/1,
53+
match_remove/3,
54+
match_remove/4,
5255
reset/1,
5356
reset/2,
5457
reset/3,
@@ -233,6 +236,27 @@ remove(Registry, Name, LabelValues) ->
233236
_ -> true
234237
end.
235238

239+
%% @equiv match_remove(default, Name, [], [])
240+
match_remove(Name) ->
241+
match_remove(default, Name, [], []).
242+
243+
%% @equiv match_remove(default, Name, LMatchHead, LMatchCond)
244+
match_remove(Name, LMatchHead, LMatchCond) ->
245+
match_remove(default, Name, LMatchHead, LMatchCond).
246+
247+
%% @doc Remove the value of the summary series matched by `Registry', `Name',
248+
%% `LMatchHead' and `LMatchCond'.
249+
%%
250+
%% Raises `{unknown_metric, Registry, Name}' error if boolean with name `Name'
251+
%% can't be found in `Registry'.<br/>
252+
%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
253+
%% mismatch.
254+
%% Returns the number of removed entries.
255+
%% @end
256+
match_remove(Registry, Name, LMatchHead, LMatchCond) ->
257+
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LMatchHead),
258+
ets:select_delete(?TABLE, delete_match_spec(Registry, Name, LMatchHead, LMatchCond)).
259+
236260
%% @equiv reset(default, Name, [])
237261
reset(Name) ->
238262
reset(default, Name, []).
@@ -365,7 +389,10 @@ collect_metrics(Name, {CLabels, Labels, Registry, DU, Configuration}) ->
365389
%%====================================================================
366390

367391
deregister_select(Registry, Name) ->
368-
[{{{Registry, Name, '_', '_'}, '_', '_', '_', '_'}, [], [true]}].
392+
delete_match_spec(Registry, Name, '_', []).
393+
394+
delete_match_spec(Registry, Name, LMatchHead, LMatchCond) ->
395+
[{{{Registry, Name, LMatchHead, '_'}, '_', '_', '_', '_'}, LMatchCond, [true]}].
369396

370397
validate_summary_spec(Spec) ->
371398
Labels = prometheus_metric_spec:labels(Spec),

src/metrics/prometheus_summary.erl

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
remove/1,
4242
remove/2,
4343
remove/3,
44+
match_remove/1,
45+
match_remove/3,
46+
match_remove/4,
4447
reset/1,
4548
reset/2,
4649
reset/3,
@@ -228,6 +231,26 @@ remove(Registry, Name, LabelValues) ->
228231
_ -> true
229232
end.
230233

234+
%% @equiv match_remove(default, Name, [], [])
235+
match_remove(Name) ->
236+
match_remove(default, Name, [], []).
237+
238+
%% @equiv match_remove(default, Name, LMatchHead, LMatchCond)
239+
match_remove(Name, LMatchHead, LMatchCond) ->
240+
match_remove(default, Name, LMatchHead, LMatchCond).
241+
242+
%% @doc Remove the value of the summary matched by `Registry', `Name',
243+
%% `LMatchHead' and `LMatchCond'.
244+
%%
245+
%% Raises `{unknown_metric, Registry, Name}' error if summary with name `Name'
246+
%% can't be found in `Registry'.<br/>
247+
%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
248+
%% mismatch.
249+
%% @end
250+
match_remove(Registry, Name, LMatchHead, LMatchCond) ->
251+
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LMatchHead),
252+
ets:select_delete(?TABLE, delete_match_spec(Registry, Name, LMatchHead, LMatchCond)).
253+
231254
%% @equiv reset(default, Name, [])
232255
reset(Name) ->
233256
reset(default, Name, []).
@@ -353,7 +376,10 @@ collect_metrics(Name, {CLabels, Labels, Registry, DU}) ->
353376
%%====================================================================
354377

355378
deregister_select(Registry, Name) ->
356-
[{{{Registry, Name, '_', '_'}, '_', '_', '_'}, [], [true]}].
379+
delete_match_spec(Registry, Name, '_', []).
380+
381+
delete_match_spec(Registry, Name, LMatchHead, LMatchCond) ->
382+
[{{{Registry, Name, LMatchHead, '_'}, '_', '_', '_'}, LMatchCond, [true]}].
357383

358384
validate_summary_spec(Spec) ->
359385
Labels = prometheus_metric_spec:labels(Spec),

test/eunit/metric/prometheus_boolean_tests.erl

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ prometheus_format_test_() ->
1414
fun test_toggle/1,
1515
fun test_deregister/1,
1616
fun test_remove/1,
17+
fun test_match_remove/1,
1718
fun test_default_value/1,
1819
fun test_collector1/1,
1920
fun test_collector2/1,
@@ -66,7 +67,11 @@ test_errors(_) ->
6667
?_assertError({unknown_metric, default, unknown_metric},
6768
prometheus_boolean:remove(unknown_metric)),
6869
?_assertError({invalid_metric_arity, 2, 1},
69-
prometheus_boolean:remove(with_label, [repo, db]))
70+
prometheus_boolean:remove(with_label, [repo, db])),
71+
?_assertError({unknown_metric, default, unknown_metric},
72+
prometheus_boolean:match_remove(unknown_metric)),
73+
?_assertError({invalid_metric_arity, 2, 1},
74+
prometheus_boolean:match_remove(with_label, [repo, db], []))
7075
].
7176

7277
test_set(_) ->
@@ -145,6 +150,36 @@ test_remove(_) ->
145150
?_assertEqual(false, RResult3),
146151
?_assertEqual(false, RResult4)].
147152

153+
test_match_remove(_) ->
154+
prometheus_boolean:new([{name, fuse_state},
155+
{labels, [pool]},
156+
{help, ""}]),
157+
prometheus_boolean:new([{name, simple_boolean}, {help, ""}]),
158+
159+
prometheus_boolean:set(fuse_state, [mongodb], true),
160+
prometheus_boolean:set(simple_boolean, true),
161+
162+
BRValue1 = prometheus_boolean:value(fuse_state, [mongodb]),
163+
BRValue2 = prometheus_boolean:value(simple_boolean),
164+
165+
RResult1 = prometheus_boolean:match_remove(fuse_state, ['$1'], [{'=:=','$1', mongodb}]),
166+
RResult2 = prometheus_boolean:match_remove(simple_boolean),
167+
168+
ARValue1 = prometheus_boolean:value(fuse_state, [mongodb]),
169+
ARValue2 = prometheus_boolean:value(simple_boolean),
170+
171+
RResult3 = prometheus_boolean:match_remove(fuse_state, ['$1'], [{'=:=','$1', mongodb}]),
172+
RResult4 = prometheus_boolean:match_remove(simple_boolean),
173+
174+
[?_assertEqual(true, BRValue1),
175+
?_assertEqual(true, BRValue2),
176+
?_assertEqual(1, RResult1),
177+
?_assertEqual(1, RResult2),
178+
?_assertEqual(undefined, ARValue1),
179+
?_assertEqual(undefined, ARValue2),
180+
?_assertEqual(0, RResult3),
181+
?_assertEqual(0, RResult4)].
182+
148183
test_default_value(_) ->
149184
prometheus_boolean:new([{name, fuse_state},
150185
{labels, [name]},

0 commit comments

Comments
 (0)