From cd8cde49668933eda93ce127093316f3bc924930 Mon Sep 17 00:00:00 2001 From: Marcin Ciunelis Date: Sun, 26 Aug 2012 17:10:20 +0200 Subject: [PATCH] Err#fingerprint calculated from many attributes --- app/models/app.rb | 2 +- app/models/err.rb | 1 + app/models/error_report.rb | 27 +++++++++++++++++++++------ lib/tasks/errbit/database.rake | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/app/models/app.rb b/app/models/app.rb index 3467337..4d5e780 100644 --- a/app/models/app.rb +++ b/app/models/app.rb @@ -74,7 +74,7 @@ class App end def find_or_create_err!(attrs) - Err.where(attrs).first || problems.create!.errs.create!(attrs) + Err.where(:fingerprint => attrs[:fingerprint]).first || problems.create!.errs.create!(attrs) end # Mongoid Bug: find(id) on association proxies returns an Enumerator diff --git a/app/models/err.rb b/app/models/err.rb index 9863fbc..ced6661 100644 --- a/app/models/err.rb +++ b/app/models/err.rb @@ -15,6 +15,7 @@ class Err belongs_to :problem index :problem_id index :error_class + index :fingerprint has_many :notices, :inverse_of => :err, :dependent => :destroy diff --git a/app/models/error_report.rb b/app/models/error_report.rb index 68c3aa5..41a5645 100644 --- a/app/models/error_report.rb +++ b/app/models/error_report.rb @@ -1,4 +1,4 @@ -require 'digest/md5' +require 'digest/sha1' require 'hoptoad_notifier' class ErrorReport @@ -10,11 +10,7 @@ class ErrorReport end def fingerprint - normalized_backtrace = backtrace[0...3].map do |trace| - trace.merge 'method' => trace['method'].gsub(/[0-9_]{10,}+/, "__FRAGMENT__") - end - - @fingerprint ||= Digest::MD5.hexdigest(normalized_backtrace.to_s) + @fingerprint ||= Digest::SHA1.hexdigest(fingerprint_source.to_s) end def rails_env @@ -53,5 +49,24 @@ class ErrorReport err.notices << notice notice end + + private + def fingerprint_source + { + :backtrace => normalized_backtrace.to_s, + :error_class => error_class, + :component => component, + :action => action, + :environment => rails_env, + :api_key => api_key + } + end + + def normalized_backtrace + backtrace[0...3].map do |trace| + trace.merge 'method' => trace['method'].gsub(/[0-9_]{10,}+/, "__FRAGMENT__") + end + end + end diff --git a/lib/tasks/errbit/database.rake b/lib/tasks/errbit/database.rake index 8f0b287..00bee69 100644 --- a/lib/tasks/errbit/database.rake +++ b/lib/tasks/errbit/database.rake @@ -1,3 +1,5 @@ +require 'digest/sha1' + namespace :errbit do namespace :db do @@ -21,5 +23,35 @@ namespace :errbit do Problem.resolved.each {|problem| problem.destroy } puts "=== Cleared #{count} resolved errors from the database." if count > 0 end + + desc "Regenerate fingerprints" + task :regenerate_fingerprints => :environment do + + def normalize_backtrace(backtrace) + backtrace[0...3].map do |trace| + trace.merge 'method' => trace['method'].gsub(/[0-9_]{10,}+/, "__FRAGMENT__") + end + end + + def fingerprint(source) + Digest::SHA1.hexdigest(source.to_s) + end + + puts "Regenerating Err fingerprints" + Err.create_indexes + Err.all.limit(10).each do |err| + next if err.notices.count == 0 + source = { + :backtrace => normalize_backtrace(err.notices.first.backtrace).to_s, + :error_class => err.error_class, + :component => err.component, + :action => err.action, + :environment => err.environment, + :api_key => err.app.api_key + } + err.update_attributes(:fingerprint => fingerprint(source)) + end + end + end end -- libgit2 0.21.2