diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6db899902..854993f6e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -77,30 +77,28 @@ class ApplicationController < ActionController::Base case exception when ActiveRecord::QueryCanceled - if Rails.env.production? - NewRelic::Agent.notice_error(exception, :uri => request.original_url, :referer => request.referer, :request_params => params, :custom_params => {:user_id => CurrentUser.user.id, :user_ip_addr => CurrentUser.ip_addr}) - end - - render_error_page(500, "The database timed out running your query.") + render_error_page(500, exception, message: "The database timed out running your query.") when ActiveRecord::RecordNotFound - render_error_page(404, "That record was not found") + render_error_page(404, exception, message: "That record was not found", expected: true) when ActionController::UnknownFormat @error_message = "#{request.format.to_s} is not a supported format for this page." render "static/error.html", status: 406 when Danbooru::Paginator::PaginationError - render_error_page(410, @exception.message) + render_error_page(410, exception, expected: true) when NotImplementedError - render_error_page(501, "This feature isn't available: #{@exception.message}") + render_error_page(501, exception, message: "This feature isn't available: #{exception.message}") when PG::ConnectionBad - render_error_page(503, "The database is unavailable. Try again later.") + render_error_page(503, exception, message: "The database is unavailable. Try again later.") else - render_error_page(500, @exception.message) + render_error_page(500, exception) end end - def render_error_page(status, message) + def render_error_page(status, exception, message: exception.message, expected: false) @error_message = message + DanbooruLogger.log(exception, expected: expected) + if request.format.symbol.in?(%i[html json xml js atom]) render template: "static/error", status: status else diff --git a/app/logical/danbooru_logger.rb b/app/logical/danbooru_logger.rb new file mode 100644 index 000000000..36024449c --- /dev/null +++ b/app/logical/danbooru_logger.rb @@ -0,0 +1,12 @@ +class DanbooruLogger + def self.log(exception, expected: false, **params) + if !expected + backtrace = Rails.backtrace_cleaner.clean(exception.backtrace).join("\n") + Rails.logger.error("#{exception.class}: #{exception.message}\n#{backtrace}") + end + + if defined?(::NewRelic) + ::NewRelic::Agent.notice_error(exception, expected: expected, custom_params: params) + end + end +end diff --git a/app/logical/maintenance.rb b/app/logical/maintenance.rb index 32fa5a297..247b4c117 100644 --- a/app/logical/maintenance.rb +++ b/app/logical/maintenance.rb @@ -41,13 +41,7 @@ module Maintenance end def rescue_exception(exception) - backtrace = Rails.backtrace_cleaner.clean(exception.backtrace).join("\n") - Rails.logger.error("#{exception.class}: #{exception.message}\n#{backtrace}") - - if defined?(NewRelic::Agent) - NewRelic::Agent.notice_error(exception, custom_params: { backtrace: backtrace }) - end - + DanbooruLogger.log(exception) raise exception end end diff --git a/app/logical/moderator/tag_batch_change.rb b/app/logical/moderator/tag_batch_change.rb index fb982eddb..807e62349 100644 --- a/app/logical/moderator/tag_batch_change.rb +++ b/app/logical/moderator/tag_batch_change.rb @@ -72,7 +72,7 @@ module Moderator user.update(blacklisted_tags: repl.join("\n")) end rescue Exception => e - NewRelic::Agent.notice_error(e) + DanbooruLogger.log(e) end end end diff --git a/app/logical/popular_search_service.rb b/app/logical/popular_search_service.rb index 6136974e2..71269f3ec 100644 --- a/app/logical/popular_search_service.rb +++ b/app/logical/popular_search_service.rb @@ -56,10 +56,7 @@ class PopularSearchService data rescue => e - Rails.logger.error(e.to_s) - if defined?(NewRelic) - NewRelic::Agent.notice_error(e) - end + DanbooruLogger.log(e) return [] end end diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 74a79fb0c..fc2eb27dd 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -230,9 +230,7 @@ class ApplicationRecord < ActiveRecord::Base connection.execute("SET STATEMENT_TIMEOUT = #{n}") unless Rails.env == "test" yield rescue ::ActiveRecord::StatementInvalid => x - if Rails.env.production? - NewRelic::Agent.notice_error(x, :custom_params => new_relic_params.merge(:user_id => CurrentUser.id, :user_ip_addr => CurrentUser.ip_addr)) - end + DanbooruLogger.log(x, expected: true) return default_value ensure connection.execute("SET STATEMENT_TIMEOUT = #{CurrentUser.user.try(:statement_timeout) || 3_000}") unless Rails.env == "test" diff --git a/app/models/tag.rb b/app/models/tag.rb index a3c351fce..b9e91fa55 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -98,11 +98,6 @@ class Tag < ApplicationRecord end def increment_post_counts(tag_names) - if Rails.env.production? && tag_names.include?("breasts") - trace = Kernel.caller.grep(/danbooru/).reject {|x| x =~ /bundle/}.map {|x| x.sub(/\/var\/www\/danbooru2\/releases\/\d+\//, "")}.join("\n").slice(0, 4095) - ::NewRelic::Agent.record_custom_event("increment_post_counts", user_id: CurrentUser.id, pid: Process.pid, stacktrace: trace, hash: Cache.hash(tag_names)) - end - Tag.where(:name => tag_names).update_all("post_count = post_count + 1") end diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index ae15295a3..688f083df 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -99,9 +99,7 @@ class TagAlias < TagRelationship update(status: "error: #{e}") end - if Rails.env.production? - NewRelic::Agent.notice_error(e, :custom_params => {:tag_alias_id => id, :antecedent_name => antecedent_name, :consequent_name => consequent_name}) - end + DanbooruLogger.log(e, tag_alias_id: id, antecedent_name: antecedent_name, consequent_name: consequent_name) end end diff --git a/app/models/tag_implication.rb b/app/models/tag_implication.rb index 1a79eeeb2..f50f07c08 100644 --- a/app/models/tag_implication.rb +++ b/app/models/tag_implication.rb @@ -145,9 +145,7 @@ class TagImplication < TagRelationship forum_updater.update(failure_message(e), "FAILED") if update_topic update(status: "error: #{e}") - if Rails.env.production? - NewRelic::Agent.notice_error(e, :custom_params => {:tag_implication_id => id, :antecedent_name => antecedent_name, :consequent_name => consequent_name}) - end + DanbooruLogger.log(e, tag_implication_id: id, antecedent_name: antecedent_name, consequent_name: consequent_name) end end