我如何告诉哨兵不要警告某些异常?
How can I tell Sentry not to alert certain exceptions?
我有一个 Rails 5 应用程序使用 raven-ruby 向 Sentry 发送异常,然后向我们的 Slack 发送警报。
Raven.configure do |config|
config.dsn = ENV['SENTRY_DSN']
config.environments = %w[ production development ]
config.excluded_exceptions += []
config.async = lambda { |event|
SentryWorker.perform_async(event.to_hash)
}
end
class SentryWorker < ApplicationWorker
sidekiq_options queue: :default
def perform(event)
Raven.send_event(event)
end
end
我们的Sidekiq作业抛出异常并重试是正常的。这些大多是间歇性的 API 错误和超时,它们会在几分钟内自行清除。 Sentry 尽职尽责地向我们的 Slack 发送这些误报。
我已经 added the retry_count
to the jobs。如何防止 Sentry 向 Slack 发送带有 retry_count < N 的异常,同时仍然提醒其他异常?不应提醒的示例将具有额外的上下文,如下所示:
sidekiq: {
context: Job raised exception,
job: {
args: [{...}],
class: SomeWorker,
created_at: 1540590745.3296254,
enqueued_at: 1540607026.4979043,
error_class: HTTP::TimeoutError,
error_message: Timed out after using the allocated 13 seconds,
failed_at: 1540590758.4266324,
jid: b4c7a68c45b7aebcf7c2f577,
queue: default,
retried_at: 1540600397.5804272,
retry: True,
retry_count: 2
},
}
根本不将它们发送到 Sentry 与将它们发送到 Sentry 但未收到警报的优缺点是什么?
如果 retry_count < N,您可以过滤掉整个事件(可以在您发布的那个 sidekiq worker 中完成)。如果不发出警报,您将丢失有关这种情况发生频率的数据,但警报本身不会太嘈杂。
class SentryWorker < ApplicationWorker
sidekiq_options queue: :default
def perform(event)
retry_count = event.dig(:extra, :sidekiq, :job, retry_count)
if retry_count.nil? || retry_count > N
Raven.send_event(event)
end
end
end
另一个想法是根据是否重试设置不同的指纹。像这样:
class MyJobProcessor < Raven::Processor
def process(data)
retry_count = event.dig(:extra, :sidekiq, :job, retry_count)
if (retry_count || 0) < N
data["fingerprint"] = ["will-retry-again", "{{default}}"]
end
end
end
见https://docs.sentry.io/learn/rollups/?platform=javascript#custom-grouping
我没有对此进行测试,但这应该将您的问题分成两部分,具体取决于 sidekiq 是否会重试它们。然后您可以忽略一组,但仍然可以在需要数据时查看它。
总结
对我来说效果很好的一个选项是配置 Sentry's should_capture
alongside Sidekiq's sidekiq_retries_exhausted
与异常的自定义属性。
详情
1a。添加自定义属性
您可以向例外添加自定义属性。您可以使用 attr_accessor
:
在任何错误 class 上定义它
class SomeError
attr_accessor :ignore
alias ignore? ignore
end
1b。挽救错误,设置自定义属性,&重新提出
def perform
# do something
rescue SomeError => e
e.ignore = true
raise e
end
- 配置
should_capture
should_capture
允许您在异常满足定义的条件时捕获它们。将异常传递给它,您可以在其上访问自定义属性。
config.should_capture { |e| !e.ignore? }
- 重试次数耗尽时翻转自定义属性
根据使用的 Sidekiq 版本,有 2 种方法可以定义您希望在作业终止时发生的行为。如果你想在全球范围内申请并拥有sidekiq v5.1+,你可以使用death handler。如果你想申请一个特定的工人或低于 v5.1,你可以使用 sidekiq_retries_exhausted
。
sidekiq_retries_exhausted { |_job, ex| ex.ignore = false }
如果您试图忽略属于某个 class 的异常,一个更简洁的方法是将它们添加到您的配置文件中
config.excluded_exceptions += ['ActionController::RoutingError', 'ActiveRecord::RecordNotFound']
在上面的示例中,Rails 用于生成 404 响应的异常将被抑制。
我有一个 Rails 5 应用程序使用 raven-ruby 向 Sentry 发送异常,然后向我们的 Slack 发送警报。
Raven.configure do |config|
config.dsn = ENV['SENTRY_DSN']
config.environments = %w[ production development ]
config.excluded_exceptions += []
config.async = lambda { |event|
SentryWorker.perform_async(event.to_hash)
}
end
class SentryWorker < ApplicationWorker
sidekiq_options queue: :default
def perform(event)
Raven.send_event(event)
end
end
我们的Sidekiq作业抛出异常并重试是正常的。这些大多是间歇性的 API 错误和超时,它们会在几分钟内自行清除。 Sentry 尽职尽责地向我们的 Slack 发送这些误报。
我已经 added the retry_count
to the jobs。如何防止 Sentry 向 Slack 发送带有 retry_count < N 的异常,同时仍然提醒其他异常?不应提醒的示例将具有额外的上下文,如下所示:
sidekiq: {
context: Job raised exception,
job: {
args: [{...}],
class: SomeWorker,
created_at: 1540590745.3296254,
enqueued_at: 1540607026.4979043,
error_class: HTTP::TimeoutError,
error_message: Timed out after using the allocated 13 seconds,
failed_at: 1540590758.4266324,
jid: b4c7a68c45b7aebcf7c2f577,
queue: default,
retried_at: 1540600397.5804272,
retry: True,
retry_count: 2
},
}
根本不将它们发送到 Sentry 与将它们发送到 Sentry 但未收到警报的优缺点是什么?
如果 retry_count < N,您可以过滤掉整个事件(可以在您发布的那个 sidekiq worker 中完成)。如果不发出警报,您将丢失有关这种情况发生频率的数据,但警报本身不会太嘈杂。
class SentryWorker < ApplicationWorker
sidekiq_options queue: :default
def perform(event)
retry_count = event.dig(:extra, :sidekiq, :job, retry_count)
if retry_count.nil? || retry_count > N
Raven.send_event(event)
end
end
end
另一个想法是根据是否重试设置不同的指纹。像这样:
class MyJobProcessor < Raven::Processor
def process(data)
retry_count = event.dig(:extra, :sidekiq, :job, retry_count)
if (retry_count || 0) < N
data["fingerprint"] = ["will-retry-again", "{{default}}"]
end
end
end
见https://docs.sentry.io/learn/rollups/?platform=javascript#custom-grouping
我没有对此进行测试,但这应该将您的问题分成两部分,具体取决于 sidekiq 是否会重试它们。然后您可以忽略一组,但仍然可以在需要数据时查看它。
总结
对我来说效果很好的一个选项是配置 Sentry's should_capture
alongside Sidekiq's sidekiq_retries_exhausted
与异常的自定义属性。
详情
1a。添加自定义属性
您可以向例外添加自定义属性。您可以使用 attr_accessor
:
class SomeError
attr_accessor :ignore
alias ignore? ignore
end
1b。挽救错误,设置自定义属性,&重新提出
def perform
# do something
rescue SomeError => e
e.ignore = true
raise e
end
- 配置
should_capture
should_capture
允许您在异常满足定义的条件时捕获它们。将异常传递给它,您可以在其上访问自定义属性。
config.should_capture { |e| !e.ignore? }
- 重试次数耗尽时翻转自定义属性
根据使用的 Sidekiq 版本,有 2 种方法可以定义您希望在作业终止时发生的行为。如果你想在全球范围内申请并拥有sidekiq v5.1+,你可以使用death handler。如果你想申请一个特定的工人或低于 v5.1,你可以使用 sidekiq_retries_exhausted
。
sidekiq_retries_exhausted { |_job, ex| ex.ignore = false }
如果您试图忽略属于某个 class 的异常,一个更简洁的方法是将它们添加到您的配置文件中
config.excluded_exceptions += ['ActionController::RoutingError', 'ActiveRecord::RecordNotFound']
在上面的示例中,Rails 用于生成 404 响应的异常将被抑制。