Skip to content

Commit 3fde830

Browse files
authored
Implement event filtering on measurements (#77) (#111)
1 parent ab86164 commit 3fde830

File tree

8 files changed

+47
-34
lines changed

8 files changed

+47
-34
lines changed

lib/telemetry_metrics.ex

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ defmodule Telemetry.Metrics do
6868
* `:tag_values` - a function that receives the metadata and returns a map with
6969
the tags as keys and their respective values. Defaults to returning the
7070
metadata itself.
71-
* `:keep` - a predicate function that evaluates the metadata to conditionally
72-
record a given event. `:keep` and `:drop` cannot be combined. Defaults to `nil`.
73-
* `:drop` - a predicate function that evaluates the metadata to conditionally
74-
skip recording a given event. `:keep` and `:drop` cannot be combined. Defaults to `nil`.
71+
* `:keep` - a predicate function that evaluates the metadata and measurement
72+
to conditionally record a given event. `:keep` and `:drop` cannot be
73+
combined. Defaults to `nil`.
74+
* `:drop` - a predicate function that evaluates the metadata and measurement
75+
to conditionally skip recording a given event. `:keep` and `:drop` cannot
76+
be combined. Defaults to `nil`.
7577
* `:description` - human-readable description of the metric. Might be used by
7678
reporters for documentation purposes. Defaults to `nil`.
7779
* `:unit` - an atom describing the unit of selected measurement, typically in
@@ -408,7 +410,9 @@ defmodule Telemetry.Metrics do
408410
@type tag :: term()
409411
@type tags :: [tag()]
410412
@type tag_values :: (:telemetry.event_metadata() -> :telemetry.event_metadata())
411-
@type keep :: (:telemetry.event_metadata() -> boolean())
413+
@type keep ::
414+
(:telemetry.event_metadata() -> boolean())
415+
| (:telemetry.event_metadata(), :telemetry.event_measurements() -> boolean())
412416
@type drop :: (:telemetry.event_metadata() -> boolean())
413417
@type description :: nil | String.t()
414418
@type unit :: atom()
@@ -614,11 +618,11 @@ defmodule Telemetry.Metrics do
614618
end
615619

616620
defp validate_recording_rule_fun!(nil), do: nil
617-
defp validate_recording_rule_fun!(fun) when is_function(fun, 1), do: fun
621+
defp validate_recording_rule_fun!(fun) when is_function(fun, 1) or is_function(fun, 2), do: fun
618622

619623
defp validate_recording_rule_fun!(term) do
620624
raise ArgumentError,
621-
"expected recording rule to be a function accepting metadata, got #{inspect(term)}"
625+
"expected recording rule to be a function accepting either metadata or metadata and measurements, got #{inspect(term)}"
622626
end
623627

624628
defp validate_recording_rule_fun_options!(keep, drop) when is_nil(keep) or is_nil(drop), do: :ok
@@ -629,8 +633,9 @@ defmodule Telemetry.Metrics do
629633
end
630634

631635
defp keep_fun(nil, nil), do: nil
632-
defp keep_fun(nil, drop), do: fn meta -> not drop.(meta) end
633636
defp keep_fun(keep, nil), do: keep
637+
defp keep_fun(nil, drop) when is_function(drop, 1), do: &(not drop.(&1))
638+
defp keep_fun(nil, drop) when is_function(drop, 2), do: &(not drop.(&1, &2))
634639

635640
@spec fill_in_default_metric_options([metric_option()]) :: [metric_option()]
636641
defp fill_in_default_metric_options(options) do

lib/telemetry_metrics/console_reporter.ex

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ defmodule Telemetry.Metrics.ConsoleReporter do
100100
Measurement value missing (metric skipped)
101101
"""
102102

103-
not keep?(metric, metadata) ->
103+
not keep?(metric, metadata, measurements) ->
104104
"""
105105
Event dropped
106106
"""
@@ -142,8 +142,13 @@ defmodule Telemetry.Metrics.ConsoleReporter do
142142
"#{inspect(measurement)} [via #{inspect(fun)}]"
143143
end
144144

145-
defp keep?(%{keep: nil}, _metadata), do: true
146-
defp keep?(metric, metadata), do: metric.keep.(metadata)
145+
defp keep?(metric, metadata, measurements) do
146+
case metric do
147+
%{keep: nil} -> true
148+
%{keep: keep} when is_function(keep, 1) -> keep.(metadata)
149+
%{keep: keep} when is_function(keep, 2) -> keep.(metadata, measurements)
150+
end
151+
end
147152

148153
defp extract_measurement(metric, measurements, metadata) do
149154
case metric.measurement do

lib/telemetry_metrics/counter.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ defmodule Telemetry.Metrics.Counter do
2222
event_name: :telemetry.event_name(),
2323
measurement: Metrics.measurement(),
2424
tags: Metrics.tags(),
25-
tag_values: (:telemetry.event_metadata() -> :telemetry.event_metadata()),
26-
keep: (:telemetry.event_metadata() -> boolean()),
25+
tag_values: Metrics.tag_values(),
26+
keep: Metrics.keep(),
2727
description: Metrics.description(),
2828
unit: Metrics.unit(),
2929
reporter_options: Metrics.reporter_options()

lib/telemetry_metrics/distribution.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ defmodule Telemetry.Metrics.Distribution do
2222
event_name: :telemetry.event_name(),
2323
measurement: Metrics.measurement(),
2424
tags: Metrics.tags(),
25-
tag_values: (:telemetry.event_metadata() -> :telemetry.event_metadata()),
26-
keep: (:telemetry.event_metadata() -> boolean()),
25+
tag_values: Metrics.tag_values(),
26+
keep: Metrics.keep(),
2727
description: Metrics.description(),
2828
unit: Metrics.unit(),
2929
reporter_options: Metrics.reporter_options()

lib/telemetry_metrics/last_value.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ defmodule Telemetry.Metrics.LastValue do
2222
event_name: :telemetry.event_name(),
2323
measurement: Metrics.measurement(),
2424
tags: Metrics.tags(),
25-
tag_values: (:telemetry.event_metadata() -> :telemetry.event_metadata()),
26-
keep: (:telemetry.event_metadata() -> boolean()),
25+
tag_values: Metrics.tag_values(),
26+
keep: Metrics.keep(),
2727
description: Metrics.description(),
2828
unit: Metrics.unit(),
2929
reporter_options: Metrics.reporter_options()

lib/telemetry_metrics/sum.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ defmodule Telemetry.Metrics.Sum do
2222
event_name: :telemetry.event_name(),
2323
measurement: Metrics.measurement(),
2424
tags: Metrics.tags(),
25-
tag_values: (:telemetry.event_metadata() -> :telemetry.event_metadata()),
26-
keep: (:telemetry.event_metadata() -> boolean()),
25+
tag_values: Metrics.tag_values(),
26+
keep: Metrics.keep(),
2727
description: Metrics.description(),
2828
unit: Metrics.unit(),
2929
reporter_options: Metrics.reporter_options()

lib/telemetry_metrics/summary.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ defmodule Telemetry.Metrics.Summary do
2222
event_name: :telemetry.event_name(),
2323
measurement: Metrics.measurement(),
2424
tags: Metrics.tags(),
25-
tag_values: (:telemetry.event_metadata() -> :telemetry.event_metadata()),
26-
keep: (:telemetry.event_metadata() -> boolean()),
25+
tag_values: Metrics.tag_values(),
26+
keep: Metrics.keep(),
2727
description: Metrics.description(),
2828
unit: Metrics.unit(),
2929
reporter_options: Metrics.reporter_options()

test/telemetry_metrics_test.exs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -146,28 +146,31 @@ defmodule Telemetry.MetricsTest do
146146
keep_metric =
147147
apply(Metrics, unquote(metric_type), [
148148
"my.repo.query",
149-
[
150-
keep: &match?(%{repo: :my_app_read_only_repo}, &1)
151-
]
149+
[keep: &match?(%{repo: :my_app_read_only_repo}, &1)]
152150
])
153151

154152
drop_metric =
155153
apply(Metrics, unquote(metric_type), [
156154
"my.repo.query",
157-
[
158-
drop: &match?(%{repo: :my_app_read_only_repo}, &1)
159-
]
155+
[drop: &match?(%{repo: :my_app_read_only_repo}, &1)]
160156
])
161157

162-
keep_filter_fun = keep_metric.keep
158+
assert keep_metric.keep.(%{repo: :my_app_read_only_repo})
159+
refute keep_metric.keep.(%{repo: :my_app_repo})
163160

164-
assert keep_filter_fun.(%{repo: :my_app_read_only_repo})
165-
refute keep_filter_fun.(%{repo: :my_app_repo})
161+
refute drop_metric.keep.(%{repo: :my_app_read_only_repo})
162+
assert drop_metric.keep.(%{repo: :my_app_repo})
163+
end
166164

167-
drop_filter_fun = drop_metric.keep
165+
test "using event filter that evaluates both metadata and measurement" do
166+
metric =
167+
apply(Metrics, unquote(metric_type), [
168+
"my.repo.query",
169+
[keep: &(match?(%{repo: :my_app_read_only_repo}, &1) and &2 > 100)]
170+
])
168171

169-
refute drop_filter_fun.(%{repo: :my_app_read_only_repo})
170-
assert drop_filter_fun.(%{repo: :my_app_repo})
172+
assert metric.keep.(%{repo: :my_app_read_only_repo}, 200)
173+
refute metric.keep.(%{repo: :my_app_read_only_repo}, 50)
171174
end
172175

173176
test "setting both keep and drop options raises" do
@@ -314,7 +317,7 @@ defmodule Telemetry.MetricsTest do
314317
end
315318
end
316319

317-
test "raises when event filter is not a function with an arity of 2" do
320+
test "raises when event filter is not a function with an arity of 1 or 2" do
318321
Enum.each([keep: fn -> true end, drop: fn -> true end], fn filter ->
319322
assert_raise ArgumentError, fn ->
320323
apply(Metrics, unquote(metric_type), [

0 commit comments

Comments
 (0)