honeybadger 5.13.2 → 5.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de851e791df98653d1e5af860eba6f9dec3cc39666cff9e6e8bfc04dcfd81e5d
4
- data.tar.gz: 618b8fd621606d0e8db648807e308a67b9c0212a0dea0e66c4bd54cf9e671cf6
3
+ metadata.gz: 60300a5d8ccaecda5eeff8887f76c5c54dba5c4610539c4ff8865d1355a5c124
4
+ data.tar.gz: d057c93fc1a8d24f6fdb4a952d5b56cf8dbf0f3ee07466eaad38d3be2efcad13
5
5
  SHA512:
6
- metadata.gz: a5b1db0b353ff7000b6b32c7664e69003a9bb69a75282392f639df5b8b352c65b7f4bd3a4736fbfd96a44d3d0070dc9c1ef348d98878cb93f22f7cb73b856a5a
7
- data.tar.gz: 8aea0c27bd056a5cfc41114ee0a160e00c30aa8752fcec84b215706a23b6329a6f1648106176f9ca8f484e7518716c4348e9aaf1989ee70dcbfe9de415f32e1e
6
+ metadata.gz: 06cdba44a37870e7b2e51414efb9ac48f5e3dc8015403a7b40e3a12520f0d037ab77f90205ea85f610de2d9bee11b6b6d5bf63fcbfce6a8d296ef8d1aeec7af9
7
+ data.tar.gz: 6538734d781bd200445e9ac603baf2fbd3b91a0e723112cb79d7468a56baaadc38921fdd75dfd4bde8ad25a67e911e3c56020dcff54f49414066abd68c83dc9a
data/CHANGELOG.md CHANGED
@@ -1,6 +1,48 @@
1
1
  # Change Log
2
2
 
3
3
 
