From c0a96a45407aa7c4dabf8d09c883df7ad25188c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Niemier?= <~@hauleth.dev> Date: Fri, 20 Feb 2026 10:33:53 +0100 Subject: [PATCH] Allow atom `:all` as `:tags` option This is meant for collectors to just use metadata as a whole. The reasoning for that is that in many cases user may know, that all provided metadata will be relevant (especially true for metrics of the current application). Currently the way to extract relevant metrics is to use `Map.take/2`, but that can introduce unwanted slowdown due to requirement of constructing new map even if all keys are selected. In my benchmarking of my project `Map.take/2` (internal `Map.take/3` function to be exact) was responsible for 7.83% of the whole runtime (very tight loop), and I simply take whole metadata into account, so that additional processing is not needed. --- lib/telemetry_metrics.ex | 4 +++- test/telemetry_metrics_test.exs | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/telemetry_metrics.ex b/lib/telemetry_metrics.ex index 9b63252..023d356 100644 --- a/lib/telemetry_metrics.ex +++ b/lib/telemetry_metrics.ex @@ -408,7 +408,7 @@ defmodule Telemetry.Metrics do | (:telemetry.event_measurements() -> number()) | (:telemetry.event_measurements(), :telemetry.event_metadata() -> number()) @type tag :: term() - @type tags :: [tag()] + @type tags :: [tag()] | :all @type tag_values :: (:telemetry.event_metadata() -> :telemetry.event_metadata()) @type predicate_fun :: (:telemetry.event_metadata() -> boolean()) @@ -672,6 +672,8 @@ defmodule Telemetry.Metrics do end @spec validate_tags!(term()) :: :ok | no_return() + defp validate_tags!(:all), do: :ok + defp validate_tags!(list) when is_list(list) do :ok end diff --git a/test/telemetry_metrics_test.exs b/test/telemetry_metrics_test.exs index 7fa993f..4843206 100644 --- a/test/telemetry_metrics_test.exs +++ b/test/telemetry_metrics_test.exs @@ -129,6 +129,16 @@ defmodule Telemetry.MetricsTest do assert event_metadata == tag_values_fun.(event_metadata) end + test "tags can use atom `:all` to mark that all metadata should be used" do + metric = + apply(Metrics, unquote(metric_type), [ + "my.event.value", + [tags: :all] + ]) + + assert :all == metric.tags + end + test "setting function as tag_values returns that function in metric spec" do metric = apply(Metrics, unquote(metric_type), [