From e596f65e10c76f85a9b0069a79d07015e9184a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Niemier?= <~@hauleth.dev> Date: Mon, 13 Apr 2026 15:23:35 +0200 Subject: [PATCH] Implement `execute_lazy/{2,3}` This allow to compute measurements and metadata only if there is anyone listening for given events. That provides a way to expose metrics that can be slightly more expensive to compute. Closes #150 --- src/telemetry.erl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/telemetry.erl b/src/telemetry.erl index 8b2484a..be739b1 100644 --- a/src/telemetry.erl +++ b/src/telemetry.erl @@ -5,6 +5,8 @@ persist/0, detach/1, list_handlers/1, + execute_lazy/2, + execute_lazy/3, execute/2, execute/3, span/3]). @@ -165,6 +167,22 @@ If the handler with given ID doesn't exist, `{error, not_found}` is returned. detach(HandlerId) -> telemetry_handler_table:delete(HandlerId). +execute_lazy(EventName, Func) -> execute_lazy(EventName, ignored, Func). + +execute_lazy([_ | _] = EventName, Fallback, Func) when is_function(Func, 0) -> + case telemetry_handler_table:list_for_event(EventName) of + [] -> Fallback; + Handlers -> + {Return, Data} = Func(), + case Data of + ignore -> + []; + {Measurements, Metadata} -> + do_execute(Handlers, EventName, Measurements, Metadata) + end, + Return + end. + ?DOC(""" Emits the event, invoking handlers attached to it.