4
+ ## [5.15.0](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.14.2...v5.15.0) (2024-07-18)
5
+
6
+
7
+ ### Features
8
+
9
+ * define default events to ignore, allow for override ([#570](https://github.com/honeybadger-io/honeybadger-ruby/issues/570)) ([a6f2177](https://github.com/honeybadger-io/honeybadger-ruby/commit/a6f2177eb69b75eafef235768187ccf6b3a538f0))
10
+
11
+ ## [5.14.2](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.14.1...v5.14.2) (2024-07-17)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * add []= delegator ([#590](https://github.com/honeybadger-io/honeybadger-ruby/issues/590)) ([9f1d6b5](https://github.com/honeybadger-io/honeybadger-ruby/commit/9f1d6b55e88497c4c37659fdfaeaa163c7794672))
17
+ * add event method for cli backend test ([#588](https://github.com/honeybadger-io/honeybadger-ruby/issues/588)) ([1e047bb](https://github.com/honeybadger-io/honeybadger-ruby/commit/1e047bbcd17db676b96dd78eb918475e3a52ab1b))
18
+
19
+ ## [5.14.1](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.14.0...v5.14.1) (2024-07-15)
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * do not serialize adapter object ([#586](https://github.com/honeybadger-io/honeybadger-ruby/issues/586)) ([f724ebf](https://github.com/honeybadger-io/honeybadger-ruby/commit/f724ebf0a2c3e2402c64448779cf7e6386de8b47))
25
+
26
+ ## [5.14.0](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.13.3...v5.14.0) (2024-07-11)
27
+
28
+
29
+ ### Features
30
+
31
+ * add --host and --ui_host flags to install command ([#584](https://github.com/honeybadger-io/honeybadger-ruby/issues/584)) ([5f171ba](https://github.com/honeybadger-io/honeybadger-ruby/commit/5f171badc0602df76a87e4caa0e06c9959648376))
32
+ * add ability to link to a custom domain after creating a notice ([#583](https://github.com/honeybadger-io/honeybadger-ruby/issues/583)) ([5b32b23](https://github.com/honeybadger-io/honeybadger-ruby/commit/5b32b231bb5562b3d97066e3a41f39de76b2f4a3))
33
+
34
+
35
+ ### Bug Fixes
36
+
37
+ * squash warning about BigDecimal ([#578](https://github.com/honeybadger-io/honeybadger-ruby/issues/578)) ([47ff813](https://github.com/honeybadger-io/honeybadger-ruby/commit/47ff8130047b723b9d85be07b308c4883320eabb))
38
+
39
+ ## [5.13.3](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.13.2...v5.13.3) (2024-07-06)
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * disable insights when loading rails console ([#580](https://github.com/honeybadger-io/honeybadger-ruby/issues/580)) ([94844bd](https://github.com/honeybadger-io/honeybadger-ruby/commit/94844bd72922f27ecf40453ef7c901433067688b))
45
+
4
46
  ## [5.13.2](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.13.1...v5.13.2) (2024-07-03)
5
47
 
6
48
 
@@ -404,7 +404,18 @@ module Honeybadger
404
404
  with_error_handling { hook.call(event) }
405
405
  end
406
406
 
407
- return if config.ignored_events.any? { |check| event.event_type&.match?(check) }
407
+ return if config.ignored_events.any? do |check|
408
+ with_error_handling do
409
+ check.all? do |keys, value|
410
+ if keys == [:event_type]
411
+ event.event_type&.match?(value)
412
+ elsif event.dig(*keys)
413
+ event.dig(*keys).to_s.match?(value)
414
+ end
415
+ end
416
+ end
417
+ end
418
+
408
419
  return if event.halted?
409
420
 
410
421
  events_worker.push(event.as_json)
@@ -13,6 +13,16 @@ module Honeybadger
13
13
  @notifications ||= Hash.new {|h,k| h[k] = [] }
14
14
  end
15
15
 
16
+ # The event list.
17
+ #
18
+ # @example
19
+ # Test.events # => [{}, {}, ...]
20
+ #
21
+ # @return [Array<Hash>] List of event payloads.
22
+ def self.events
23
+ @events ||= []
24
+ end
25
+
16
26
  # @api public
17
27
  # The check in list.
18
28
  #
@@ -37,6 +47,11 @@ module Honeybadger
37
47
  super
38
48
  end
39
49
 
50
+ def event(payload)
51
+ events << payload
52
+ super
53
+ end
54
+
40
55
  def check_in(id)
41
56
  check_ins << id
42
57
  super
@@ -78,6 +78,10 @@ debug: false
78
78
  insights:
79
79
  enabled: #{options["insights"]}
80
80
  CONFIG
81
+ if (connection = options.slice("host", "ui_host")).any?
82
+ file.puts("\n# Override hosts\nconnection:")
83
+ connection.each {|k,v| file.puts(" #{k}: '#{v}'") }
84
+ end
81
85
  end
82
86
  end
83
87
 
@@ -49,6 +49,8 @@ WELCOME
49
49
 
50
50
  desc 'install API_KEY', 'Install Honeybadger into a new project'
51
51
  option :insights, type: :boolean, aliases: :'-i', default: false, desc: 'Enable Honeybadger Insights'
52
+ option :host, type: :string
53
+ option :ui_host, type: :string
52
54
  def install(api_key)
53
55
  Install.new(options, api_key).run
54
56
  rescue => e
@@ -24,11 +24,21 @@ module Honeybadger
24
24
  @callings ||= Hash.new {|h,k| h[k] = [] }
25
25
  end
26
26
 
27
+ def self.events
28
+ @events ||= []
29
+ end
30
+
27
31
  def notify(feature, payload)
28
32
  response = @backend.notify(feature, payload)
29
33
  self.class.callings[feature] << [payload, response]
30
34
  response
31
35
  end
36
+
37
+ def event(payload)
38
+ response = @backend.event(payload)
39
+ self.class.events << [payload, response]
40
+ response
41
+ end
32
42
  end
33
43
 
34
44
  def initialize(options)
@@ -31,6 +31,12 @@ module Honeybadger
31
31
  'Sinatra::NotFound',
32
32
  'Sidekiq::JobRetry::Skip'].map(&:freeze).freeze
33
33
 
34
+ IGNORE_EVENTS_DEFAULT = [
35
+ { event_type: 'sql.active_record', query: /^(begin|commit)( transaction)?$/i },
36
+ { event_type: 'sql.active_record', query: /(solid_queue|good_job)/i },
37
+ { event_type: 'process_action.action_controller', controller: 'Rails::HealthController' }
38
+ ].freeze
39
+
34
40
  DEVELOPMENT_ENVIRONMENTS = ['development', 'test', 'cucumber'].map(&:freeze).freeze
35
41
 
36
42
  DEFAULT_PATHS = ['honeybadger.yml', 'config/honeybadger.yml', "#{ENV['HOME']}/honeybadger.yml"].map(&:freeze).freeze
@@ -112,8 +118,13 @@ module Honeybadger
112
118
  type: Boolean
113
119
  },
114
120
  :'events.ignore' => {
115
- description: 'A list of events to ignore. Use a string to specify exact matches, or regex for more flexibility.',
116
- default: [],
121
+ description: 'A list of additional events to ignore. Use a hash to query nested payloads, match using a string or regex. Non-hash will match on the event_type.',
122
+ default: IGNORE_EVENTS_DEFAULT,
123
+ type: Array
124
+ },
125
+ :'events.ignore_only' => {
126
+ description: 'A list of events to ignore (overrides the default ignored events).',
127
+ default: nil,
117
128
  type: Array
118
129
  },
119
130
  plugins: {
@@ -166,6 +177,11 @@ module Honeybadger
166
177
  default: 'api.honeybadger.io'.freeze,
167
178
  type: String
168
179
  },
180
+ :'connection.ui_host' => {
181
+ description: 'The host to use when viewing data.',
182
+ default: 'app.honeybadger.io'.freeze,
183
+ type: String
184
+ },
169
185
  :'connection.port' => {
170
186
  description: 'The port to use when sending data.',
171
187
  default: nil,
@@ -192,10 +192,22 @@ module Honeybadger
192
192
  DEFAULTS[:'exceptions.ignore'] | Array(ignore)
193
193
  end
194
194
 
195
+ def raw_ignored_events
196
+ ignore_only = get(:'events.ignore_only')
197
+ return ignore_only if ignore_only
198
+ return DEFAULTS[:'events.ignore'] unless ignore = get(:'events.ignore')
199
+
200
+ DEFAULTS[:'events.ignore'] | Array(ignore)
201
+ end
202
+
195
203
  def ignored_events
196
- self[:'events.ignore'].map do |check|
197
- check.is_a?(String) ? /^#{check}$/ : check
198
- end
204
+ @ignored_events ||= raw_ignored_events.map do |check|
205
+ if check.is_a?(String) || check.is_a?(Regexp)
206
+ { [:event_type] => check }
207
+ elsif check.is_a?(Hash)
208
+ flat_hash(check).transform_keys! { |key_array| key_array.map(&:to_sym) }
209
+ end
210
+ end.compact
199
211
  end
200
212
 
201
213
  def ca_bundle_path
@@ -455,5 +467,14 @@ module Honeybadger
455
467
  end
456
468
  end
457
469
  end
470
+
471
+ # Converts a nested hash into a single layer where keys become arrays:
472
+ # ex: > flat_hash({ :nested => { :hash => "value" }})
473
+ # > { [:nested, :hash] => "value" }
474
+ def flat_hash(h,f=[],g={})
475
+ return g.update({ f=>h }) unless h.is_a? Hash
476
+ h.each { |k,r| flat_hash(r,f+[k],g) }
477
+ g
478
+ end
458
479
  end
459
480
  end
@@ -13,7 +13,7 @@ module Honeybadger
13
13
  # The payload data of the event
14
14
  attr_reader :payload
15
15
 
16
- def_delegator :payload, :[]
16
+ def_delegators :payload, :dig, :[], :[]=
17
17
 
18
18
  # @api private
19
19
  def initialize(event_type_or_payload, payload={})
@@ -32,6 +32,10 @@ module Honeybadger
32
32
  config.after_initialize do
33
33
  Honeybadger.load_plugins!
34
34
  end
35
+
36
+ console do
37
+ Honeybadger::Agent.instance.config[:'insights.enabled'] = false unless Honeybadger::Agent.instance.config.env.has_key?(:'insights.enabled')
38
+ end
35
39
  end
36
40
  end
37
41
  end
@@ -66,7 +66,6 @@ module Honeybadger
66
66
 
67
67
  def process?(event, payload)
68
68
  return false if payload[:name] == "SCHEMA"
69
- return false if payload[:sql]&.match?(/^(begin|commit)( transaction)?$/i)
70
69
  true
71
70
  end
72
71
  end
@@ -74,8 +73,10 @@ module Honeybadger
74
73
  class ActiveJobSubscriber < NotificationSubscriber
75
74
  def format_payload(payload)
76
75
  job = payload[:job]
77
- payload.except(:job).merge({
78
- job_class: job.class,
76
+ adapter = payload[:adapter]
77
+ payload.except(:job, :adapter).merge({
78
+ adapter_class: adapter.class.to_s,
79
+ job_class: job.class.to_s,
79
80
  job_id: job.job_id,
80
81
  queue_name: job.queue_name
81
82
  })
@@ -87,7 +88,7 @@ module Honeybadger
87
88
 
88
89
  def format_payload(payload)
89
90
  {
90
- job_class: payload[:job].class,
91
+ job_class: payload[:job].class.to_s,
91
92
  queue_name: payload[:job].queue_name
92
93
  }
93
94
  end
@@ -2,7 +2,7 @@ module Honeybadger
2
2
  module Plugins
3
3
  module SolidQueue
4
4
  Plugin.register :solid_queue do
5
- requirement { defined?(::SolidQueue) }
5
+ requirement { config.load_plugin_insights?(:solid_queue) && defined?(::SolidQueue) }
6
6
 
7
7
  collect do
8
8
  if config.cluster_collection?(:solid_queue)
@@ -1,4 +1,3 @@
1
- require 'bigdecimal'
2
1
  require 'set'
3
2
 
4
3
  require 'honeybadger/conversions'
@@ -21,7 +20,7 @@ module Honeybadger
21
20
  RECURSION = '[RECURSION]'.freeze
22
21
  TRUNCATED = '[TRUNCATED]'.freeze
23
22
 
24
- IMMUTABLE = [NilClass, FalseClass, TrueClass, Symbol, Numeric, BigDecimal, Method].freeze
23
+ IMMUTABLE = [NilClass, FalseClass, TrueClass, Symbol, Numeric, Method].freeze
25
24
 
26
25
  MAX_STRING_SIZE = 65536
27
26
 
@@ -1,4 +1,4 @@
1
1
  module Honeybadger
2
2
  # The current String Honeybadger version.
3
- VERSION = '5.13.2'.freeze
3
+ VERSION = '5.15.0'.freeze
4
4
  end
@@ -226,10 +226,11 @@ module Honeybadger
226
226
  when 413
227
227
  warn { sprintf('Error report failed: Payload is too large. id=%s code=%s', msg.id, response.code) }
228
228
  when 201
229
+ host = config.get(:'connection.ui_host')
229
230
  if throttle = dec_throttle
230
- info { sprintf('Success ⚡ https://app.honeybadger.io/notice/%s id=%s code=%s throttle=%s interval=%s', msg.id, msg.id, response.code, throttle, throttle_interval) }
231
+ info { sprintf('Success ⚡ https://%s/notice/%s id=%s code=%s throttle=%s interval=%s', host, msg.id, msg.id, response.code, throttle, throttle_interval) }
231
232
  else
232
- info { sprintf('Success ⚡ https://app.honeybadger.io/notice/%s id=%s code=%s', msg.id, msg.id, response.code) }
233
+ info { sprintf('Success ⚡ https://%s/notice/%s id=%s code=%s', host, msg.id, msg.id, response.code) }
233
234
  end
234
235
  when :stubbed
235
236
  info { sprintf('Success ⚡ Development mode is enabled; this error will be reported if it occurs after you deploy your app. id=%s', msg.id) }
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: 5.13.2
4
+ version: 5.15.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: 2024-07-03 00:00:00.000000000 Z
11
+ date: 2024-07-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Make managing application errors a more pleasant experience.
14
14
  email: