Skip to content

Commit dd3537d

Browse files
committed
feat: add tags_from_metadata option to LoggerHandler
Adds a new option `tags_from_metadata` that allows specifying sentry tags based on already-set Logger metadata keys.
1 parent b695453 commit dd3537d

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

lib/sentry/logger_handler.ex

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ defmodule Sentry.LoggerHandler do
4444
If set to `:all`, all metadata will be included.
4545
"""
4646
],
47+
tags_from_metadata: [
48+
type: {:list, :atom},
49+
default: [],
50+
doc: """
51+
Use this to include logger metadata as tags in reports. Metadata under the specified keys
52+
in those keys will be added as tags to the event.
53+
"""
54+
],
4755
capture_log_messages: [
4856
type: :boolean,
4957
default: false,
@@ -220,6 +228,7 @@ defmodule Sentry.LoggerHandler do
220228
:level,
221229
:excluded_domains,
222230
:metadata,
231+
:tags_from_metadata,
223232
:capture_log_messages,
224233
:rate_limiting,
225234
:sync_threshold
@@ -321,7 +330,8 @@ defmodule Sentry.LoggerHandler do
321330
log_level,
322331
log_meta[:sentry],
323332
log_meta,
324-
config.metadata
333+
config.metadata,
334+
config.tags_from_metadata
325335
)
326336

327337
log_unfiltered(log_event, sentry_opts, config)

lib/sentry/logger_utils.ex

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,27 @@ defmodule Sentry.LoggerUtils do
1010

1111
require Logger
1212

13-
@spec build_sentry_options(Logger.level(), keyword() | nil, map(), [atom()] | :all) ::
13+
@spec build_sentry_options(
14+
Logger.level(),
15+
keyword() | nil,
16+
map(),
17+
[atom()] | :all,
18+
[atom()]
19+
) ::
1420
keyword()
15-
def build_sentry_options(level, sentry_context, meta, allowed_meta) do
21+
def build_sentry_options(level, sentry_context, meta, allowed_meta, allowed_tags \\ []) do
1622
default_extra =
1723
Map.merge(
1824
%{logger_metadata: logger_metadata(meta, allowed_meta), logger_level: level},
1925
Map.take(meta, [:domain])
2026
)
2127

28+
default_tags = logger_metadata(meta, allowed_tags)
29+
2230
(sentry_context || get_sentry_options_from_callers(meta[:callers]) || %{})
2331
|> Map.new()
2432
|> Map.update(:extra, default_extra, &Map.merge(&1, default_extra))
33+
|> Map.update(:tags, default_tags, &Map.merge(&1, default_tags))
2534
|> Map.merge(%{
2635
event_source: :logger,
2736
level: elixir_logger_level_to_sentry_level(level),

test/sentry/logger_handler_test.exs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,36 @@ defmodule Sentry.LoggerHandlerTest do
206206
end
207207
end
208208

209+
describe "with logger metadata as tags" do
210+
@tag handler_config: %{capture_log_messages: true, tags_from_metadata: [:string, :number]}
211+
test "includes configured Logger metadata as tags", %{sender_ref: ref} do
212+
Logger.metadata(string: "value", number: 42, other: "ignored")
213+
Logger.error("Testing error")
214+
215+
assert_receive {^ref, event}
216+
assert event.tags == %{string: "value", number: 42}
217+
end
218+
219+
@tag handler_config: %{capture_log_messages: true, tags_from_metadata: []}
220+
test "does not include Logger metadata as tags when disabled",
221+
%{sender_ref: ref} do
222+
Logger.metadata(string: "value", number: 42)
223+
Logger.error("Testing error")
224+
225+
assert_receive {^ref, event}
226+
assert event.tags == %{}
227+
end
228+
229+
@tag handler_config: %{capture_log_messages: true, tags_from_metadata: [:string, :number]}
230+
test "merges configured tags with explicitly set tags", %{sender_ref: ref} do
231+
Logger.metadata(string: "value", number: 42)
232+
Logger.error("Testing error", sentry: [tags: %{explicit: "tag"}])
233+
234+
assert_receive {^ref, event}
235+
assert event.tags == %{string: "value", number: 42, explicit: "tag"}
236+
end
237+
end
238+
209239
describe "with a crashing GenServer" do
210240
setup do
211241
%{test_genserver: start_supervised!(TestGenServer, restart: :temporary)}

0 commit comments

Comments
 (0)