Sentry-elixir 无法编码元组
Sentry-elixir cannot encode tuples
我明白,从纯粹的意义上说,JSON 不考虑元组,但我认为根据 JSON 编码将元组视为列表是不合理的。 \有没有其他人面对并解决了这个问题?我不想参与预处理我的错误数据以用列表替换元组的业务。
也许我需要指定不同的序列化方法?
编辑:这是一个实际的例子:
这是一些玩具代码。
the_data = {:ok, %{...}}
Sentry.capture_message(message, the_data)
它所做的只是尝试向 Sentry 发送一条消息,其中包含数据中的元组。
如果您不熟悉 Sentry,sentry-elixir 库提供了两个函数(当然还有许多其他函数)用于显式向 Sentry 发送异常或消息。函数是:
Sentry.capture_exception/2
Sentry.capture_message/2
此外,错误会在冒泡到“顶部”时发送到 Sentry。这些无法被拦截,所以我必须在 Sentry 的配置中指定(并实现)一个 before_send_event
“处理程序”。
这是我工作环境下的配置:
config :sentry,
dsn: "https://my_neato_sentry_key@sentry.io/33333343",
environment_name: :staging,
enable_source_code_context: true,
root_source_code_path: File.cwd!(),
tags: %{
env: "staging"
},
before_send_event: {SomeApplication.Utils.SentryLogger, :before_send},
included_environments: [:staging],
filter: SomeApplication.SentryEventFilter
我的 before_send
函数基本上尝试对数据进行完整性检查并用列表替换所有元组。不过,我还没有完全实现这一点,我暂时使用 Kernel.inspect/2
将其转换为字符串,而不是替换所有元组。这当然不理想,因为我无法在 Sentry 视图中操作数据:
def before_send(sentry_event) do
IO.puts "------- BEFORE SEND TWO ---------------------------"
sentry_event
|> inspect(limit: :infinity)
end
这导致以下输出:
{:invalid, {:ok, the_data}}
capture_message 失败。
默认情况下,sentry
使用 jason
对其 JSON 进行编码,同样默认情况下,jason
不对元组进行编码。您可以通过为 Tuple
:
实施 Jason.Encoder
来更改它
defimpl Jason.Encoder, for: Tuple do
def encode(tuple, opts) do
Jason.Encode.list(Tuple.to_list(tuple), opts)
end
end
请注意 - 这将对元组在您的应用程序中如何转换为 JSON 产生全局影响。
我明白,从纯粹的意义上说,JSON 不考虑元组,但我认为根据 JSON 编码将元组视为列表是不合理的。 \有没有其他人面对并解决了这个问题?我不想参与预处理我的错误数据以用列表替换元组的业务。
也许我需要指定不同的序列化方法?
编辑:这是一个实际的例子:
这是一些玩具代码。
the_data = {:ok, %{...}}
Sentry.capture_message(message, the_data)
它所做的只是尝试向 Sentry 发送一条消息,其中包含数据中的元组。
如果您不熟悉 Sentry,sentry-elixir 库提供了两个函数(当然还有许多其他函数)用于显式向 Sentry 发送异常或消息。函数是:
Sentry.capture_exception/2
Sentry.capture_message/2
此外,错误会在冒泡到“顶部”时发送到 Sentry。这些无法被拦截,所以我必须在 Sentry 的配置中指定(并实现)一个 before_send_event
“处理程序”。
这是我工作环境下的配置:
config :sentry,
dsn: "https://my_neato_sentry_key@sentry.io/33333343",
environment_name: :staging,
enable_source_code_context: true,
root_source_code_path: File.cwd!(),
tags: %{
env: "staging"
},
before_send_event: {SomeApplication.Utils.SentryLogger, :before_send},
included_environments: [:staging],
filter: SomeApplication.SentryEventFilter
我的 before_send
函数基本上尝试对数据进行完整性检查并用列表替换所有元组。不过,我还没有完全实现这一点,我暂时使用 Kernel.inspect/2
将其转换为字符串,而不是替换所有元组。这当然不理想,因为我无法在 Sentry 视图中操作数据:
def before_send(sentry_event) do
IO.puts "------- BEFORE SEND TWO ---------------------------"
sentry_event
|> inspect(limit: :infinity)
end
这导致以下输出:
{:invalid, {:ok, the_data}}
capture_message 失败。
默认情况下,sentry
使用 jason
对其 JSON 进行编码,同样默认情况下,jason
不对元组进行编码。您可以通过为 Tuple
:
Jason.Encoder
来更改它
defimpl Jason.Encoder, for: Tuple do
def encode(tuple, opts) do
Jason.Encode.list(Tuple.to_list(tuple), opts)
end
end
请注意 - 这将对元组在您的应用程序中如何转换为 JSON 产生全局影响。