Sentry-elixir无法对元组进行编码

问题描述

我得到的消息是,从纯粹的意义上讲,JSON并不代表元组,但我认为就JSON编码而言,将元组视为列表是不合理的。 \是否还有其他人面对并解决了这个问题?我想不进行预处理错误数据以用列表替换元组的事。

也许我需要指定一种不同的序列化方法

编辑:这是一个实际示例:

这是一些玩具代码

the_data = {:ok,%{...}}
Sentry.capture_message(message,the_data)

它所做的只是尝试向Sentry发送一条包含元数据的消息。

如果您不熟悉Sentry,则sendry-elixir库提供了两个函数(当然还有许多其他函数),用于显式地将异常或消息发送给Sentry。这些功能是:

Sentry.capture_exception/2
Sentry.capture_message/2

此外,错误在冒泡到“顶部”时会发送到Sentry。这些不能被拦截,因此我必须在Sentry的配置中指定(并实现)一个before_send_event“处理程序”。

这是我在工作环境中的配置:

config :sentry,dsn: "https://my_neato[email protected]/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不对元组进行编码。您可以通过为Jason.Encoder实现Tuple来改变它:

defimpl Jason.Encoder,for: Tuple do
  def encode(tuple,opts) do
    Jason.Encode.list(Tuple.to_list(tuple),opts)
  end
end

请注意-这将对在应用程序中将元组转换为JSON产生全局影响。