Commit ed82bd64c44fd0714814e7e629e6598ed23f21e1

Authored by Nathan Broadbent
2 parents ba398235 b4421238
Exists in master and in 1 other branch production

Merge branch 'fingerprint' of https://github.com/martinciu/errbit into martinciu-fingerprint

app/models/app.rb
@@ -77,8 +77,7 @@ class App @@ -77,8 +77,7 @@ class App
77 end 77 end
78 78
79 def find_or_create_err!(attrs) 79 def find_or_create_err!(attrs)
80 - Err.any_in(:problem_id => problems.map { |a| a.id }).  
81 - where(attrs).first || problems.create!.errs.create!(attrs) 80 + Err.where(:fingerprint => attrs[:fingerprint]).first || problems.create!.errs.create!(attrs)
82 end 81 end
83 82
84 # Mongoid Bug: find(id) on association proxies returns an Enumerator 83 # Mongoid Bug: find(id) on association proxies returns an Enumerator
app/models/err.rb
@@ -15,6 +15,7 @@ class Err @@ -15,6 +15,7 @@ class Err
15 belongs_to :problem 15 belongs_to :problem
16 index :problem_id 16 index :problem_id
17 index :error_class 17 index :error_class
  18 + index :fingerprint
18 19
19 has_many :notices, :inverse_of => :err, :dependent => :destroy 20 has_many :notices, :inverse_of => :err, :dependent => :destroy
20 21
app/models/error_report.rb
1 -require 'digest/md5' 1 +require 'digest/sha1'
2 require 'hoptoad_notifier' 2 require 'hoptoad_notifier'
3 3
4 class ErrorReport 4 class ErrorReport
@@ -10,11 +10,7 @@ class ErrorReport @@ -10,11 +10,7 @@ class ErrorReport
10 end 10 end
11 11
12 def fingerprint 12 def fingerprint
13 - normalized_backtrace = backtrace[0...3].map do |trace|  
14 - trace.merge 'method' => trace['method'].gsub(/[0-9_]{10,}+/, "__FRAGMENT__")  
15 - end  
16 -  
17 - @fingerprint ||= Digest::MD5.hexdigest(normalized_backtrace.to_s) 13 + @fingerprint ||= Digest::SHA1.hexdigest(fingerprint_source.to_s)
18 end 14 end
19 15
20 def rails_env 16 def rails_env
@@ -55,5 +51,24 @@ class ErrorReport @@ -55,5 +51,24 @@ class ErrorReport
55 err.notices << notice 51 err.notices << notice
56 notice 52 notice
57 end 53 end
  54 +
  55 + private
  56 + def fingerprint_source
  57 + {
  58 + :backtrace => normalized_backtrace.to_s,
  59 + :error_class => error_class,
  60 + :component => component,
  61 + :action => action,
  62 + :environment => rails_env,
  63 + :api_key => api_key
  64 + }
  65 + end
  66 +
  67 + def normalized_backtrace
  68 + backtrace[0...3].map do |trace|
  69 + trace.merge 'method' => trace['method'].gsub(/[0-9_]{10,}+/, "__FRAGMENT__")
  70 + end
  71 + end
  72 +
58 end 73 end
59 74
lib/tasks/errbit/database.rake
  1 +require 'digest/sha1'
  2 +
1 namespace :errbit do 3 namespace :errbit do
2 namespace :db do 4 namespace :db do
3 5
@@ -21,5 +23,35 @@ namespace :errbit do @@ -21,5 +23,35 @@ namespace :errbit do
21 Problem.resolved.each {|problem| problem.destroy } 23 Problem.resolved.each {|problem| problem.destroy }
22 puts "=== Cleared #{count} resolved errors from the database." if count > 0 24 puts "=== Cleared #{count} resolved errors from the database." if count > 0
23 end 25 end
  26 +
  27 + desc "Regenerate fingerprints"
  28 + task :regenerate_fingerprints => :environment do
  29 +
  30 + def normalize_backtrace(backtrace)
  31 + backtrace[0...3].map do |trace|
  32 + trace.merge 'method' => trace['method'].gsub(/[0-9_]{10,}+/, "__FRAGMENT__")
  33 + end
  34 + end
  35 +
  36 + def fingerprint(source)
  37 + Digest::SHA1.hexdigest(source.to_s)
  38 + end
  39 +
  40 + puts "Regenerating Err fingerprints"
  41 + Err.create_indexes
  42 + Err.all.each do |err|
  43 + next if err.notices.count == 0
  44 + source = {
  45 + :backtrace => normalize_backtrace(err.notices.first.backtrace).to_s,
  46 + :error_class => err.error_class,
  47 + :component => err.component,
  48 + :action => err.action,
  49 + :environment => err.environment,
  50 + :api_key => err.app.api_key
  51 + }
  52 + err.update_attributes(:fingerprint => fingerprint(source))
  53 + end
  54 + end
  55 +
24 end 56 end
25 end 57 end