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">>},