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,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 |