Skip to content

Commit 14559ff

Browse files
authored
Allow Logger backend to use Sentry metadata (#712)
Closes #710.
1 parent 1f65c2d commit 14559ff

File tree

4 files changed

+30
-10
lines changed

4 files changed

+30
-10
lines changed

lib/sentry/context.ex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,20 @@ defmodule Sentry.Context do
143143
@typedoc since: "9.0.0"
144144
@type extra() :: %{optional(atom()) => term()}
145145

146-
@logger_metadata_key :sentry
146+
@logger_metadata_key :__sentry__
147147
@user_key :user
148148
@tags_key :tags
149149
@extra_key :extra
150150
@request_key :request
151151
@breadcrumbs_key :breadcrumbs
152152
@attachments_key :attachments
153153

154+
@doc false
155+
@spec __logger_metadata_key__() :: unquote(@logger_metadata_key)
156+
def __logger_metadata_key__ do
157+
@logger_metadata_key
158+
end
159+
154160
@doc """
155161
Retrieves all currently-set context on the current process.
156162

lib/sentry/logger_backend.ex

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ defmodule Sentry.LoggerBackend do
5555

5656
@behaviour :gen_event
5757

58+
alias Sentry.Context
5859
alias Sentry.LoggerUtils
5960

6061
## State
@@ -122,17 +123,21 @@ defmodule Sentry.LoggerBackend do
122123
## Helpers
123124

124125
defp log(level, msg, meta, state) do
126+
sentry_context_from_meta = meta[:sentry]
127+
sentry_context_from_sentry = meta[Context.__logger_metadata_key__()]
128+
129+
sentry_context =
130+
if sentry_context_from_meta || sentry_context_from_sentry do
131+
Map.merge(sentry_context_from_meta || %{}, sentry_context_from_sentry || %{})
132+
else
133+
nil
134+
end
135+
125136
# Logger backends run in their own process, that's why we read the context from meta[:sentry].
126137
# The context in the Logger backend process is not the same as the one in the process
127138
# that did the logging. This behavior is different than the one in Sentry.LoggerHandler,
128139
# since Logger handlers run in the caller process.
129-
opts =
130-
LoggerUtils.build_sentry_options(
131-
level,
132-
_sentry_context = meta[:sentry],
133-
Map.new(meta),
134-
state.metadata
135-
)
140+
opts = LoggerUtils.build_sentry_options(level, sentry_context, Map.new(meta), state.metadata)
136141

137142
case meta[:crash_reason] do
138143
# If the crash reason is an exception, we want to report the exception itself

lib/sentry/logger_handler.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,14 @@ defmodule Sentry.LoggerHandler do
150150
# If we take meta[:sentry] here, we would duplicate all the stuff. This
151151
# behavior is different than the one in Sentry.LoggerBackend because the Logger
152152
# backend runs in its own process.
153-
sentry_opts = LoggerUtils.build_sentry_options(log_level, nil, log_meta, config.metadata)
153+
sentry_opts =
154+
LoggerUtils.build_sentry_options(
155+
log_level,
156+
log_meta[:sentry],
157+
log_meta,
158+
config.metadata
159+
)
160+
154161
log_unfiltered(log_event, sentry_opts, config)
155162
end
156163
end

lib/sentry/logger_utils.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ defmodule Sentry.LoggerUtils do
4646
end
4747

4848
defp get_sentry_options_from_callers([caller | rest]) when is_pid(caller) do
49+
logger_metadata_key = Sentry.Context.__logger_metadata_key__()
50+
4951
with {:current_node, true} <- {:current_node, node(caller) == Node.self()},
5052
{:dictionary, [_ | _] = dictionary} <- :erlang.process_info(caller, :dictionary),
51-
%{sentry: sentry} <- dictionary[:"$logger_metadata$"] do
53+
%{^logger_metadata_key => sentry} <- dictionary[:"$logger_metadata$"] do
5254
sentry
5355
else
5456
_ -> get_sentry_options_from_callers(rest)

0 commit comments

Comments
 (0)