honeybadger 3.2.0.beta1 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -8
- data/lib/honeybadger.rb +5 -5
- data/lib/honeybadger/agent.rb +20 -0
- data/lib/honeybadger/backend/base.rb +9 -0
- data/lib/honeybadger/backend/debug.rb +6 -0
- data/lib/honeybadger/backend/null.rb +4 -0
- data/lib/honeybadger/backend/server.rb +14 -0
- data/lib/honeybadger/backend/test.rb +20 -0
- data/lib/honeybadger/init/sinatra.rb +2 -0
- data/lib/honeybadger/notice.rb +10 -3
- data/lib/honeybadger/singleton.rb +14 -0
- data/lib/honeybadger/util/http.rb +6 -0
- data/lib/honeybadger/util/sanitizer.rb +2 -0
- data/lib/honeybadger/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 315f88413aa73eea6868999adbad9707b1a6fb30
|
4
|
+
data.tar.gz: '0583a2c4a6e6feaf9e9b02d1c9f7d044864b4c03'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83eb0c64f6821c92edcc90829b7b7b9e7f43c857937236235cb97b12a54e90ba99619a0e255c3158bf5b67cf6740714d66e33232eb1753d0fc428c72f591bc82
|
7
|
+
data.tar.gz: 060b06e30f83babcd3ece659c3e9010aa34696911540a3366dff53d181742c2ee8ba62ad5fb33340a1ff9b447404627f7cde6484878e20fd7913de163fac2c03
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,16 @@ CHANGELOG](http://keepachangelog.com/) for how to update this file. This project
|
|
4
4
|
adheres to [Semantic Versioning](http://semver.org/).
|
5
5
|
|
6
6
|
## [Unreleased]
|
7
|
+
|
8
|
+
## [3.2.0] - 2017-11-27
|
9
|
+
### Changed
|
10
|
+
- Objects which explicitly alias `#to_s` to `#inspect` (such as `OpenStruct`) are
|
11
|
+
now sanitized. `'#<OpenStruct attribute="value">'` becomes `'#<OpenStruct>'`.
|
12
|
+
If you pass the value of `#inspect` (as a `String`) directly to Honeybadger (or
|
13
|
+
return it from `#to_honeybadger`), the value will not be sanitized.
|
14
|
+
- We're now using `String(object)` instead of `object.to_s` as the last resort
|
15
|
+
during sanitization.
|
16
|
+
|
7
17
|
### Added
|
8
18
|
- The exception cause may now be set using an optional `:cause` option when
|
9
19
|
calling `Honeybadger.notify`. If not present, the exception's cause will be
|
@@ -16,15 +26,8 @@ adheres to [Semantic Versioning](http://semver.org/).
|
|
16
26
|
for unknown types) can be changed by defining the `#to_honeybadger` method. If
|
17
27
|
the method is defined, the return value of that method will be sent to Honeybadger
|
18
28
|
instead of the `#to_s` value (for context values, local variables, etc.).
|
19
|
-
- `BasicObject`, which previously could not be serialized, is now serialized as
|
20
|
-
`"#<BasicObject>"`.
|
21
|
-
- Objects which explicitly alias `#to_s` to `#inspect` (such as `OpenStruct`) are
|
22
|
-
now sanitized. `'#<OpenStruct attribute="value">'` becomes `'#<OpenStruct>'`.
|
23
|
-
If you pass the value of `#inspect` (as a `String`) directly to Honeybadger (or
|
24
|
-
return it from `#to_honeybadger`), the value will not be sanitized.
|
25
|
-
- We're now using `String(object)` instead of `object.to_s` as the last resort
|
26
|
-
during sanitization.
|
27
29
|
- `'[RAISED]'` is returned when `object.to_honeybadger` or `String(object)` fails.
|
30
|
+
- Added `Honeybadger.check_in` method which allows performing check ins from ruby.
|
28
31
|
|
29
32
|
### Fixed
|
30
33
|
- We no longer use "/dev/null" as the default log device as it doesn't exist on
|
@@ -32,6 +35,10 @@ adheres to [Semantic Versioning](http://semver.org/).
|
|
32
35
|
- Logs when reporting errors in development mode now mention that the error wasn't
|
33
36
|
*actually* reported. :)
|
34
37
|
- Support new Sidekiq job params key.
|
38
|
+
- Move at_exit callback to an appropriate place for sinatra apps, so that it does
|
39
|
+
not prematurely stop honeybadger workers.
|
40
|
+
- `BasicObject`, which previously could not be serialized, is now serialized as
|
41
|
+
`"#<BasicObject>"`.
|
35
42
|
|
36
43
|
## [3.1.2] - 2017-04-20
|
37
44
|
### Fixed
|
data/lib/honeybadger.rb
CHANGED
@@ -10,9 +10,9 @@ if defined?(Rake.application)
|
|
10
10
|
require 'honeybadger/init/rake'
|
11
11
|
end
|
12
12
|
|
13
|
-
at_exit
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
Honeybadger.
|
13
|
+
# Sinatra is a special case. Sinatra starts the web application in an at_exit
|
14
|
+
# handler. And, since we require sinatra before requiring HB, the only way to
|
15
|
+
# setup our at_exit callback is in the sinatra build callback honeybadger/init/sinatra.rb
|
16
|
+
if !defined?(Sinatra::Base)
|
17
|
+
Honeybadger.install_at_exit_callback
|
18
18
|
end
|
data/lib/honeybadger/agent.rb
CHANGED
@@ -143,6 +143,23 @@ module Honeybadger
|
|
143
143
|
notice.id
|
144
144
|
end
|
145
145
|
|
146
|
+
# Public: Perform a synchronous check_in.
|
147
|
+
#
|
148
|
+
# id - The unique check in id (e.g. '1MqIo1') or the check in url.
|
149
|
+
#
|
150
|
+
# Examples
|
151
|
+
#
|
152
|
+
# Honeybadger.check_in('1MqIo1')
|
153
|
+
#
|
154
|
+
# Returns a boolean which is true if the check in was successful and false
|
155
|
+
# otherwise.
|
156
|
+
def check_in(id)
|
157
|
+
# this is to allow check ins even if a url is passed
|
158
|
+
check_in_id = id.to_s.strip.gsub(/\/$/, '').split('/').last
|
159
|
+
response = backend.check_in(check_in_id)
|
160
|
+
response.success?
|
161
|
+
end
|
162
|
+
|
146
163
|
# Public: Save global context for the current request.
|
147
164
|
#
|
148
165
|
# context - A Hash of data which will be sent to Honeybadger when an error
|
@@ -355,6 +372,9 @@ module Honeybadger
|
|
355
372
|
# Internal
|
356
373
|
def_delegators :config, :init!
|
357
374
|
|
375
|
+
# Internal
|
376
|
+
def_delegators :config, :backend
|
377
|
+
|
358
378
|
private
|
359
379
|
|
360
380
|
def validate_notify_opts!(opts)
|
@@ -88,6 +88,15 @@ module Honeybadger
|
|
88
88
|
raise NotImplementedError, 'must define #notify on subclass.'
|
89
89
|
end
|
90
90
|
|
91
|
+
# Internal: Does a check in using the input id.
|
92
|
+
#
|
93
|
+
# id - The unique check_in id.
|
94
|
+
#
|
95
|
+
# Raises NotImplementedError.
|
96
|
+
def check_in(id)
|
97
|
+
raise NotImplementedError, 'must define #check_in on subclass.'
|
98
|
+
end
|
99
|
+
|
91
100
|
private
|
92
101
|
|
93
102
|
attr_reader :config
|
@@ -11,6 +11,12 @@ module Honeybadger
|
|
11
11
|
return Response.new(ENV['DEBUG_BACKEND_STATUS'].to_i, nil) if ENV['DEBUG_BACKEND_STATUS']
|
12
12
|
super
|
13
13
|
end
|
14
|
+
|
15
|
+
def check_in(id)
|
16
|
+
logger.unknown("checking in debug backend with id=#{id}")
|
17
|
+
return Response.new(ENV['DEBUG_BACKEND_STATUS'].to_i, nil) if ENV['DEBUG_BACKEND_STATUS']
|
18
|
+
super
|
19
|
+
end
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|
@@ -14,6 +14,9 @@ module Honeybadger
|
|
14
14
|
deploys: '/v1/deploys'.freeze
|
15
15
|
}.freeze
|
16
16
|
|
17
|
+
CHECK_IN_ENDPOINT = '/v1/check_in'.freeze
|
18
|
+
|
19
|
+
|
17
20
|
HTTP_ERRORS = Util::HTTP::ERRORS
|
18
21
|
|
19
22
|
def initialize(config)
|
@@ -34,6 +37,17 @@ module Honeybadger
|
|
34
37
|
Response.new(:error, nil, "HTTP Error: #{e.class}")
|
35
38
|
end
|
36
39
|
|
40
|
+
# Internal: Does a check in using the input id.
|
41
|
+
#
|
42
|
+
# id - The unique check_in id.
|
43
|
+
#
|
44
|
+
# Returns Response.
|
45
|
+
def check_in(id)
|
46
|
+
Response.new(@http.get("#{CHECK_IN_ENDPOINT}/#{id}"))
|
47
|
+
rescue *HTTP_ERRORS => e
|
48
|
+
Response.new(:error, nil, "HTTP Error: #{e.class}")
|
49
|
+
end
|
50
|
+
|
37
51
|
private
|
38
52
|
|
39
53
|
# Internal: Construct headers for supported payloads.
|
@@ -14,15 +14,35 @@ module Honeybadger
|
|
14
14
|
@notifications ||= Hash.new {|h,k| h[k] = [] }
|
15
15
|
end
|
16
16
|
|
17
|
+
# Public: The check in list.
|
18
|
+
#
|
19
|
+
# Examples
|
20
|
+
#
|
21
|
+
# Test.check_ins # => ["foobar", "danny", ...]
|
22
|
+
#
|
23
|
+
# Returns the Array of check ins.
|
24
|
+
def self.check_ins
|
25
|
+
@check_ins ||= []
|
26
|
+
end
|
27
|
+
|
17
28
|
# Internal: Local helper.
|
18
29
|
def notifications
|
19
30
|
self.class.notifications
|
20
31
|
end
|
21
32
|
|
33
|
+
# Internal: Local helper.
|
34
|
+
def check_ins
|
35
|
+
self.class.check_ins
|
36
|
+
end
|
37
|
+
|
22
38
|
def notify(feature, payload)
|
23
39
|
notifications[feature] << payload
|
24
40
|
super
|
25
41
|
end
|
42
|
+
|
43
|
+
def check_in(id)
|
44
|
+
check_ins << id
|
45
|
+
end
|
26
46
|
end
|
27
47
|
end
|
28
48
|
end
|
@@ -9,6 +9,7 @@ module Honeybadger
|
|
9
9
|
def build_with_honeybadger(*args, &block)
|
10
10
|
configure_honeybadger
|
11
11
|
install_honeybadger
|
12
|
+
Honeybadger.install_at_exit_callback
|
12
13
|
build_without_honeybadger(*args, &block)
|
13
14
|
end
|
14
15
|
alias :build_without_honeybadger :build
|
@@ -31,6 +32,7 @@ module Honeybadger
|
|
31
32
|
return if middleware.any? {|m| m[0] == klass }
|
32
33
|
use(klass)
|
33
34
|
end
|
35
|
+
|
34
36
|
end
|
35
37
|
end
|
36
38
|
end
|
data/lib/honeybadger/notice.rb
CHANGED
@@ -324,15 +324,22 @@ module Honeybadger
|
|
324
324
|
Util::RequestPayload.build(request)
|
325
325
|
end
|
326
326
|
|
327
|
+
# Internal: Get optional context from exception.
|
328
|
+
#
|
329
|
+
# Returns the Hash context.
|
327
330
|
def exception_context(exception)
|
328
|
-
|
329
|
-
|
331
|
+
# This extra check exists because the exception itself is not expected to
|
332
|
+
# convert to a hash.
|
333
|
+
object = exception if exception.respond_to?(:to_honeybadger_context)
|
334
|
+
object ||= {}.freeze
|
335
|
+
|
336
|
+
Context(object)
|
330
337
|
end
|
331
338
|
|
332
339
|
def construct_context_hash(opts, exception)
|
333
340
|
context = {}
|
334
341
|
context.merge!(Context(opts[:global_context]))
|
335
|
-
context.merge!(
|
342
|
+
context.merge!(exception_context(exception))
|
336
343
|
context.merge!(Context(opts[:context]))
|
337
344
|
context.empty? ? nil : context
|
338
345
|
end
|
@@ -16,6 +16,10 @@ module Honeybadger
|
|
16
16
|
Agent.instance.notify(exception_or_opts, opts)
|
17
17
|
end
|
18
18
|
|
19
|
+
def check_in(id)
|
20
|
+
Agent.instance.check_in(id)
|
21
|
+
end
|
22
|
+
|
19
23
|
def load_plugins!
|
20
24
|
Dir[File.expand_path('../plugins/*.rb', __FILE__)].each do |plugin|
|
21
25
|
require plugin
|
@@ -23,6 +27,16 @@ module Honeybadger
|
|
23
27
|
Plugin.load!(self.config)
|
24
28
|
end
|
25
29
|
|
30
|
+
def install_at_exit_callback
|
31
|
+
at_exit do
|
32
|
+
if $! && !$!.is_a?(SystemExit) && Honeybadger.config[:'exceptions.notify_at_exit']
|
33
|
+
Honeybadger.notify($!, component: 'at_exit', sync: true)
|
34
|
+
end
|
35
|
+
|
36
|
+
Honeybadger.stop if Honeybadger.config[:'send_data_at_exit']
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
26
40
|
# Deprecated
|
27
41
|
def start(config = {})
|
28
42
|
raise NoMethodError, <<-WARNING
|
@@ -37,6 +37,12 @@ module Honeybadger
|
|
37
37
|
@config = config
|
38
38
|
end
|
39
39
|
|
40
|
+
def get(endpoint)
|
41
|
+
response = http_connection.get(endpoint)
|
42
|
+
debug { sprintf("http method=GET path=%s code=%d", endpoint.dump, response.code) }
|
43
|
+
response
|
44
|
+
end
|
45
|
+
|
40
46
|
def post(endpoint, payload, headers = nil)
|
41
47
|
response = http_connection.post(endpoint, compress(payload.to_json), http_headers(headers))
|
42
48
|
debug { sprintf("http method=POST path=%s code=%d", endpoint.dump, response.code) }
|
data/lib/honeybadger/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: honeybadger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.0
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Honeybadger Industries LLC
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Make managing application errors a more pleasant experience.
|
14
14
|
email:
|
@@ -138,12 +138,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
138
138
|
version: 2.1.0
|
139
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
140
|
requirements:
|
141
|
-
- - "
|
141
|
+
- - ">="
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version:
|
143
|
+
version: '0'
|
144
144
|
requirements: []
|
145
145
|
rubyforge_project:
|
146
|
-
rubygems_version: 2.6.
|
146
|
+
rubygems_version: 2.6.13
|
147
147
|
signing_key:
|
148
148
|
specification_version: 4
|
149
149
|
summary: Error reports you can be happy about.
|