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 产生全局影响。