在 Rails API 中向第三方发送错误数据的最佳位置在哪里?

Posted

技术标签:

【中文标题】在 Rails API 中向第三方发送错误数据的最佳位置在哪里?【英文标题】:Where's the best place to send error data to 3rd party in rails API? 【发布时间】:2022-01-12 05:43:28 【问题描述】:

我们刚刚在我们的 rails 项目中实现了 Sentry。它应该会自动报告错误,但是因为我们需要对要发送给 Sentry 的数据进行更多控制,所以我们必须手动调用将数据发送给 Sentry 的方法。

目前,我们在主自定义错误类中调用 sentry

class OurCustomError < StandardError

  def initialize(params)
    super
    ThirdParty::Sentry.new(params) # it contains the logic that will send our data to sentry
  end
end

但是,我向我的伙伴们争辩说,不应该从那里调用该逻辑。因为错误类应该只是描述错误的对象。对 Sentry 的调用应该放在控制器的救援(或救援从)方法中

目前我们的控制器是这样的:

#...
rescue_from OurCustomError with: :render_error

def render_error(error)
  render(
    status: error.status
    #etc
  )
end
#...

我认为我们应该从这里(控制器)调用 Sentry,而不是自定义错误类本身。像这样的:

# ...
rescue_from OurCustomError with: :handle_custom_error

def handle_custom_error(error)
  ThirdParty::Sentry.new()
  render_error()
end

def render_error(error)
  render(
    status: error.status,
    #etc

  )
end
...

从最佳实践的角度来看,从自定义错误类内部还是从控制器调用逻辑更好?

【问题讨论】:

【参考方案1】:

您不会让错误类负责向您的第三方服务报告错误,这对我来说是有道理的。正如你所说,它应该描述错误,并将报告错误的责任留给代码的其他部分。

理想情况下,您不需要手动向 Sentry 报告错误,因为 Sentry 提供了中间件来自动为您处理。您确定没有其他方法可以提供该自定义数据,这将允许您依赖所提供的错误捕获和报告吗? Sentry 可以将add extra data 与错误一起发送。

我们在 Honeybadger 中有类似的功能,我们还提供了一种方法来提供额外的数据 by the error object 或通过包含在上下文中的对象。我们还允许您搜索该上下文数据,因此我们强烈建议我们的客户使用该功能来报告有关错误的额外数据。

【讨论】:

以上是关于在 Rails API 中向第三方发送错误数据的最佳位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 邮件发送:getaddrinfo:名称或服务未知

AJAX 调用无法在 Django 中向 API 发送令牌

如何在颤动中向 API 服务器发送请求 POST 消息?

如何在 python 中向 Gmail-API 发送批处理请求?

如何在 Bootstrap Vue 中向父级发送模态数据?

Golang:无法在恢复()中向通道发送错误