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 77 end
78 78  
79 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 81 end
83 82  
84 83 # Mongoid Bug: find(id) on association proxies returns an Enumerator
... ...
app/models/err.rb
... ... @@ -15,6 +15,7 @@ class Err
15 15 belongs_to :problem
16 16 index :problem_id
17 17 index :error_class
  18 + index :fingerprint
18 19  
19 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 2 require 'hoptoad_notifier'
3 3  
4 4 class ErrorReport
... ... @@ -10,11 +10,7 @@ class ErrorReport
10 10 end
11 11  
12 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 14 end
19 15  
20 16 def rails_env
... ... @@ -55,5 +51,24 @@ class ErrorReport
55 51 err.notices << notice
56 52 notice
57 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 73 end
59 74  
... ...
lib/tasks/errbit/database.rake
  1 +require 'digest/sha1'
  2 +
1 3 namespace :errbit do
2 4 namespace :db do
3 5  
... ... @@ -21,5 +23,35 @@ namespace :errbit do
21 23 Problem.resolved.each {|problem| problem.destroy }
22 24 puts "=== Cleared #{count} resolved errors from the database." if count > 0
23 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 56 end
25 57 end
... ...