diff --git a/src/metrics/prometheus_boolean.erl b/src/metrics/prometheus_boolean.erl
index c88e6299..e4ffbf14 100644
--- a/src/metrics/prometheus_boolean.erl
+++ b/src/metrics/prometheus_boolean.erl
@@ -45,6 +45,9 @@
reset/1,
reset/2,
reset/3,
+ clear/1,
+ clear/2,
+ clear/3,
value/1,
value/2,
value/3,
@@ -228,6 +231,26 @@ reset(Registry, Name, LabelValues) ->
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
ets:update_element(?TABLE, {Registry, Name, LabelValues}, {?BOOLEAN_POS, 0}).
+%% @equiv clear(default, Name, [])
+clear(Name) ->
+ clear(default, Name, []).
+
+%% @equiv clear(default, Name, LabelValues)
+clear(Name, LabelValues) ->
+ clear(default, Name, LabelValues).
+
+%% @doc Clear the value of the boolean identified by `Registry', `Name'
+%% and `LabelValues'.
+%%
+%% Raises `{unknown_metric, Registry, Name}' error if boolean with name `Name'
+%% can't be found in `Registry'.
+%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
+%% mismatch.
+%% @end
+clear(Registry, Name, LabelValues) ->
+ prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
+ ets:delete(?TABLE, {Registry, Name, LabelValues}).
+
%% @equiv value(default, Name, [])
value(Name) ->
value(default, Name, []).
diff --git a/src/metrics/prometheus_counter.erl b/src/metrics/prometheus_counter.erl
index adc4c28b..cf04c40a 100644
--- a/src/metrics/prometheus_counter.erl
+++ b/src/metrics/prometheus_counter.erl
@@ -68,6 +68,9 @@
reset/1,
reset/2,
reset/3,
+ clear/1,
+ clear/2,
+ clear/3,
value/1,
value/2,
value/3,
@@ -256,6 +259,29 @@ reset(Registry, Name, LabelValues) ->
_ -> false
end.
+%% @equiv clear(default, Name, [])
+clear(Name) ->
+ clear(default, Name, []).
+
+%% @equiv clear(default, Name, LabelValues)
+clear(Name, LabelValues) ->
+ clear(default, Name, LabelValues).
+
+%% @doc Clear the value of the counter identified by `Registry', `Name'
+%% and `LabelValues'.
+%%
+%% Raises `{unknown_metric, Registry, Name}' error if boolean with name `Name'
+%% can't be found in `Registry'.
+%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
+%% mismatch.
+%% @end
+clear(Registry, Name, LabelValues) ->
+ prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
+ case ets:select_delete(?TABLE, clear_select(Registry, Name, LabelValues)) of
+ 0 -> false;
+ _ -> true
+ end.
+
%% @equiv value(default, Name, [])
value(Name) ->
value(default, Name, []).
@@ -329,6 +355,9 @@ collect_metrics(Name, {CLabels, Labels, Registry}) ->
deregister_select(Registry, Name) ->
[{{{Registry, Name, '_', '_'}, '_', '_'}, [], [true]}].
+clear_select(Registry, Name, LabelValues) ->
+ [{{{Registry, Name, LabelValues, '_'}, '_', '_'}, [], [true]}].
+
insert_metric(Registry, Name, LabelValues, Value, ConflictCB) ->
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
Counter = {key(Registry, Name, LabelValues), 0, Value},
diff --git a/src/metrics/prometheus_gauge.erl b/src/metrics/prometheus_gauge.erl
index 1ada1aad..3288ad26 100644
--- a/src/metrics/prometheus_gauge.erl
+++ b/src/metrics/prometheus_gauge.erl
@@ -71,6 +71,9 @@
reset/1,
reset/2,
reset/3,
+ clear/1,
+ clear/2,
+ clear/3,
value/1,
value/2,
value/3,
@@ -390,6 +393,26 @@ reset(Registry, Name, LabelValues) ->
prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
ets:update_element(?TABLE, {Registry, Name, LabelValues}, [{?IGAUGE_POS, 0}, {?FGAUGE_POS, 0}]).
+%% @equiv clear(default, Name, [])
+clear(Name) ->
+ clear(default, Name, []).
+
+%% @equiv clear(default, Name, LabelValues)
+clear(Name, LabelValues) ->
+ clear(default, Name, LabelValues).
+
+%% @doc Clear the value of the gauge identified by `Registry', `Name'
+%% and `LabelValues'.
+%%
+%% Raises `{unknown_metric, Registry, Name}' error if boolean with name `Name'
+%% can't be found in `Registry'.
+%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
+%% mismatch.
+%% @end
+clear(Registry, Name, LabelValues) ->
+ prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
+ ets:delete(?TABLE, {Registry, Name, LabelValues}).
+
%% @equiv value(default, Name, [])
value(Name) ->
value(default, Name, []).
diff --git a/src/metrics/prometheus_histogram.erl b/src/metrics/prometheus_histogram.erl
index 0a7777fe..ecc65886 100644
--- a/src/metrics/prometheus_histogram.erl
+++ b/src/metrics/prometheus_histogram.erl
@@ -52,6 +52,9 @@
reset/1,
reset/2,
reset/3,
+ clear/1,
+ clear/2,
+ clear/3,
value/1,
value/2,
value/3,
@@ -329,6 +332,31 @@ reset(Registry, Name, LabelValues) ->
_ -> false
end.
+%% @equiv clear(default, Name, [])
+clear(Name) ->
+ clear(default, Name, []).
+
+%% @equiv clear(default, Name, LabelValues)
+clear(Name, LabelValues) ->
+ clear(default, Name, LabelValues).
+
+%% @doc Clear the value of the histogram identified by `Registry', `Name'
+%% and `LabelValues'.
+%%
+%% Raises `{unknown_metric, Registry, Name}' error if histogram with name
+%% `Name' can't be found in `Registry'.
+%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
+%% mismatch.
+%% @end
+clear(Registry, Name, LabelValues) ->
+ MF = prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
+ Buckets = prometheus_metric:mf_data(MF),
+
+ case ets:select_delete(?TABLE, clear_select(Registry, Name, LabelValues, Buckets)) of
+ 0 -> false;
+ _ -> true
+ end.
+
%% @equiv value(default, Name, [])
value(Name) ->
value(default, Name, []).
@@ -425,6 +453,11 @@ collect_metrics(Name, {CLabels, Labels, Registry, DU, Bounds}) ->
%% Private Parts
%%====================================================================
+clear_select(Registry, Name, LabelValues, Buckets) ->
+ BoundCounters = lists:duplicate(length(Buckets), '_'),
+ MetricSpec = [{Registry, Name, LabelValues, '_'}, '_', '_', '_'] ++ BoundCounters,
+ [{list_to_tuple(MetricSpec), [], [true]}].
+
validate_histogram_spec(Spec) ->
Labels = prometheus_metric_spec:labels(Spec),
validate_histogram_labels(Labels),
diff --git a/src/metrics/prometheus_summary.erl b/src/metrics/prometheus_summary.erl
index b7f2d729..1e534c6f 100644
--- a/src/metrics/prometheus_summary.erl
+++ b/src/metrics/prometheus_summary.erl
@@ -44,6 +44,9 @@
reset/1,
reset/2,
reset/3,
+ clear/1,
+ clear/2,
+ clear/3,
value/1,
value/2,
value/3,
@@ -255,6 +258,29 @@ reset(Registry, Name, LabelValues) ->
_ -> false
end.
+%% @equiv clear(default, Name, [])
+clear(Name) ->
+ clear(default, Name, []).
+
+%% @equiv clear(default, Name, LabelValues)
+clear(Name, LabelValues) ->
+ clear(default, Name, LabelValues).
+
+%% @doc Clear the value of the summary identified by `Registry', `Name'
+%% and `LabelValues'.
+%%
+%% Raises `{unknown_metric, Registry, Name}' error if summary with name `Name'
+%% can't be found in `Registry'.
+%% Raises `{invalid_metric_arity, Present, Expected}' error if labels count
+%% mismatch.
+%% @end
+clear(Registry, Name, LabelValues) ->
+ prometheus_metric:check_mf_exists(?TABLE, Registry, Name, LabelValues),
+ case ets:select_delete(?TABLE, clear_select(Registry, Name, LabelValues)) of
+ 0 -> false;
+ _ -> true
+ end.
+
%% @equiv value(default, Name, [])
value(Name) ->
value(default, Name, []).
@@ -337,6 +363,9 @@ collect_metrics(Name, {CLabels, Labels, Registry, DU}) ->
deregister_select(Registry, Name) ->
[{{{Registry, Name, '_', '_'}, '_', '_', '_'}, [], [true]}].
+clear_select(Registry, Name, LabelValues) ->
+ [{{{Registry, Name, LabelValues, '_'}, '_', '_', '_'}, [], [true]}].
+
validate_summary_spec(Spec) ->
Labels = prometheus_metric_spec:labels(Spec),
validate_summary_labels(Labels),
diff --git a/test/eunit/metric/prometheus_boolean_tests.erl b/test/eunit/metric/prometheus_boolean_tests.erl
index ad1973d0..f525fcaa 100644
--- a/test/eunit/metric/prometheus_boolean_tests.erl
+++ b/test/eunit/metric/prometheus_boolean_tests.erl
@@ -59,6 +59,10 @@ test_errors(_) ->
prometheus_boolean:reset(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
prometheus_boolean:reset(with_label, [repo, db])),
+ ?_assertError({unknown_metric, default, unknown_metric},
+ prometheus_boolean:clear(unknown_metric)),
+ ?_assertError({invalid_metric_arity, 2, 1},
+ prometheus_boolean:clear(with_label, [repo, db])),
?_assertError({unknown_metric, default, unknown_metric},
prometheus_boolean:value(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
@@ -85,9 +89,12 @@ test_set(_) ->
Value1 = prometheus_boolean:value(fuse_state, [mongodb]),
prometheus_boolean:reset(fuse_state, [mongodb]),
RValue = prometheus_boolean:value(fuse_state, [mongodb]),
+ prometheus_boolean:clear(fuse_state, [mongodb]),
+ CValue = prometheus_boolean:value(fuse_state, [mongodb]),
[?_assertEqual(true, Value),
?_assertEqual(false, Value1),
- ?_assertEqual(false, RValue)].
+ ?_assertEqual(false, RValue),
+ ?_assertEqual(undefined, CValue)].
test_toggle(_) ->
prometheus_boolean:new([{name, fuse_state}, {labels, [name]}, {help, ""}]),
diff --git a/test/eunit/metric/prometheus_counter_tests.erl b/test/eunit/metric/prometheus_counter_tests.erl
index 3ba59013..94db3e54 100644
--- a/test/eunit/metric/prometheus_counter_tests.erl
+++ b/test/eunit/metric/prometheus_counter_tests.erl
@@ -55,6 +55,10 @@ test_errors(_) ->
prometheus_counter:reset(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
prometheus_counter:reset(db_query_duration, [repo, db])),
+ ?_assertError({unknown_metric, default, unknown_metric},
+ prometheus_counter:clear(unknown_metric)),
+ ?_assertError({invalid_metric_arity, 2, 1},
+ prometheus_counter:clear(db_query_duration, [repo, db])),
?_assertError({unknown_metric, default, unknown_metric},
prometheus_counter:value(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
@@ -75,8 +79,11 @@ test_inc(_) ->
Value = prometheus_counter:value(http_requests_total, [get]),
prometheus_counter:reset(http_requests_total, [get]),
RValue = prometheus_counter:value(http_requests_total, [get]),
+ prometheus_counter:clear(http_requests_total, [get]),
+ CValue = prometheus_counter:value(http_requests_total, [get]),
[?_assertMatch(_ when Value > 7.4 andalso Value < 7.6, Value),
- ?_assertEqual(0, RValue)].
+ ?_assertEqual(0, RValue),
+ ?_assertEqual(undefined, CValue)].
test_deregister(_) ->
prometheus_counter:new([{name, http_requests_total},
diff --git a/test/eunit/metric/prometheus_gauge_tests.erl b/test/eunit/metric/prometheus_gauge_tests.erl
index 9febafaa..37ce3ad2 100644
--- a/test/eunit/metric/prometheus_gauge_tests.erl
+++ b/test/eunit/metric/prometheus_gauge_tests.erl
@@ -83,6 +83,10 @@ test_errors(_) ->
prometheus_gauge:reset(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
prometheus_gauge:reset(with_label, [repo, db])),
+ ?_assertError({unknown_metric, default, unknown_metric},
+ prometheus_gauge:clear(unknown_metric)),
+ ?_assertError({invalid_metric_arity, 2, 1},
+ prometheus_gauge:clear(with_label, [repo, db])),
?_assertError({unknown_metric, default, unknown_metric},
prometheus_gauge:value(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
@@ -101,9 +105,12 @@ test_set(_) ->
Value1 = prometheus_gauge:value(pool_size, [mongodb]),
prometheus_gauge:reset(pool_size, [mongodb]),
RValue = prometheus_gauge:value(pool_size, [mongodb]),
+ prometheus_gauge:clear(pool_size, [mongodb]),
+ CValue = prometheus_gauge:value(pool_size, [mongodb]),
[?_assertEqual(100, Value),
?_assertEqual(105, Value1),
- ?_assertEqual(0, RValue)].
+ ?_assertEqual(0, RValue),
+ ?_assertEqual(undefined, CValue)].
test_inc(_) ->
prometheus_gauge:new([{name, pool_size}, {labels, [client]}, {help, ""}]),
diff --git a/test/eunit/metric/prometheus_histogram_tests.erl b/test/eunit/metric/prometheus_histogram_tests.erl
index 61774284..9a7c837f 100644
--- a/test/eunit/metric/prometheus_histogram_tests.erl
+++ b/test/eunit/metric/prometheus_histogram_tests.erl
@@ -68,6 +68,10 @@ test_errors(_) ->
prometheus_histogram:reset(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
prometheus_histogram:reset(db_query_duration, [repo, db])),
+ ?_assertError({unknown_metric, default, unknown_metric},
+ prometheus_histogram:clear(unknown_metric)),
+ ?_assertError({invalid_metric_arity, 2, 1},
+ prometheus_histogram:clear(db_query_duration, [repo, db])),
?_assertError({unknown_metric, default, unknown_metric},
prometheus_histogram:value(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
@@ -163,9 +167,12 @@ test_observe(_) ->
Value = prometheus_histogram:value(http_request_duration_milliseconds, [get]),
prometheus_histogram:reset(http_request_duration_milliseconds, [get]),
RValue = prometheus_histogram:value(http_request_duration_milliseconds, [get]),
+ prometheus_histogram:clear(http_request_duration_milliseconds, [get]),
+ CValue = prometheus_histogram:value(http_request_duration_milliseconds, [get]),
[?_assertMatch({[3, 4, 2, 2, 3, 1], Sum}
when Sum > 6974.5 andalso Sum < 6974.55, Value),
- ?_assertEqual({[0, 0, 0, 0, 0, 0], 0}, RValue)].
+ ?_assertEqual({[0, 0, 0, 0, 0, 0], 0}, RValue),
+ ?_assertEqual(undefined, CValue)].
test_observe_duration_seconds(_) ->
prometheus_histogram:new([{name, fun_duration_seconds},
diff --git a/test/eunit/metric/prometheus_summary_tests.erl b/test/eunit/metric/prometheus_summary_tests.erl
index 11588880..683f470c 100644
--- a/test/eunit/metric/prometheus_summary_tests.erl
+++ b/test/eunit/metric/prometheus_summary_tests.erl
@@ -61,6 +61,10 @@ test_errors(_) ->
prometheus_summary:reset(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
prometheus_summary:reset(db_query_duration, [repo, db])),
+ ?_assertError({unknown_metric, default, unknown_metric},
+ prometheus_summary:clear(unknown_metric)),
+ ?_assertError({invalid_metric_arity, 2, 1},
+ prometheus_summary:clear(db_query_duration, [repo, db])),
?_assertError({unknown_metric, default, unknown_metric},
prometheus_summary:value(unknown_metric)),
?_assertError({invalid_metric_arity, 2, 1},
@@ -88,8 +92,11 @@ test_observe(_) ->
Value = prometheus_summary:value(orders_summary, [electronics]),
prometheus_summary:reset(orders_summary, [electronics]),
RValue = prometheus_summary:value(orders_summary, [electronics]),
+ prometheus_summary:clear(orders_summary, [electronics]),
+ CValue = prometheus_summary:value(orders_summary, [electronics]),
[?_assertMatch({4, Sum} when Sum > 29.1 andalso Sum < 29.3, Value),
- ?_assertEqual({0, 0}, RValue)].
+ ?_assertEqual({0, 0}, RValue),
+ ?_assertEqual(undefined, CValue)].
test_observe_duration_seconds(_) ->
prometheus_summary:new([{name, <<"fun_duration_seconds">>},