From 75d9768bf1a97cfe87ee13b8718362e5d360fbf8 Mon Sep 17 00:00:00 2001 From: Sam Weaver Date: Tue, 11 Nov 2025 14:56:50 -0500 Subject: [PATCH] Add `imetrics:tick/3` to support tagged histograms --- src/imetrics.erl | 83 +++++++++++++++++++++++++++++++++++------ test/imetrics_tests.erl | 36 ++++++++++++++++++ 2 files changed, 107 insertions(+), 12 deletions(-) diff --git a/src/imetrics.erl b/src/imetrics.erl index 8742374..702e1e6 100644 --- a/src/imetrics.erl +++ b/src/imetrics.erl @@ -2,17 +2,70 @@ -include("../include/imetrics.hrl"). --export([add/1, add/2, add/3, set_exemplar/2, set_exemplar/3, set_exemplar/4, set_exemplar/5, set_exemplar/6, add_m/2, add_m/3, set_info/2, init_counter/1, init_counter/2]). - --export([set_gauge/2, set_gauge/3, set_gauge_m/3, set_multigauge/2, set_multigauge/3, update_gauge/2, update_gauge/3, update_gauge_m/3]). - --export([set_counter_dimension/2, register_slo/2]). - --export([hist/2, hist/3, hist/4, tick/1, tick/2, tock/1, tock/2, tock_as/2, tick_s/3, tick_s/4, tock_s/2, tock_as_s/3, stop_tick_s/2]). - --export([stats/1, set_stats/2]). - --export([get/0, get_with_types/0, get_counters/0, get_gauges/0, get_hist/0, foldl_slo/3, get_slo/2, get_exemplar/1]). +-export([ + add/1, + add/2, + add/3, + set_exemplar/2, + set_exemplar/3, + set_exemplar/4, + set_exemplar/5, + set_exemplar/6, + add_m/2, + add_m/3, + set_info/2, + init_counter/1, + init_counter/2 +]). + +-export([ + set_gauge/2, + set_gauge/3, + set_gauge_m/3, + set_multigauge/2, + set_multigauge/3, + update_gauge/2, + update_gauge/3, + update_gauge_m/3 +]). + +-export([ + set_counter_dimension/2, + register_slo/2 +]). + +-export([ + hist/2, + hist/3, + hist/4, + tick/1, + tick/2, + tick/3, + tock/1, + tock/2, + tock_as/2, + tick_s/3, + tick_s/4, + tock_s/2, + tock_as_s/3, + stop_tick_s/2 +]). + +-export([ + stats/1, + set_stats/2 +]). + +-export([ + get/0, + get_with_types/0, + get_counters/0, + get_gauges/0, + get_hist/0, + foldl_slo/3, + get_slo/2, + get_exemplar/1 +]). -compile({no_auto_import,[get/0]}). @@ -226,6 +279,9 @@ tick(Name) -> tick(Name, Unit) -> {Name, Unit, erlang:monotonic_time(Unit)}. +tick(Name, Tags, Unit) -> + {{Name, Tags}, Unit, erlang:monotonic_time(Unit)}. + tock(Tick) -> tock_as(Tick, '_'). @@ -234,7 +290,10 @@ tock(Tick, Fun) -> tock_as(Tick, NewName) -> tock_as(Tick, NewName, - fun(Name, Diff) -> + fun ({Name, Tags}, Diff) -> + imetrics_hist_openmetrics:add(Name, Tags, Diff), + Diff; + (Name, Diff) -> imetrics_hist_openmetrics:add(Name, Diff), Diff end). diff --git a/test/imetrics_tests.erl b/test/imetrics_tests.erl index 08caf36..b97d3c1 100644 --- a/test/imetrics_tests.erl +++ b/test/imetrics_tests.erl @@ -625,6 +625,8 @@ start_ticktock() -> F = start(), imetrics:hist(test, [1, 10]), imetrics:hist(test2, [1, 10]), + imetrics:hist(test3, #{tag => tag1}, [1, 10]), + imetrics:hist(test3, #{tag => tag2}, [1, 10]), F. ticktock_test(_Fixture) -> @@ -638,6 +640,40 @@ ticktock_test(_Fixture) -> Tick = imetrics:tick(test, second), timer:sleep(5), imetrics:tock_as(Tick, test2) + end)()), + ?_assertEqual(0, (fun() -> + Tick = imetrics:tick(test3, #{tag => tag1}, second), + timer:sleep(5), + imetrics:tock(Tick) + end)()), + ?_assertEqual(0, (fun() -> + Tick = imetrics:tick(test3, #{tag => tag2}, second), + timer:sleep(5), + imetrics:tock(Tick) + end)()), + ?_assertEqual({histogram, [ + {#{le => <<"1">>}, 1}, + {#{le => <<"10">>}, 1}, + {#{le => <<"+Inf">>}, 1} + ]}, (fun () -> + proplists:get_value(<<"test">>, imetrics:get_with_types()) + end)()), + ?_assertEqual({histogram, [ + {#{le => <<"1">>}, 1}, + {#{le => <<"10">>}, 1}, + {#{le => <<"+Inf">>}, 1} + ]}, (fun () -> + proplists:get_value(<<"test2">>, imetrics:get_with_types()) + end)()), + ?_assertEqual({histogram, [ + {#{le => <<"1">>, tag => <<"tag2">>}, 1}, + {#{le => <<"10">>, tag => <<"tag2">>}, 1}, + {#{le => <<"+Inf">>, tag => <<"tag2">>}, 1}, + {#{le => <<"1">>, tag => <<"tag1">>}, 1}, + {#{le => <<"10">>, tag => <<"tag1">>}, 1}, + {#{le => <<"+Inf">>, tag => <<"tag1">>}, 1} + ]}, (fun () -> + proplists:get_value(<<"test3">>, imetrics:get_with_types()) end)()) ].