あんまりいないと思うけど、RailsとかSinatoraとかを使っていない純粋なruby環境でSentryを使ったときに沼った。
そのときの備忘録を残す。
環境
Gemは単純にsentry-rubyを指定するだけ
バージョンは、最新の4.6.5だったけど、多分関係ない
Gemfile
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "2.7.4"
...
gem "sentry-ruby"
...
コードは公式のサンプル通り
sample.rb
require "sentry-ruby"
Sentry.init do |config|
config.dsn = '__MY_DSN__'
end
begin
1 / 0
rescue ZeroDivisionError => exception
puts exception
Sentry.capture_exception(exception)
end
エラー内容
エラー内容がSentryに通知されない
原因
デフォルトの挙動だと、バックグラウンドのスレッドでSentryがエラーを送信しているが、プロセスが終了すると、それに引きづられて、スレッドも終了する
そのため、エラーが送信される前にプロセスが終了するとエラーが送信されない。
…ような気がする
https://docs.sentry.io/platforms/ruby/configuration/options/#optional-settings
解決策
公式が言っているようにActiveJobsみたいなバックグラウンドジョブを利用するか、
下記のように、スレッド数を0に指定して、同期的に動作するようにする
Sentry.init do |config|
config.dsn = '__MY_DSN__'
config.background_worker_threads = 0
end
…というかドキュメント見ればちゃんと書いてあった。
よく読まんとな