Commit ed82bd64c44fd0714814e7e629e6598ed23f21e1
Exists in
master
and in
1 other branch
Merge branch 'fingerprint' of https://github.com/martinciu/errbit into martinciu-fingerprint
Showing
4 changed files
with
55 additions
and
8 deletions
Show diff stats
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
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 | ... | ... |