diff --git a/Gemfile b/Gemfile index 2b8343d9..998bcbc9 100644 --- a/Gemfile +++ b/Gemfile @@ -40,7 +40,9 @@ gem 'ruby-progressbar' gem 'rails_admin' gem 'pghero' -gem 'newrelic_rpm' +gem "sentry-ruby" +gem "sentry-rails" +gem "sentry-sidekiq" gem 'sidekiq', "< 6" # remove version constraint once we have redis 5 diff --git a/Gemfile.lock b/Gemfile.lock index 59a4e765..9e3dc9a0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -52,7 +52,7 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - active_model_otp (2.1.1) + active_model_otp (2.3.1) activemodel rotp (~> 6.2.0) activejob (5.2.6) @@ -81,8 +81,8 @@ GEM public_suffix (>= 2.0.2, < 5.0) arel (9.0.0) ast (2.4.2) - autoprefixer-rails (10.2.4.0) - execjs + autoprefixer-rails (10.4.0.0) + execjs (~> 2) bcrypt (3.1.16) better_errors (2.9.1) coderay (>= 1.0.0) @@ -91,19 +91,20 @@ GEM bindex (0.8.1) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - bootstrap (4.6.0) + bootstrap (4.6.1) autoprefixer-rails (>= 9.1.0) popper_js (>= 1.14.3, < 2) sassc-rails (>= 2.0.0) - bootstrap_form (4.5.0) + bootstrap_form (5.0.0) actionpack (>= 5.2) activemodel (>= 5.2) - brakeman (5.0.0) + brakeman (5.2.0) buftok (0.2.0) builder (3.2.4) byebug (11.1.3) - capybara (3.35.3) + capybara (3.36.0) addressable + matrix mini_mime (>= 0.1.3) nokogiri (~> 1.8) rack (>= 1.6.0) @@ -129,16 +130,16 @@ GEM coffee-script-source (1.12.2) colorize (0.8.1) concurrent-ruby (1.1.9) - connection_pool (2.2.3) + connection_pool (2.2.5) crass (1.0.6) database_cleaner (2.0.1) database_cleaner-active_record (~> 2.0.0) - database_cleaner-active_record (2.0.0) + database_cleaner-active_record (2.0.1) activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) debug_inspector (1.1.0) - devise (4.7.3) + devise (4.8.1) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) @@ -147,43 +148,57 @@ GEM devise-async (1.0.0) activejob (>= 5.0) devise (>= 4.0) - devise-i18n (1.9.3) - devise (>= 4.7.1) - diff-lcs (1.4.4) - docile (1.3.5) + devise-i18n (1.10.1) + devise (>= 4.8.0) + diff-lcs (1.5.0) + docile (1.4.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) equalizer (0.0.11) erubi (1.10.0) - excon (0.79.0) - execjs (2.7.0) - factory_bot (6.1.0) + excon (0.89.0) + execjs (2.8.1) + factory_bot (6.2.0) activesupport (>= 5.0.0) - factory_bot_rails (6.1.0) - factory_bot (~> 6.1.0) + factory_bot_rails (6.2.0) + factory_bot (~> 6.2.0) railties (>= 5.0.0) fake_email_validator (1.0.11) activemodel mail - faker (2.17.0) + faker (2.19.0) i18n (>= 1.6, < 2) - faraday (1.3.0) + faraday (1.8.0) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0.1) faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) multipart-post (>= 1.2, < 3) - ruby2_keywords + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) faraday-net_http (1.0.1) - faraday_middleware (1.0.0) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday_middleware (1.2.0) faraday (~> 1.0) - ffi (1.15.0) + ffi (1.15.4) ffi-compiler (1.0.1) ffi (>= 1.0.0) rake - fog-aws (3.10.0) + fog-aws (3.12.0) fog-core (~> 2.1) fog-json (~> 1.1) fog-xml (~> 0.1) ipaddress (~> 0.8) - fog-core (2.2.3) + fog-core (2.2.4) builder excon (~> 0.71) formatador (~> 0.2) @@ -191,25 +206,25 @@ GEM fog-json (1.2.0) fog-core multi_json (~> 1.10) - fog-local (0.6.0) + fog-local (0.7.0) fog-core (>= 1.27, < 3.0) - fog-xml (0.1.3) + fog-xml (0.1.4) fog-core nokogiri (>= 1.5.11, < 2.0.0) - font-awesome-rails (4.7.0.7) - railties (>= 3.2, < 7) + font-awesome-rails (4.7.0.8) + railties (>= 3.2, < 8.0) font-kit-rails (1.2.0) rails - formatador (0.2.5) - globalid (0.5.2) + formatador (0.3.0) + globalid (1.0.0) activesupport (>= 5.0) - guard (2.16.2) + guard (2.18.0) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) lumberjack (>= 1.0.12, < 2.0) nenv (~> 0.1) notiffany (~> 0.0) - pry (>= 0.9.12) + pry (>= 0.13.0) shellany (~> 0.0) thor (>= 0.18.1) guard-brakeman (0.8.6) @@ -217,31 +232,31 @@ GEM guard (>= 2.0.0) guard-compat (~> 1.0) guard-compat (1.2.1) - haml (5.2.1) + haml (5.2.2) temple (>= 0.8.0) tilt - haml_lint (0.37.0) + haml_lint (0.37.1) haml (>= 4.0, < 5.3) parallel (~> 1.10) rainbow rubocop (>= 0.50.0) sysexits (~> 1.1) - hashie (4.1.0) + hashie (5.0.0) http (4.4.1) addressable (~> 2.3) http-cookie (~> 1.0) http-form_data (~> 2.2) http-parser (~> 1.2.0) - http-cookie (1.0.3) + http-cookie (1.0.4) domain_name (~> 0.5) http-form_data (2.3.0) http-parser (1.2.3) ffi-compiler (>= 1.0, < 2.0) http_parser.rb (0.6.0) - httparty (0.18.1) + httparty (0.20.0) mime-types (~> 3.0) multi_xml (>= 0.5.2) - i18n (1.8.10) + i18n (1.8.11) concurrent-ruby (~> 1.0) i18n-js (3.6.0) i18n (>= 0.6.6) @@ -250,7 +265,8 @@ GEM mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) ipaddress (0.8.3) - jbuilder (2.11.2) + jbuilder (2.11.5) + actionview (>= 5.0.0) activesupport (>= 5.0.0) jquery-rails (4.4.0) rails-dom-testing (>= 1, < 3) @@ -258,64 +274,62 @@ GEM thor (>= 0.14, < 2.0) jquery-ui-rails (6.0.1) railties (>= 3.2.16) - json (2.5.1) - kaminari (1.2.1) + json (2.6.1) + kaminari (1.2.2) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.1) - kaminari-activerecord (= 1.2.1) - kaminari-core (= 1.2.1) - kaminari-actionview (1.2.1) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) actionview - kaminari-core (= 1.2.1) - kaminari-activerecord (1.2.1) + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) activerecord - kaminari-core (= 1.2.1) - kaminari-core (1.2.1) + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) launchy (2.5.0) addressable (~> 2.7) letter_opener (1.7.0) launchy (~> 2.2) - listen (3.5.1) + listen (3.7.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - loofah (2.12.0) + loofah (2.13.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) lumberjack (1.2.8) mail (2.7.1) mini_mime (>= 0.1.1) - marcel (1.0.1) + marcel (1.0.2) + matrix (0.4.2) memoizable (0.4.2) thread_safe (~> 0.3, >= 0.3.1) method_source (1.0.0) - mime-types (3.3.1) + mime-types (3.4.1) mime-types-data (~> 3.2015) - mime-types-data (3.2021.0225) + mime-types-data (3.2021.1115) mimemagic (0.4.3) nokogiri (~> 1) rake mini_magick (4.11.0) - mini_mime (1.1.1) + mini_mime (1.1.2) mini_portile2 (2.6.1) - minitest (5.14.4) + minitest (5.15.0) multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) naught (1.1.0) nenv (0.3.0) nested_form (0.3.2) - newrelic_rpm (6.15.0) nio4r (2.5.8) nokogiri (1.12.5) mini_portile2 (~> 2.6.1) racc (~> 1.4) - nokogumbo (2.0.5) - nokogiri (~> 1.8, >= 1.8.4) notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) - oauth (0.5.6) - omniauth (2.0.3) + oauth (0.5.8) + omniauth (2.0.4) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) rack-protection @@ -332,32 +346,32 @@ GEM omniauth-oauth (~> 1.1) rack orm_adapter (0.5.0) - parallel (1.20.1) - parser (3.0.0.0) + parallel (1.21.0) + parser (3.0.3.2) ast (~> 2.4.1) pg (1.2.3) - pghero (2.8.1) + pghero (2.8.2) activerecord (>= 5) poltergeist (1.18.1) capybara (>= 2.1, < 4) cliver (~> 0.3.1) websocket-driver (>= 0.2.0) popper_js (1.16.0) - pry (0.14.0) + pry (0.14.1) coderay (~> 1.1) method_source (~> 1.0) public_suffix (4.0.6) - puma (5.5.1) + puma (5.5.2) nio4r (~> 2.0) questiongenerator (1.0.0) - racc (1.5.2) + racc (1.6.0) rack (2.2.3) rack-pjax (1.1.0) nokogiri (~> 1.5) rack (>= 1.1) rack-protection (2.1.0) rack - rack-proxy (0.6.5) + rack-proxy (0.7.0) rack rack-test (1.1.0) rack (>= 1.0, < 3) @@ -386,7 +400,7 @@ GEM rails-i18n (5.1.3) i18n (>= 0.7, < 2) railties (>= 5.0, < 6) - rails_admin (2.1.1) + rails_admin (2.2.1) activemodel-serializers-xml (>= 1.0) builder (~> 3.1) haml (>= 4.0, < 6) @@ -406,12 +420,12 @@ GEM thor (>= 0.19.0, < 2.0) rainbow (3.0.0) rake (13.0.6) - rb-fsevent (0.10.4) + rb-fsevent (0.11.0) rb-inotify (0.10.1) ffi (~> 1.0) redcarpet (3.5.1) redis (4.1.4) - regexp_parser (2.1.1) + regexp_parser (2.2.0) remotipart (1.4.4) responders (3.0.1) actionpack (>= 5.0) @@ -419,10 +433,10 @@ GEM rexml (3.2.5) rolify (5.3.0) rotp (6.2.0) - rqrcode (1.2.0) + rqrcode (2.1.0) chunky_png (~> 1.0) - rqrcode_core (~> 0.2) - rqrcode_core (0.2.0) + rqrcode_core (~> 1.0) + rqrcode_core (1.2.0) rspec-core (3.9.3) rspec-support (~> 3.9.3) rspec-expectations (3.9.4) @@ -446,25 +460,24 @@ GEM rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) rspec-support (3.9.4) - rubocop (1.12.0) + rubocop (1.24.0) parallel (~> 1.10) parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 1.2.0, < 2.0) + rubocop-ast (>= 1.15.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.4.1) - parser (>= 2.7.1.5) + rubocop-ast (1.15.1) + parser (>= 3.0.1.1) ruby-progressbar (1.11.0) - ruby-vips (2.1.0) + ruby-vips (2.1.4) ffi (~> 1.12) - ruby2_keywords (0.0.4) - sanitize (5.2.3) + ruby2_keywords (0.0.5) + sanitize (6.0.0) crass (~> 1.0.2) - nokogiri (>= 1.8.0) - nokogumbo (~> 2.0) + nokogiri (>= 1.12.0) sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) @@ -485,6 +498,19 @@ GEM sprockets-rails tilt semantic_range (3.0.0) + sentry-rails (4.8.1) + railties (>= 5.0) + sentry-ruby-core (~> 4.8.1) + sentry-ruby (4.8.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + faraday (>= 1.0) + sentry-ruby-core (= 4.8.1) + sentry-ruby-core (4.8.1) + concurrent-ruby + faraday + sentry-sidekiq (4.8.1) + sentry-ruby-core (~> 4.8.1) + sidekiq (>= 3.0) shellany (0.0.1) sidekiq (5.2.9) connection_pool (~> 2.2, >= 2.2.2) @@ -496,20 +522,21 @@ GEM docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) - simplecov-cobertura (1.4.2) - simplecov (~> 0.8) + simplecov-cobertura (2.1.0) + rexml + simplecov (~> 0.19) simplecov-html (0.12.3) simplecov-json (0.2.3) json simplecov - simplecov_json_formatter (0.1.2) + simplecov_json_formatter (0.1.3) spring (2.1.1) sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) sysexits (1.2.0) temple (0.8.2) @@ -539,8 +566,8 @@ GEM execjs (>= 0.3.0, < 3) unf (0.1.4) unf_ext - unf_ext (0.0.7.7) - unicode-display_width (2.0.0) + unf_ext (0.0.8) + unicode-display_width (2.1.0) warden (1.2.9) rack (>= 2.0.9) web-console (3.7.0) @@ -548,7 +575,7 @@ GEM activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) - webpacker (5.2.1) + webpacker (5.4.3) activesupport (>= 5.2) rack-proxy (>= 0.6.1) railties (>= 5.2) @@ -596,7 +623,6 @@ DEPENDENCIES jbuilder (~> 2.10) letter_opener mini_magick - newrelic_rpm omniauth omniauth-rails_csrf_protection (~> 1.0) omniauth-tumblr @@ -622,6 +648,9 @@ DEPENDENCIES ruby-progressbar sanitize sass-rails (~> 5.0) + sentry-rails + sentry-ruby + sentry-sidekiq sidekiq (< 6) simplecov simplecov-cobertura diff --git a/app/controllers/ajax/answer_controller.rb b/app/controllers/ajax/answer_controller.rb index 7c5b48ea..14a6ca2a 100644 --- a/app/controllers/ajax/answer_controller.rb +++ b/app/controllers/ajax/answer_controller.rb @@ -41,7 +41,7 @@ class Ajax::AnswerController < AjaxController current_user.answer question, params[:answer] end rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :err @response[:message] = I18n.t('messages.error') return diff --git a/app/controllers/ajax/comment_controller.rb b/app/controllers/ajax/comment_controller.rb index 9ba83fcc..7fce47e8 100644 --- a/app/controllers/ajax/comment_controller.rb +++ b/app/controllers/ajax/comment_controller.rb @@ -8,7 +8,7 @@ class Ajax::CommentController < AjaxController begin current_user.comment(answer, params[:comment]) rescue ActiveRecord::RecordInvalid => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :rec_inv @response[:message] = I18n.t('messages.comment.create.rec_inv') return diff --git a/app/controllers/ajax/friend_controller.rb b/app/controllers/ajax/friend_controller.rb index 829ec769..4dc849ea 100644 --- a/app/controllers/ajax/friend_controller.rb +++ b/app/controllers/ajax/friend_controller.rb @@ -7,7 +7,7 @@ class Ajax::FriendController < AjaxController begin current_user.follow target_user rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.friend.create.fail') return @@ -26,7 +26,7 @@ class Ajax::FriendController < AjaxController begin current_user.unfollow target_user rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.friend.destroy.fail') return diff --git a/app/controllers/ajax/inbox_controller.rb b/app/controllers/ajax/inbox_controller.rb index f0aa994d..fa107671 100644 --- a/app/controllers/ajax/inbox_controller.rb +++ b/app/controllers/ajax/inbox_controller.rb @@ -34,7 +34,7 @@ class Ajax::InboxController < AjaxController begin inbox.remove rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :err @response[:message] = I18n.t('messages.error') return @@ -51,7 +51,7 @@ class Ajax::InboxController < AjaxController begin Inbox.where(user: current_user).each { |i| i.remove } rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :err @response[:message] = I18n.t('messages.error') return @@ -69,7 +69,7 @@ class Ajax::InboxController < AjaxController .where(questions: { user_id: @target_user.id, author_is_anonymous: false }) @inbox.each { |i| i.remove } rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :err @response[:message] = I18n.t('messages.error') return diff --git a/app/controllers/ajax/list_controller.rb b/app/controllers/ajax/list_controller.rb index 1fec4cd7..e934f497 100644 --- a/app/controllers/ajax/list_controller.rb +++ b/app/controllers/ajax/list_controller.rb @@ -11,7 +11,7 @@ class Ajax::ListController < AjaxController begin params.require :name rescue ActionController::ParameterMissing => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :toolong @response[:message] = I18n.t('messages.list.create.noname') return @@ -22,17 +22,17 @@ class Ajax::ListController < AjaxController target_user = User.find_by_screen_name!(params[:user]) list = List.create! user: current_user, display_name: params[:name] rescue ActiveRecord::RecordInvalid => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :toolong @response[:message] = I18n.t('messages.list.create.toolong') return rescue ActiveRecord::RecordNotFound => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :notfound @response[:message] = I18n.t('messages.list.create.notfound') return rescue ActiveRecord::RecordNotUnique => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :exists @response[:message] = I18n.t('messages.list.create.exists') return @@ -58,7 +58,7 @@ class Ajax::ListController < AjaxController begin List.where(user: current_user, name: params[:list]).first.destroy! rescue ActiveRecord::RecordNotFound => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :notfound @response[:message] = I18n.t('messages.list.destroy.notfound') return @@ -87,7 +87,7 @@ class Ajax::ListController < AjaxController begin list = current_user.lists.find_by_name!(params[:list]) rescue ActiveRecord::RecordNotFound => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :notfound @response[:message] = I18n.t('messages.list.membership.notfound') return diff --git a/app/controllers/ajax/moderation_controller.rb b/app/controllers/ajax/moderation_controller.rb index b2f25ad8..8bd822e6 100644 --- a/app/controllers/ajax/moderation_controller.rb +++ b/app/controllers/ajax/moderation_controller.rb @@ -8,7 +8,7 @@ class Ajax::ModerationController < AjaxController begin current_user.report_vote(report, params[:upvote]) rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.moderation.vote.fail') return @@ -28,7 +28,7 @@ class Ajax::ModerationController < AjaxController begin current_user.report_unvote report rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.moderation.destroy_vote.fail') return @@ -49,7 +49,7 @@ class Ajax::ModerationController < AjaxController report.deleted = true report.save rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.moderation.destroy_report.fail') return @@ -70,7 +70,7 @@ class Ajax::ModerationController < AjaxController begin current_user.report_comment(report, params[:comment]) rescue ActiveRecord::RecordInvalid => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :rec_inv @response[:message] = I18n.t('messages.moderation.create_comment.rec_inv') return diff --git a/app/controllers/ajax/question_controller.rb b/app/controllers/ajax/question_controller.rb index f3239ac0..c3c34737 100644 --- a/app/controllers/ajax/question_controller.rb +++ b/app/controllers/ajax/question_controller.rb @@ -35,7 +35,7 @@ class Ajax::QuestionController < AjaxController user: current_user, direct: params[:rcpt] != 'followers') rescue ActiveRecord::RecordInvalid => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :rec_inv @response[:message] = I18n.t('messages.question.create.rec_inv') return diff --git a/app/controllers/ajax/smile_controller.rb b/app/controllers/ajax/smile_controller.rb index 0e7ae9e2..3c1721ee 100644 --- a/app/controllers/ajax/smile_controller.rb +++ b/app/controllers/ajax/smile_controller.rb @@ -7,7 +7,7 @@ class Ajax::SmileController < AjaxController begin current_user.smile answer rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.smile.create.fail') return @@ -26,7 +26,7 @@ class Ajax::SmileController < AjaxController begin current_user.unsmile answer rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.smile.destroy.fail') return @@ -45,7 +45,7 @@ class Ajax::SmileController < AjaxController begin current_user.smile_comment comment rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.smile.create_comment.fail') return @@ -64,7 +64,7 @@ class Ajax::SmileController < AjaxController begin current_user.unsmile_comment comment rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response[:status] = :fail @response[:message] = I18n.t('messages.smile.destroy_comment.fail') return diff --git a/app/controllers/ajax_controller.rb b/app/controllers/ajax_controller.rb index 03947c1b..11757c9d 100644 --- a/app/controllers/ajax_controller.rb +++ b/app/controllers/ajax_controller.rb @@ -7,7 +7,7 @@ class AjaxController < ApplicationController respond_to :json rescue_from(StandardError) do |e| - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response = { success: false, @@ -19,7 +19,7 @@ class AjaxController < ApplicationController end rescue_from(ActiveRecord::RecordNotFound) do |e| - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response = { success: false, @@ -31,7 +31,7 @@ class AjaxController < ApplicationController end rescue_from(ActionController::ParameterMissing) do |e| - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @response = { success: false, diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e5c9919b..94d2ef02 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,6 +3,7 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + before_action :sentry_user_context before_action :configure_permitted_parameters, if: :devise_controller? before_action :check_locale before_action :banned? @@ -64,4 +65,12 @@ class ApplicationController < ActionController::Base devise_parameter_sanitizer.permit(:sign_in) { |u| u.permit(:login, :screen_name, :email, :password, :remember_me) } devise_parameter_sanitizer.permit(:account_update) { |u| u.permit(:screen_name, :email, :password, :password_confirmation, :current_password) } end + + def sentry_user_context + if current_user.present? + Sentry.set_user({ id: current_user.id }) + else + Sentry.set_user({ ip_address: request.ip }) + end + end end diff --git a/app/controllers/inbox_controller.rb b/app/controllers/inbox_controller.rb index 9bb867c9..2b537630 100644 --- a/app/controllers/inbox_controller.rb +++ b/app/controllers/inbox_controller.rb @@ -32,7 +32,7 @@ class InboxController < ApplicationController .zero? end rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) flash.now[:error] = "No user with the name @#{params[:author]} found, showing default entries instead!" @not_found = true end diff --git a/app/workers/deletion_worker.rb b/app/workers/deletion_worker.rb index 9a1dfd7d..142c0a1c 100644 --- a/app/workers/deletion_worker.rb +++ b/app/workers/deletion_worker.rb @@ -9,7 +9,7 @@ class DeletionWorker User.find(resource_id).destroy! rescue => e logger.info "failed to delete user: #{e.message}" - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) end end end diff --git a/app/workers/question_worker.rb b/app/workers/question_worker.rb index c1253a5b..b49ced7c 100644 --- a/app/workers/question_worker.rb +++ b/app/workers/question_worker.rb @@ -15,6 +15,6 @@ class QuestionWorker end rescue StandardError => e logger.info "failed to ask question: #{e.message}" - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) end end diff --git a/app/workers/share_worker.rb b/app/workers/share_worker.rb index af83aa86..3c9ebcd5 100644 --- a/app/workers/share_worker.rb +++ b/app/workers/share_worker.rb @@ -25,7 +25,7 @@ class ShareWorker return rescue => e logger.info "failed to post answer #{answer_id} to #{service} for user #{user_id}: #{e.message}" - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) raise end end diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb new file mode 100644 index 00000000..8a7712ca --- /dev/null +++ b/config/initializers/sentry.rb @@ -0,0 +1,11 @@ +return unless APP_CONFIG[:sentry_dsn] + +Sentry.init do |config| + config.dsn = APP_CONFIG[:sentry_dsn] + config.breadcrumbs_logger = [:active_support_logger, :http_logger] + + # Set tracesSampleRate to 1.0 to capture 100% + # of transactions for performance monitoring. + # We recommend adjusting this value in production + config.traces_sample_rate = 1.0 +end diff --git a/config/justask.yml.example b/config/justask.yml.example index 1857c52c..2d2d2f64 100644 --- a/config/justask.yml.example +++ b/config/justask.yml.example @@ -72,3 +72,6 @@ accepted_image_formats: - .png - image/gif - .gif + +# Sentry connection string +sentry_dsn: '' diff --git a/config/newrelic.yml b/config/newrelic.yml deleted file mode 100644 index 287c1364..00000000 --- a/config/newrelic.yml +++ /dev/null @@ -1,48 +0,0 @@ -# -# This file configures the New Relic Agent. New Relic monitors Ruby, Java, -# .NET, PHP, Python and Node applications with deep visibility and low -# overhead. For more information, visit www.newrelic.com. -# -# Generated June 17, 2017 -# -# This configuration file is custom generated for Retrospring -# -# For full documentation of agent configuration options, please refer to -# https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration - -common: &default_settings - # Required license key associated with your New Relic account. - license_key: CHANGEME - - # Your application name. Renaming here affects where data displays in New - # Relic. For more details, see https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/renaming-applications - app_name: Retrospring - - # To disable the agent regardless of other settings, uncomment the following: - # agent_enabled: false - - # Logging level for log/newrelic_agent.log - log_level: info - - # disabling browser monitoring for data privacy concerns - browser_monitoring: - auto_instrument: false - -# Environment-specific settings are in this section. -# RAILS_ENV or RACK_ENV (as appropriate) is used to determine the environment. -# If your application has other named environments, configure them here. -development: - <<: *default_settings - app_name: Retrospring (Development) - -test: - <<: *default_settings - # It doesn't make sense to report to New Relic from automated test runs. - monitor_mode: false - -staging: - <<: *default_settings - app_name: Retrospring (Staging) - -production: - <<: *default_settings diff --git a/lib/exporter.rb b/lib/exporter.rb index 4a3c0c18..bb75a9a5 100644 --- a/lib/exporter.rb +++ b/lib/exporter.rb @@ -26,7 +26,7 @@ class Exporter finalize publish rescue => e - NewRelic::Agent.notice_error(e) + Sentry.capture_exception(e) @user.export_processing = false @user.save validate: false end