sentry-raven 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sentry-raven might be problematic. Click here for more details.
- checksums.yaml +15 -0
- data/README.md +2 -22
- data/lib/raven/base.rb +1 -0
- data/lib/raven/client.rb +1 -1
- data/lib/raven/event.rb +31 -26
- data/lib/raven/integrations/delayed_job.rb +51 -0
- data/lib/raven/interfaces/exception.rb +10 -1
- data/lib/raven/interfaces/http.rb +1 -1
- data/lib/raven/interfaces/stack_trace.rb +1 -1
- data/lib/raven/rack.rb +8 -2
- data/lib/raven/sidekiq.rb +5 -1
- data/lib/raven/version.rb +1 -1
- metadata +56 -35
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MjJjMTY3MzJiNDY3OWVlZmQyZTFlMmI4NTM1ZTUyZmVkMjZmN2U3Yw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NDRlMmE4ZGZiZTViNjZkMjQ0MGQxMDVjZmMyNzZkZmFkMzE1OWUxYg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OTdlZjZjMTZlMGQ4YTEzYWY4OGYwMjkzNzExZDhmNzUzNjg5NDJhZDhjMzc3
|
10
|
+
MTE4MWRkMTY3NGQ1YTE5Y2UzOTA5ZDdhNjY5NmY2ZWNjYzhjYTAxNmZhYjdl
|
11
|
+
MThmN2NkZWEzNzg1MmQ0YWQyNWQ4NDMzOTI1NjZjNTQ2OWQ0MzI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
M2M5ZTRjNGFkYmZkMDM3MTRjYzgxNGI0OGRjZjIyY2U5NTgyNmE0ZTJjNjEx
|
14
|
+
ZjRjMDQyYTUwZTIxZDE2NTg4MWMzYmY5OTkyZmM3Yjk4M2VjMmQ0MmYzMzYy
|
15
|
+
ZGQzYWI3ODhmMjY4NDNhYzk5ZmRjMzkxYTI0OTIxNDcwZjgwZTQ=
|
data/README.md
CHANGED
@@ -26,7 +26,7 @@ For alternative configuration methods, and other options see [Configuration](#co
|
|
26
26
|
|
27
27
|
### Rails 3
|
28
28
|
|
29
|
-
In Rails 3, Sentry will "just work
|
29
|
+
In Rails 3, Sentry will "just work" capturing any exceptions thrown in your app. All Rails integrations also
|
30
30
|
have mixed-in methods for capturing exceptions you've rescued yourself inside of controllers:
|
31
31
|
|
32
32
|
```ruby
|
@@ -39,27 +39,7 @@ have mixed-in methods for capturing exceptions you've rescued yourself inside of
|
|
39
39
|
|
40
40
|
#### Delayed::Job
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
```
|
45
|
-
gem 'delayed-plugins-raven'
|
46
|
-
```
|
47
|
-
|
48
|
-
And then extend your Raven configuration (eg. in ```config/initializers/raven.rb``` file):
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
require 'raven'
|
52
|
-
require 'delayed-plugins-raven'
|
53
|
-
|
54
|
-
Raven.configure do |config|
|
55
|
-
config.dsn = 'https://public:secret@app.getsentry.com/9999'
|
56
|
-
...
|
57
|
-
end
|
58
|
-
|
59
|
-
Delayed::Worker.plugins << Delayed::Plugins::Raven::Plugin
|
60
|
-
```
|
61
|
-
|
62
|
-
For more configuration options check delayed-plugins-raven [documentation](https://github.com/qiushihe/delayed-plugins-raven).
|
42
|
+
Reporting errors raised in delayed jobs should work out-of the box. Usage of [delayed-plugins-raven](https://github.com/qiushihe/delayed-plugins-raven) gem is deprecated.
|
63
43
|
|
64
44
|
### Rails 2
|
65
45
|
|
data/lib/raven/base.rb
CHANGED
data/lib/raven/client.rb
CHANGED
data/lib/raven/event.rb
CHANGED
@@ -23,7 +23,7 @@ module Raven
|
|
23
23
|
PLATFORM = "ruby"
|
24
24
|
|
25
25
|
attr_reader :id
|
26
|
-
attr_accessor :project, :message, :timestamp, :level
|
26
|
+
attr_accessor :project, :message, :timestamp, :time_spent, :level
|
27
27
|
attr_accessor :logger, :culprit, :server_name, :modules, :extra, :tags
|
28
28
|
|
29
29
|
def initialize(options = {}, &block)
|
@@ -35,6 +35,7 @@ module Raven
|
|
35
35
|
@id = options[:id] || UUIDTools::UUID.random_create.hexdigest
|
36
36
|
@message = options[:message]
|
37
37
|
@timestamp = options[:timestamp] || Time.now.utc
|
38
|
+
@time_spent = options[:time_spent]
|
38
39
|
|
39
40
|
@level = options[:level] || :error
|
40
41
|
@logger = options[:logger] || 'root'
|
@@ -67,6 +68,7 @@ module Raven
|
|
67
68
|
|
68
69
|
# Some type coercion
|
69
70
|
@timestamp = @timestamp.strftime('%Y-%m-%dT%H:%M:%S') if @timestamp.is_a?(Time)
|
71
|
+
@time_spent = (@time_spent*1000).to_i if @time_spent.is_a?(Float)
|
70
72
|
@level = LOG_LEVELS[@level.to_s.downcase] if @level.is_a?(String) || @level.is_a?(Symbol)
|
71
73
|
end
|
72
74
|
|
@@ -101,6 +103,7 @@ module Raven
|
|
101
103
|
'event_id' => @id,
|
102
104
|
'message' => @message,
|
103
105
|
'timestamp' => @timestamp,
|
106
|
+
'time_spent' => @time_spent,
|
104
107
|
'level' => @level,
|
105
108
|
'project' => @project,
|
106
109
|
'logger' => @logger,
|
@@ -111,7 +114,7 @@ module Raven
|
|
111
114
|
data['modules'] = @modules if @modules
|
112
115
|
data['extra'] = @extra if @extra
|
113
116
|
data['tags'] = @tags if @tags
|
114
|
-
data['
|
117
|
+
data['user'] = @user if @user
|
115
118
|
@interfaces.each_pair do |name, int_data|
|
116
119
|
data[name] = int_data.to_hash
|
117
120
|
end
|
@@ -138,25 +141,35 @@ module Raven
|
|
138
141
|
new(options) do |evt|
|
139
142
|
evt.message = "#{exc.class.to_s}: #{exc.message}"
|
140
143
|
evt.level = options[:level] || :error
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
144
|
+
|
145
|
+
evt.interface(:exception) do |int|
|
146
|
+
int.type = exc.class.to_s
|
147
|
+
int.value = exc.to_s
|
148
|
+
int.module = exc.class.to_s.split('::')[0...-1].join('::')
|
149
|
+
|
150
|
+
# TODO(dcramer): this needs cleaned up, but I couldn't figure out how to
|
151
|
+
# work Hashie as a non-Rubyist
|
152
|
+
if exc.backtrace
|
153
|
+
int.stacktrace = StacktraceInterface.new do |stacktrace|
|
154
|
+
backtrace = Backtrace.parse(exc.backtrace)
|
155
|
+
stacktrace.frames = backtrace.lines.reverse.map do |line|
|
156
|
+
stacktrace.frame do |frame|
|
157
|
+
frame.abs_path = line.file
|
158
|
+
frame.function = line.method
|
159
|
+
frame.lineno = line.number
|
160
|
+
frame.in_app = line.in_app
|
161
|
+
if context_lines && frame.abs_path
|
162
|
+
frame.pre_context, frame.context_line, frame.post_context = \
|
163
|
+
evt.get_file_context(frame.abs_path, frame.lineno, context_lines)
|
164
|
+
end
|
154
165
|
end
|
155
|
-
end
|
156
|
-
|
157
|
-
|
166
|
+
end.select { |f| f.filename }
|
167
|
+
|
168
|
+
evt.culprit = evt.get_culprit(stacktrace.frames)
|
169
|
+
end
|
158
170
|
end
|
159
171
|
end
|
172
|
+
|
160
173
|
block.call(evt) if block
|
161
174
|
end
|
162
175
|
end
|
@@ -187,14 +200,6 @@ module Raven
|
|
187
200
|
"#{lastframe.filename} in #{lastframe.function} at line #{lastframe.lineno}" if lastframe
|
188
201
|
end
|
189
202
|
|
190
|
-
def parse_exception(exception)
|
191
|
-
interface(:exception) do |int|
|
192
|
-
int.type = exception.class.to_s
|
193
|
-
int.value = exception.to_s
|
194
|
-
int.module = exception.class.to_s.split('::')[0...-1].join('::')
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
203
|
# For cross-language compat
|
199
204
|
class << self
|
200
205
|
alias :captureException :from_exception
|
@@ -0,0 +1,51 @@
|
|
1
|
+
if defined?(Delayed)
|
2
|
+
require 'delayed_job'
|
3
|
+
|
4
|
+
module Delayed
|
5
|
+
module Plugins
|
6
|
+
|
7
|
+
class Raven < ::Delayed::Plugin
|
8
|
+
callbacks do |lifecycle|
|
9
|
+
lifecycle.around(:invoke_job) do |job, *args, &block|
|
10
|
+
begin
|
11
|
+
# Forward the call to the next callback in the callback chain
|
12
|
+
block.call(job, *args)
|
13
|
+
|
14
|
+
rescue Exception => exception
|
15
|
+
# Log error to Sentry
|
16
|
+
::Raven.capture_exception(exception,
|
17
|
+
logger => 'delayed_job',
|
18
|
+
tags => {
|
19
|
+
delayed_job_queue => job.queue
|
20
|
+
},
|
21
|
+
extra => {
|
22
|
+
delayed_job => {
|
23
|
+
id => job.id,
|
24
|
+
priority => job.priority,
|
25
|
+
attempts => job.attempts,
|
26
|
+
handler => job.handler,
|
27
|
+
last_error => job.last_error,
|
28
|
+
run_at => job.run_at,
|
29
|
+
locked_at => job.locked_at,
|
30
|
+
#failed_at => job.failed_at,
|
31
|
+
locked_by => job.locked_by,
|
32
|
+
queue => job.queue,
|
33
|
+
created_at => job.created_at
|
34
|
+
}
|
35
|
+
})
|
36
|
+
|
37
|
+
# Make sure we propagate the failure!
|
38
|
+
raise exception
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Register DelayedJob Raven plugin
|
49
|
+
#
|
50
|
+
Delayed::Worker.plugins << Delayed::Plugins::Raven
|
51
|
+
end
|
@@ -3,10 +3,19 @@ require 'raven/interfaces'
|
|
3
3
|
module Raven
|
4
4
|
class ExceptionInterface < Interface
|
5
5
|
|
6
|
-
name '
|
6
|
+
name 'exception'
|
7
7
|
property :type, :required => true
|
8
8
|
property :value, :required => true
|
9
9
|
property :module
|
10
|
+
property :stacktrace
|
11
|
+
|
12
|
+
def to_hash(*args)
|
13
|
+
data = super(*args)
|
14
|
+
if data['stacktrace']
|
15
|
+
data['stacktrace'] = data['stacktrace'].to_hash
|
16
|
+
end
|
17
|
+
data
|
18
|
+
end
|
10
19
|
end
|
11
20
|
|
12
21
|
register_interface :exception => ExceptionInterface
|
data/lib/raven/rack.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
1
3
|
module Raven
|
2
4
|
# Middleware for Rack applications. Any errors raised by the upstream
|
3
5
|
# application will be delivered to Sentry and re-raised.
|
@@ -19,6 +21,7 @@ module Raven
|
|
19
21
|
# Use a standard Raven.configure call to configure your server credentials.
|
20
22
|
class Rack
|
21
23
|
def self.capture_exception(exception, env, options = {})
|
24
|
+
options[:time_spent] = Time.now-env[:requested_at]
|
22
25
|
Raven.capture_exception(exception, options) do |evt|
|
23
26
|
evt.interface :http do |int|
|
24
27
|
int.from_rack(env)
|
@@ -27,6 +30,7 @@ module Raven
|
|
27
30
|
end
|
28
31
|
|
29
32
|
def self.capture_message(message, env, options = {})
|
33
|
+
options[:time_spent] = Time.now-env[:requested_at]
|
30
34
|
Raven.capture_message(message, options) do |evt|
|
31
35
|
evt.interface :http do |int|
|
32
36
|
int.from_rack(env)
|
@@ -39,8 +43,12 @@ module Raven
|
|
39
43
|
end
|
40
44
|
|
41
45
|
def call(env)
|
46
|
+
# clear context at the beginning of the request to ensure a clean slate
|
47
|
+
Context.clear!
|
48
|
+
|
42
49
|
# store the current environment in our local context for arbitrary
|
43
50
|
# callers
|
51
|
+
env[:requested_at] = Time.now
|
44
52
|
Raven.rack_context(env)
|
45
53
|
|
46
54
|
begin
|
@@ -50,8 +58,6 @@ module Raven
|
|
50
58
|
rescue Exception => e
|
51
59
|
Raven::Rack.capture_exception(e, env)
|
52
60
|
raise
|
53
|
-
ensure
|
54
|
-
Context.clear!
|
55
61
|
end
|
56
62
|
|
57
63
|
error = env['rack.exception'] || env['sinatra.error']
|
data/lib/raven/sidekiq.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
1
3
|
module Raven
|
2
4
|
class Sidekiq
|
3
5
|
def call(worker, msg, queue)
|
6
|
+
started_at = Time.now
|
4
7
|
yield
|
5
8
|
rescue => ex
|
6
|
-
Raven.capture_exception(ex, :extra => { :sidekiq => msg }
|
9
|
+
Raven.capture_exception(ex, :extra => { :sidekiq => msg },
|
10
|
+
:time_spent => Time.now-started_at)
|
7
11
|
raise
|
8
12
|
end
|
9
13
|
end
|
data/lib/raven/version.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sentry-raven
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Noah Kantrowitz
|
@@ -10,85 +9,106 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2014-
|
12
|
+
date: 2014-05-22 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: faraday
|
17
|
-
requirement:
|
18
|
-
none: false
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
requirements:
|
20
18
|
- - ! '>='
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: 0.7.6
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
|
-
version_requirements:
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ! '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.7.6
|
26
28
|
- !ruby/object:Gem::Dependency
|
27
29
|
name: uuidtools
|
28
|
-
requirement:
|
29
|
-
none: false
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
32
|
- - ! '>='
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '0'
|
34
35
|
type: :runtime
|
35
36
|
prerelease: false
|
36
|
-
version_requirements:
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
37
42
|
- !ruby/object:Gem::Dependency
|
38
43
|
name: hashie
|
39
|
-
requirement:
|
40
|
-
none: false
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
41
45
|
requirements:
|
42
46
|
- - ! '>='
|
43
47
|
- !ruby/object:Gem::Version
|
44
48
|
version: 1.1.0
|
45
49
|
type: :runtime
|
46
50
|
prerelease: false
|
47
|
-
version_requirements:
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.1.0
|
48
56
|
- !ruby/object:Gem::Dependency
|
49
57
|
name: rake
|
50
|
-
requirement:
|
51
|
-
none: false
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
52
59
|
requirements:
|
53
60
|
- - ! '>='
|
54
61
|
- !ruby/object:Gem::Version
|
55
62
|
version: '0'
|
56
63
|
type: :development
|
57
64
|
prerelease: false
|
58
|
-
version_requirements:
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
59
70
|
- !ruby/object:Gem::Dependency
|
60
71
|
name: rspec
|
61
|
-
requirement:
|
62
|
-
none: false
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
63
73
|
requirements:
|
64
74
|
- - ~>
|
65
75
|
- !ruby/object:Gem::Version
|
66
76
|
version: '2.10'
|
67
77
|
type: :development
|
68
78
|
prerelease: false
|
69
|
-
version_requirements:
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ~>
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '2.10'
|
70
84
|
- !ruby/object:Gem::Dependency
|
71
85
|
name: mime-types
|
72
|
-
requirement:
|
73
|
-
none: false
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
74
87
|
requirements:
|
75
88
|
- - ~>
|
76
89
|
- !ruby/object:Gem::Version
|
77
90
|
version: '1.16'
|
78
91
|
type: :development
|
79
92
|
prerelease: false
|
80
|
-
version_requirements:
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ~>
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '1.16'
|
81
98
|
- !ruby/object:Gem::Dependency
|
82
99
|
name: coveralls
|
83
|
-
requirement:
|
84
|
-
none: false
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
85
101
|
requirements:
|
86
102
|
- - ! '>='
|
87
103
|
- !ruby/object:Gem::Version
|
88
104
|
version: '0'
|
89
105
|
type: :development
|
90
106
|
prerelease: false
|
91
|
-
version_requirements:
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
92
112
|
description:
|
93
113
|
email: noah@coderanger.net
|
94
114
|
executables:
|
@@ -98,6 +118,10 @@ extra_rdoc_files:
|
|
98
118
|
- README.md
|
99
119
|
- LICENSE
|
100
120
|
files:
|
121
|
+
- LICENSE
|
122
|
+
- README.md
|
123
|
+
- bin/raven
|
124
|
+
- lib/raven.rb
|
101
125
|
- lib/raven/backtrace.rb
|
102
126
|
- lib/raven/base.rb
|
103
127
|
- lib/raven/cli.rb
|
@@ -106,11 +130,12 @@ files:
|
|
106
130
|
- lib/raven/context.rb
|
107
131
|
- lib/raven/error.rb
|
108
132
|
- lib/raven/event.rb
|
133
|
+
- lib/raven/integrations/delayed_job.rb
|
134
|
+
- lib/raven/interfaces.rb
|
109
135
|
- lib/raven/interfaces/exception.rb
|
110
136
|
- lib/raven/interfaces/http.rb
|
111
137
|
- lib/raven/interfaces/message.rb
|
112
138
|
- lib/raven/interfaces/stack_trace.rb
|
113
|
-
- lib/raven/interfaces.rb
|
114
139
|
- lib/raven/linecache.rb
|
115
140
|
- lib/raven/logger.rb
|
116
141
|
- lib/raven/okjson.rb
|
@@ -122,37 +147,33 @@ files:
|
|
122
147
|
- lib/raven/railtie.rb
|
123
148
|
- lib/raven/sidekiq.rb
|
124
149
|
- lib/raven/tasks.rb
|
150
|
+
- lib/raven/transports.rb
|
125
151
|
- lib/raven/transports/http.rb
|
126
152
|
- lib/raven/transports/udp.rb
|
127
|
-
- lib/raven/transports.rb
|
128
153
|
- lib/raven/version.rb
|
129
|
-
- lib/raven.rb
|
130
154
|
- lib/sentry-raven.rb
|
131
|
-
- README.md
|
132
|
-
- LICENSE
|
133
|
-
- bin/raven
|
134
155
|
homepage: http://github.com/getsentry/raven-ruby
|
135
|
-
licenses:
|
156
|
+
licenses:
|
157
|
+
- Apache-2.0
|
158
|
+
metadata: {}
|
136
159
|
post_install_message:
|
137
160
|
rdoc_options: []
|
138
161
|
require_paths:
|
139
162
|
- lib
|
140
163
|
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
164
|
requirements:
|
143
165
|
- - ! '>='
|
144
166
|
- !ruby/object:Gem::Version
|
145
167
|
version: '0'
|
146
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
-
none: false
|
148
169
|
requirements:
|
149
170
|
- - ! '>='
|
150
171
|
- !ruby/object:Gem::Version
|
151
172
|
version: '0'
|
152
173
|
requirements: []
|
153
174
|
rubyforge_project:
|
154
|
-
rubygems_version:
|
175
|
+
rubygems_version: 2.2.2
|
155
176
|
signing_key:
|
156
|
-
specification_version:
|
177
|
+
specification_version: 4
|
157
178
|
summary: A gem that provides a client interface for the Sentry error logger
|
158
179
|
test_files: []
|