honeybadger 5.29.1 → 6.0.1

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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/lib/honeybadger/agent.rb +36 -35
  4. data/lib/honeybadger/backend/base.rb +11 -11
  5. data/lib/honeybadger/backend/debug.rb +4 -4
  6. data/lib/honeybadger/backend/null.rb +2 -2
  7. data/lib/honeybadger/backend/server.rb +11 -11
  8. data/lib/honeybadger/backend/test.rb +2 -2
  9. data/lib/honeybadger/backend.rb +6 -6
  10. data/lib/honeybadger/backtrace.rb +27 -22
  11. data/lib/honeybadger/breadcrumbs/active_support.rb +9 -9
  12. data/lib/honeybadger/breadcrumbs/breadcrumb.rb +1 -2
  13. data/lib/honeybadger/breadcrumbs/collector.rb +4 -4
  14. data/lib/honeybadger/breadcrumbs/logging.rb +11 -14
  15. data/lib/honeybadger/breadcrumbs.rb +3 -3
  16. data/lib/honeybadger/cli/deploy.rb +7 -7
  17. data/lib/honeybadger/cli/exec.rb +41 -41
  18. data/lib/honeybadger/cli/helpers.rb +18 -18
  19. data/lib/honeybadger/cli/heroku.rb +36 -36
  20. data/lib/honeybadger/cli/install.rb +44 -44
  21. data/lib/honeybadger/cli/main.rb +107 -107
  22. data/lib/honeybadger/cli/notify.rb +13 -13
  23. data/lib/honeybadger/cli/test.rb +109 -94
  24. data/lib/honeybadger/cli.rb +3 -3
  25. data/lib/honeybadger/config/defaults.rb +218 -218
  26. data/lib/honeybadger/config/env.rb +5 -5
  27. data/lib/honeybadger/config/ruby.rb +19 -19
  28. data/lib/honeybadger/config/yaml.rb +12 -12
  29. data/lib/honeybadger/config.rb +76 -78
  30. data/lib/honeybadger/const.rb +4 -4
  31. data/lib/honeybadger/context_manager.rb +1 -2
  32. data/lib/honeybadger/conversions.rb +9 -6
  33. data/lib/honeybadger/counter.rb +4 -4
  34. data/lib/honeybadger/event.rb +3 -3
  35. data/lib/honeybadger/events_worker.rb +33 -33
  36. data/lib/honeybadger/gauge.rb +2 -2
  37. data/lib/honeybadger/histogram.rb +4 -4
  38. data/lib/honeybadger/init/hanami.rb +5 -5
  39. data/lib/honeybadger/init/rails.rb +14 -14
  40. data/lib/honeybadger/init/rake.rb +19 -21
  41. data/lib/honeybadger/init/ruby.rb +4 -4
  42. data/lib/honeybadger/init/sinatra.rb +11 -12
  43. data/lib/honeybadger/instrumentation.rb +26 -31
  44. data/lib/honeybadger/instrumentation_helper.rb +11 -12
  45. data/lib/honeybadger/karafka.rb +55 -56
  46. data/lib/honeybadger/logging.rb +22 -21
  47. data/lib/honeybadger/metric.rb +2 -2
  48. data/lib/honeybadger/metrics_worker.rb +12 -10
  49. data/lib/honeybadger/notice.rb +55 -58
  50. data/lib/honeybadger/notification_subscriber.rb +14 -14
  51. data/lib/honeybadger/plugin.rb +16 -18
  52. data/lib/honeybadger/plugins/active_job.rb +11 -9
  53. data/lib/honeybadger/plugins/autotuner.rb +5 -5
  54. data/lib/honeybadger/plugins/breadcrumbs.rb +7 -7
  55. data/lib/honeybadger/plugins/delayed_job/plugin.rb +36 -37
  56. data/lib/honeybadger/plugins/delayed_job.rb +4 -4
  57. data/lib/honeybadger/plugins/faktory.rb +10 -10
  58. data/lib/honeybadger/plugins/karafka.rb +3 -3
  59. data/lib/honeybadger/plugins/lambda.rb +9 -11
  60. data/lib/honeybadger/plugins/local_variables.rb +4 -4
  61. data/lib/honeybadger/plugins/net_http.rb +10 -10
  62. data/lib/honeybadger/plugins/passenger.rb +4 -4
  63. data/lib/honeybadger/plugins/rails.rb +13 -9
  64. data/lib/honeybadger/plugins/resque.rb +7 -7
  65. data/lib/honeybadger/plugins/shoryuken.rb +6 -6
  66. data/lib/honeybadger/plugins/sidekiq.rb +62 -58
  67. data/lib/honeybadger/plugins/solid_queue.rb +3 -3
  68. data/lib/honeybadger/plugins/sucker_punch.rb +5 -5
  69. data/lib/honeybadger/plugins/system.rb +3 -3
  70. data/lib/honeybadger/plugins/thor.rb +5 -5
  71. data/lib/honeybadger/plugins/warden.rb +4 -4
  72. data/lib/honeybadger/rack/error_notifier.rb +14 -14
  73. data/lib/honeybadger/rack/user_feedback.rb +11 -12
  74. data/lib/honeybadger/rack/user_informer.rb +6 -6
  75. data/lib/honeybadger/registry.rb +2 -2
  76. data/lib/honeybadger/registry_execution.rb +1 -1
  77. data/lib/honeybadger/ruby.rb +2 -2
  78. data/lib/honeybadger/singleton.rb +49 -48
  79. data/lib/honeybadger/tasks.rb +3 -3
  80. data/lib/honeybadger/timer.rb +1 -1
  81. data/lib/honeybadger/util/http.rb +27 -27
  82. data/lib/honeybadger/util/request_hash.rb +11 -11
  83. data/lib/honeybadger/util/request_payload.rb +2 -2
  84. data/lib/honeybadger/util/revision.rb +14 -6
  85. data/lib/honeybadger/util/sanitizer.rb +22 -22
  86. data/lib/honeybadger/util/stats.rb +6 -3
  87. data/lib/honeybadger/version.rb +1 -1
  88. data/lib/honeybadger/worker.rb +31 -29
  89. data/lib/honeybadger.rb +5 -5
  90. data/lib/puma/plugin/honeybadger.rb +12 -8
  91. metadata +2 -2
@@ -1,529 +1,529 @@
1
- require 'socket'
2
- require 'honeybadger/breadcrumbs/active_support'
1
+ require "socket"
2
+ require "honeybadger/breadcrumbs/active_support"
3
3
 
4
4
  module Honeybadger
5
5
  class Config
6
6
  class Boolean; end
7
7
 
8
- IGNORE_DEFAULT = ['ActionController::RoutingError',
9
- 'AbstractController::ActionNotFound',
10
- 'ActionController::MethodNotAllowed',
11
- 'ActionController::UnknownHttpMethod',
12
- 'ActionController::NotImplemented',
13
- 'ActionController::UnknownFormat',
14
- 'ActionController::InvalidAuthenticityToken',
15
- 'ActionController::InvalidCrossOriginRequest',
16
- # ActionDispatch::ParamsParser::ParseError was removed in Rails 6.0
17
- # and may be removed here once support for Rails 5.2 is dropped.
18
- # https://github.com/rails/rails/commit/e16c765ac6dcff068ff2e5554d69ff345c003de1
19
- # https://github.com/honeybadger-io/honeybadger-ruby/pull/358
20
- 'ActionDispatch::ParamsParser::ParseError',
21
- 'ActionDispatch::Http::Parameters::ParseError',
22
- 'ActionController::BadRequest',
23
- 'ActionController::ParameterMissing',
24
- 'ActiveRecord::RecordNotFound',
25
- 'ActionController::UnknownAction',
26
- 'ActionDispatch::Http::MimeNegotiation::InvalidType',
27
- 'Rack::QueryParser::ParameterTypeError',
28
- 'Rack::QueryParser::InvalidParameterError',
29
- 'CGI::Session::CookieStore::TamperedWithCookie',
30
- 'Mongoid::Errors::DocumentNotFound',
31
- 'Sinatra::NotFound',
32
- 'Sidekiq::JobRetry::Skip'].map(&:freeze).freeze
8
+ IGNORE_DEFAULT = ["ActionController::RoutingError",
9
+ "AbstractController::ActionNotFound",
10
+ "ActionController::MethodNotAllowed",
11
+ "ActionController::UnknownHttpMethod",
12
+ "ActionController::NotImplemented",
13
+ "ActionController::UnknownFormat",
14
+ "ActionController::InvalidAuthenticityToken",
15
+ "ActionController::InvalidCrossOriginRequest",
16
+ # ActionDispatch::ParamsParser::ParseError was removed in Rails 6.0
17
+ # and may be removed here once support for Rails 5.2 is dropped.
18
+ # https://github.com/rails/rails/commit/e16c765ac6dcff068ff2e5554d69ff345c003de1
19
+ # https://github.com/honeybadger-io/honeybadger-ruby/pull/358
20
+ "ActionDispatch::ParamsParser::ParseError",
21
+ "ActionDispatch::Http::Parameters::ParseError",
22
+ "ActionController::BadRequest",
23
+ "ActionController::ParameterMissing",
24
+ "ActiveRecord::RecordNotFound",
25
+ "ActionController::UnknownAction",
26
+ "ActionDispatch::Http::MimeNegotiation::InvalidType",
27
+ "Rack::QueryParser::ParameterTypeError",
28
+ "Rack::QueryParser::InvalidParameterError",
29
+ "CGI::Session::CookieStore::TamperedWithCookie",
30
+ "Mongoid::Errors::DocumentNotFound",
31
+ "Sinatra::NotFound",
32
+ "Sidekiq::JobRetry::Skip"].map(&:freeze).freeze
33
33
 
34
34
  IGNORE_EVENTS_DEFAULT = [
35
- { event_type: 'metric.hb', metric_name: 'duration.sql.active_record', query: /^(begin|commit)( immediate)?( transaction)?$/i },
36
- { event_type: 'sql.active_record', query: /^(begin|commit)( immediate)?( transaction)?$/i },
37
- { event_type: 'sql.active_record', query: /(solid_queue|good_job)/i },
38
- { event_type: 'sql.active_record', name: /^GoodJob/ },
39
- { event_type: 'process_action.action_controller', controller: 'Rails::HealthController' }
35
+ {event_type: "metric.hb", metric_name: "duration.sql.active_record", query: /^(begin|commit)( immediate)?( transaction)?$/i},
36
+ {event_type: "sql.active_record", query: /^(begin|commit)( immediate)?( transaction)?$/i},
37
+ {event_type: "sql.active_record", query: /(solid_queue|good_job)/i},
38
+ {event_type: "sql.active_record", name: /^GoodJob/},
39
+ {event_type: "process_action.action_controller", controller: "Rails::HealthController"}
40
40
  ].freeze
41
41
 
42
- DEVELOPMENT_ENVIRONMENTS = ['development', 'test', 'cucumber'].map(&:freeze).freeze
42
+ DEVELOPMENT_ENVIRONMENTS = ["development", "test", "cucumber"].map(&:freeze).freeze
43
43
 
44
- DEFAULT_PATHS = ['honeybadger.yml', 'config/honeybadger.yml', "#{ENV['HOME']}/honeybadger.yml"].map(&:freeze).freeze
44
+ DEFAULT_PATHS = ["honeybadger.yml", "config/honeybadger.yml", "#{ENV["HOME"]}/honeybadger.yml"].map(&:freeze).freeze
45
45
 
46
46
  OPTIONS = {
47
47
  api_key: {
48
- description: 'The API key for your Honeybadger project.',
48
+ description: "The API key for your Honeybadger project.",
49
49
  default: nil,
50
50
  type: String
51
51
  },
52
52
  env: {
53
- description: 'The current application\'s environment name.',
53
+ description: "The current application's environment name.",
54
54
  default: nil,
55
55
  type: String
56
56
  },
57
57
  report_data: {
58
- description: 'Enable/disable reporting of data. Defaults to true for non-development environments.',
58
+ description: "Enable/disable reporting of data. Defaults to true for non-development environments.",
59
59
  default: nil,
60
60
  type: Boolean
61
61
  },
62
62
  root: {
63
- description: 'The project\'s absolute root path.',
63
+ description: "The project's absolute root path.",
64
64
  default: Dir.pwd,
65
65
  type: String
66
66
  },
67
67
  revision: {
68
- description: 'The git revision of the project.',
68
+ description: "The git revision of the project.",
69
69
  default: nil,
70
70
  type: String
71
71
  },
72
72
  hostname: {
73
- description: 'The hostname of the current box.',
73
+ description: "The hostname of the current box.",
74
74
  default: Socket.gethostname,
75
75
  type: String
76
76
  },
77
77
  backend: {
78
- description: 'An alternate backend to use for reporting data.',
78
+ description: "An alternate backend to use for reporting data.",
79
79
  default: nil,
80
80
  type: String
81
81
  },
82
82
  debug: {
83
- description: 'Enables debug logging.',
83
+ description: "Enables debug logging.",
84
84
  default: false,
85
85
  type: Boolean
86
86
  },
87
87
  development_environments: {
88
- description: 'Environments which will not report data by default (use report_data to enable/disable explicitly).',
88
+ description: "Environments which will not report data by default (use report_data to enable/disable explicitly).",
89
89
  default: DEVELOPMENT_ENVIRONMENTS,
90
90
  type: Array
91
91
  },
92
- :'send_data_at_exit' => {
93
- description: 'Send remaining data when Ruby exits.',
92
+ send_data_at_exit: {
93
+ description: "Send remaining data when Ruby exits.",
94
94
  default: true,
95
95
  type: Boolean
96
96
  },
97
97
  max_queue_size: {
98
- description: 'Maximum number of items for each worker queue.',
98
+ description: "Maximum number of items for each worker queue.",
99
99
  default: 100,
100
100
  type: Integer
101
101
  },
102
- :'events.max_queue_size' => {
103
- description: 'Maximum number of event for the event worker queue.',
102
+ "events.max_queue_size": {
103
+ description: "Maximum number of event for the event worker queue.",
104
104
  default: 100000,
105
105
  type: Integer
106
106
  },
107
- :'events.batch_size' => {
108
- description: 'Send events batch if n events have accumulated',
107
+ "events.batch_size": {
108
+ description: "Send events batch if n events have accumulated",
109
109
  default: 1000,
110
110
  type: Integer
111
111
  },
112
- :'events.timeout' => {
113
- description: 'Timeout after which the events batch will be sent regardless (in milliseconds)',
112
+ "events.timeout": {
113
+ description: "Timeout after which the events batch will be sent regardless (in milliseconds)",
114
114
  default: 30_000,
115
115
  type: Integer
116
116
  },
117
- :'events.attach_hostname' => {
118
- description: 'Add the hostname to all event paylaods.',
117
+ "events.attach_hostname": {
118
+ description: "Add the hostname to all event paylaods.",
119
119
  default: true,
120
120
  type: Boolean
121
121
  },
122
- :'events.ignore' => {
123
- 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
+ "events.ignore": {
123
+ 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.",
124
124
  default: IGNORE_EVENTS_DEFAULT,
125
125
  type: Array
126
126
  },
127
- :'events.ignore_only' => {
128
- description: 'A list of events to ignore (overrides the default ignored events).',
127
+ "events.ignore_only": {
128
+ description: "A list of events to ignore (overrides the default ignored events).",
129
129
  default: nil,
130
130
  type: Array
131
131
  },
132
- :'events.sample_rate' => {
133
- description: 'Percentage of events to send to the API (0-100). A value of 0 means no events are sent, 100 means all events are sent.',
132
+ "events.sample_rate": {
133
+ description: "Percentage of events to send to the API (0-100). A value of 0 means no events are sent, 100 means all events are sent.",
134
134
  default: 100,
135
135
  type: Integer
136
136
  },
137
137
  plugins: {
138
- description: 'An optional list of plugins to load. Default is to load all plugins.',
138
+ description: "An optional list of plugins to load. Default is to load all plugins.",
139
139
  default: nil,
140
140
  type: Array
141
141
  },
142
142
  sync: {
143
- description: 'Enable all notices to be sent synchronously. Default is false.',
143
+ description: "Enable all notices to be sent synchronously. Default is false.",
144
144
  default: false,
145
145
  type: Boolean
146
146
  },
147
- :'skipped_plugins' => {
148
- description: 'An optional list of plugins to skip.',
147
+ skipped_plugins: {
148
+ description: "An optional list of plugins to skip.",
149
149
  default: nil,
150
150
  type: Array
151
151
  },
152
- :'config.path' => {
153
- description: 'The path (absolute, or relative from config.root) to the project\'s YAML configuration file.',
152
+ "config.path": {
153
+ description: "The path (absolute, or relative from config.root) to the project's YAML configuration file.",
154
154
  default: DEFAULT_PATHS,
155
155
  type: String
156
156
  },
157
- :'logging.path' => {
158
- description: 'The path (absolute, or relative from config.root) to the log file.',
157
+ "logging.path": {
158
+ description: "The path (absolute, or relative from config.root) to the log file.",
159
159
  default: nil,
160
160
  type: String
161
161
  },
162
- :'logging.level' => {
163
- description: 'The log level.',
164
- default: 'INFO',
162
+ "logging.level": {
163
+ description: "The log level.",
164
+ default: "INFO",
165
165
  type: String
166
166
  },
167
- :'logging.debug' => {
168
- description: 'Override debug logging.',
167
+ "logging.debug": {
168
+ description: "Override debug logging.",
169
169
  default: nil,
170
170
  type: Boolean
171
171
  },
172
- :'logging.tty_level' => {
173
- description: 'Level to log when attached to a terminal (anything < logging.level will always be ignored).',
174
- default: 'DEBUG',
172
+ "logging.tty_level": {
173
+ description: "Level to log when attached to a terminal (anything < logging.level will always be ignored).",
174
+ default: "DEBUG",
175
175
  type: String
176
176
  },
177
- :'connection.secure' => {
178
- description: 'Use SSL when sending data.',
177
+ "connection.secure": {
178
+ description: "Use SSL when sending data.",
179
179
  default: true,
180
180
  type: Boolean
181
181
  },
182
- :'connection.host' => {
183
- description: 'The host to use when sending data.',
184
- default: 'api.honeybadger.io'.freeze,
182
+ "connection.host": {
183
+ description: "The host to use when sending data.",
184
+ default: "api.honeybadger.io".freeze,
185
185
  type: String
186
186
  },
187
- :'connection.ui_host' => {
188
- description: 'The host to use when viewing data.',
189
- default: 'app.honeybadger.io'.freeze,
187
+ "connection.ui_host": {
188
+ description: "The host to use when viewing data.",
189
+ default: "app.honeybadger.io".freeze,
190
190
  type: String
191
191
  },
192
- :'connection.port' => {
193
- description: 'The port to use when sending data.',
192
+ "connection.port": {
193
+ description: "The port to use when sending data.",
194
194
  default: nil,
195
195
  type: Integer
196
196
  },
197
- :'connection.system_ssl_cert_chain' => {
198
- description: 'Use the system\'s SSL certificate chain (if available).',
197
+ "connection.system_ssl_cert_chain": {
198
+ description: "Use the system's SSL certificate chain (if available).",
199
199
  default: false,
200
200
  type: Boolean
201
201
  },
202
- :'connection.ssl_ca_bundle_path' => {
203
- description: 'Use this ca bundle when establishing secure connections.',
202
+ "connection.ssl_ca_bundle_path": {
203
+ description: "Use this ca bundle when establishing secure connections.",
204
204
  default: nil,
205
205
  type: String
206
206
  },
207
- :'connection.http_open_timeout' => {
208
- description: 'The HTTP open timeout when connecting to the server.',
207
+ "connection.http_open_timeout": {
208
+ description: "The HTTP open timeout when connecting to the server.",
209
209
  default: 2,
210
210
  type: Integer
211
211
  },
212
- :'connection.http_read_timeout' => {
213
- description: 'The HTTP read timeout when connecting to the server.',
212
+ "connection.http_read_timeout": {
213
+ description: "The HTTP read timeout when connecting to the server.",
214
214
  default: 5,
215
215
  type: Integer
216
216
  },
217
- :'connection.proxy_host' => {
218
- description: 'The proxy host to use when sending data.',
217
+ "connection.proxy_host": {
218
+ description: "The proxy host to use when sending data.",
219
219
  default: nil,
220
220
  type: String
221
221
  },
222
- :'connection.proxy_port' => {
223
- description: 'The proxy port to use when sending data.',
222
+ "connection.proxy_port": {
223
+ description: "The proxy port to use when sending data.",
224
224
  default: nil,
225
225
  type: Integer
226
226
  },
227
- :'connection.proxy_user' => {
228
- description: 'The proxy user to use when sending data.',
227
+ "connection.proxy_user": {
228
+ description: "The proxy user to use when sending data.",
229
229
  default: nil,
230
230
  type: String
231
231
  },
232
- :'connection.proxy_pass' => {
233
- description: 'The proxy password to use when sending data.',
232
+ "connection.proxy_pass": {
233
+ description: "The proxy password to use when sending data.",
234
234
  default: nil,
235
235
  type: String
236
236
  },
237
- :'request.filter_keys' => {
238
- description: 'A list of keys to filter when sending request data.',
239
- default: ['password'.freeze, 'password_confirmation'.freeze, 'HTTP_AUTHORIZATION'.freeze].freeze,
237
+ "request.filter_keys": {
238
+ description: "A list of keys to filter when sending request data.",
239
+ default: ["password".freeze, "password_confirmation".freeze, "HTTP_AUTHORIZATION".freeze].freeze,
240
240
  type: Array
241
241
  },
242
- :'request.disable_session' => {
243
- description: 'Prevent session from being sent with request data.',
242
+ "request.disable_session": {
243
+ description: "Prevent session from being sent with request data.",
244
244
  default: false,
245
245
  type: Boolean
246
246
  },
247
- :'request.disable_params' => {
248
- description: 'Prevent params from being sent with request data.',
247
+ "request.disable_params": {
248
+ description: "Prevent params from being sent with request data.",
249
249
  default: false,
250
250
  type: Boolean
251
251
  },
252
- :'request.disable_environment' => {
253
- description: 'Prevent Rack environment from being sent with request data.',
252
+ "request.disable_environment": {
253
+ description: "Prevent Rack environment from being sent with request data.",
254
254
  default: false,
255
255
  type: Boolean
256
256
  },
257
- :'request.disable_url' => {
258
- description: 'Prevent url from being sent with request data (Rack environment may still contain it in some cases).',
257
+ "request.disable_url": {
258
+ description: "Prevent url from being sent with request data (Rack environment may still contain it in some cases).",
259
259
  default: false,
260
260
  type: Boolean
261
261
  },
262
- :'user_informer.enabled' => {
263
- description: 'Enable the UserInformer middleware.',
262
+ "user_informer.enabled": {
263
+ description: "Enable the UserInformer middleware.",
264
264
  default: true,
265
265
  type: Boolean
266
266
  },
267
- :'user_informer.info' => {
268
- description: 'Replacement string for HTML comment in templates.',
269
- default: 'Honeybadger Error {{error_id}}'.freeze,
267
+ "user_informer.info": {
268
+ description: "Replacement string for HTML comment in templates.",
269
+ default: "Honeybadger Error {{error_id}}".freeze,
270
270
  type: String
271
271
  },
272
- :'feedback.enabled' => {
273
- description: 'Enable the UserFeedback middleware.',
272
+ "feedback.enabled": {
273
+ description: "Enable the UserFeedback middleware.",
274
274
  default: true,
275
275
  type: Boolean
276
276
  },
277
- :'exceptions.enabled' => {
278
- description: 'Enable automatic reporting of exceptions.',
277
+ "exceptions.enabled": {
278
+ description: "Enable automatic reporting of exceptions.",
279
279
  default: true,
280
280
  type: Boolean
281
281
  },
282
- :'exceptions.ignore' => {
283
- description: 'A list of additional exceptions to ignore (includes default ignored exceptions).',
282
+ "exceptions.ignore": {
283
+ description: "A list of additional exceptions to ignore (includes default ignored exceptions).",
284
284
  default: IGNORE_DEFAULT,
285
285
  type: Array
286
286
  },
287
- :'exceptions.ignore_only' => {
288
- description: 'A list of exceptions to ignore (overrides the default ignored exceptions).',
287
+ "exceptions.ignore_only": {
288
+ description: "A list of exceptions to ignore (overrides the default ignored exceptions).",
289
289
  default: nil,
290
290
  type: Array
291
291
  },
292
- :'exceptions.ignored_user_agents' => {
293
- description: 'A list of user agents to ignore.',
292
+ "exceptions.ignored_user_agents": {
293
+ description: "A list of user agents to ignore.",
294
294
  default: [].freeze,
295
295
  type: Array
296
296
  },
297
- :'exceptions.rescue_rake' => {
298
- description: 'Enable reporting exceptions in rake tasks.',
299
- default: !STDOUT.tty?,
297
+ "exceptions.rescue_rake": {
298
+ description: "Enable reporting exceptions in rake tasks.",
299
+ default: !$stdout.tty?,
300
300
  type: Boolean
301
301
  },
302
- :'exceptions.notify_at_exit' => {
303
- description: 'Report unhandled exception when Ruby crashes (at_exit).',
302
+ "exceptions.notify_at_exit": {
303
+ description: "Report unhandled exception when Ruby crashes (at_exit).",
304
304
  default: true,
305
305
  type: Boolean
306
306
  },
307
- :'exceptions.source_radius' => {
308
- description: 'The number of lines before and after the source when reporting snippets.',
307
+ "exceptions.source_radius": {
308
+ description: "The number of lines before and after the source when reporting snippets.",
309
309
  default: 2,
310
310
  type: Integer
311
311
  },
312
- :'exceptions.local_variables' => {
313
- description: 'Enable sending local variables. Requires binding_of_caller to be loaded.',
312
+ "exceptions.local_variables": {
313
+ description: "Enable sending local variables. Requires binding_of_caller to be loaded.",
314
314
  default: false,
315
315
  type: Boolean
316
316
  },
317
- :'exceptions.unwrap' => {
318
- description: 'Reports #original_exception or #cause one level up from rescued exception when available.',
317
+ "exceptions.unwrap": {
318
+ description: "Reports #original_exception or #cause one level up from rescued exception when available.",
319
319
  default: false,
320
320
  type: Boolean
321
321
  },
322
- :'active_job.attempt_threshold' => {
323
- description: 'The number of attempts before notifications will be sent.',
322
+ "active_job.attempt_threshold": {
323
+ description: "The number of attempts before notifications will be sent.",
324
324
  default: 0,
325
325
  type: Integer
326
326
  },
327
- :'delayed_job.attempt_threshold' => {
328
- description: 'The number of attempts before notifications will be sent.',
327
+ "delayed_job.attempt_threshold": {
328
+ description: "The number of attempts before notifications will be sent.",
329
329
  default: 0,
330
330
  type: Integer
331
331
  },
332
- :'sidekiq.attempt_threshold' => {
333
- description: 'The number of attempts before notifications will be sent.',
332
+ "sidekiq.attempt_threshold": {
333
+ description: "The number of attempts before notifications will be sent.",
334
334
  default: 0,
335
335
  type: Integer
336
336
  },
337
- :'shoryuken.attempt_threshold' => {
338
- description: 'The number of attempts before notifications will be sent.',
337
+ "shoryuken.attempt_threshold": {
338
+ description: "The number of attempts before notifications will be sent.",
339
339
  default: 0,
340
340
  type: Integer
341
341
  },
342
- :'faktory.attempt_threshold' => {
343
- description: 'The number of attempts before notifications will be sent.',
342
+ "faktory.attempt_threshold": {
343
+ description: "The number of attempts before notifications will be sent.",
344
344
  default: 0,
345
345
  type: Integer
346
346
  },
347
- :'sidekiq.use_component' => {
348
- description: 'Automatically set the component to the class of the job. Helps with grouping.',
347
+ "sidekiq.use_component": {
348
+ description: "Automatically set the component to the class of the job. Helps with grouping.",
349
349
  default: true,
350
350
  type: Boolean
351
351
  },
352
- :'sidekiq.insights.enabled' => {
353
- description: 'Enable automatic data collection for Sidekiq.',
352
+ "sidekiq.insights.enabled": {
353
+ description: "Enable automatic data collection for Sidekiq.",
354
354
  default: true,
355
355
  type: Boolean
356
356
  },
357
- :'sidekiq.insights.events' => {
358
- description: 'Enable automatic event capturing for Sidekiq.',
357
+ "sidekiq.insights.events": {
358
+ description: "Enable automatic event capturing for Sidekiq.",
359
359
  default: true,
360
360
  type: Boolean
361
361
  },
362
- :'sidekiq.insights.metrics' => {
363
- description: 'Enable automatic metric data collection for Sidekiq.',
362
+ "sidekiq.insights.metrics": {
363
+ description: "Enable automatic metric data collection for Sidekiq.",
364
364
  default: false,
365
365
  type: Boolean
366
366
  },
367
- :'sidekiq.insights.cluster_collection' => {
368
- description: 'Collect cluster based metrics for Sidekiq.',
367
+ "sidekiq.insights.cluster_collection": {
368
+ description: "Collect cluster based metrics for Sidekiq.",
369
369
  default: true,
370
370
  type: Boolean
371
371
  },
372
- :'sidekiq.insights.collection_interval' => {
373
- description: 'The frequency in which Sidekiq cluster metrics are sampled.',
372
+ "sidekiq.insights.collection_interval": {
373
+ description: "The frequency in which Sidekiq cluster metrics are sampled.",
374
374
  default: 5,
375
375
  type: Integer
376
376
  },
377
- :'solid_queue.insights.enabled' => {
378
- description: 'Enable automatic data collection for SolidQueue.',
377
+ "solid_queue.insights.enabled": {
378
+ description: "Enable automatic data collection for SolidQueue.",
379
379
  default: true,
380
380
  type: Boolean
381
381
  },
382
- :'solid_queue.insights.events' => {
383
- description: 'Enable automatic event capturing for SolidQueue.',
382
+ "solid_queue.insights.events": {
383
+ description: "Enable automatic event capturing for SolidQueue.",
384
384
  default: true,
385
385
  type: Boolean
386
386
  },
387
- :'solid_queue.insights.metrics' => {
388
- description: 'Enable automatic metric data collection for SolidQueue.',
387
+ "solid_queue.insights.metrics": {
388
+ description: "Enable automatic metric data collection for SolidQueue.",
389
389
  default: false,
390
390
  type: Boolean
391
391
  },
392
- :'solid_queue.insights.cluster_collection' => {
393
- description: 'Collect cluster based metrics for SolidQueue.',
392
+ "solid_queue.insights.cluster_collection": {
393
+ description: "Collect cluster based metrics for SolidQueue.",
394
394
  default: true,
395
395
  type: Boolean
396
396
  },
397
- :'solid_queue.insights.collection_interval' => {
398
- description: 'The frequency in which SolidQueue cluster metrics are sampled.',
397
+ "solid_queue.insights.collection_interval": {
398
+ description: "The frequency in which SolidQueue cluster metrics are sampled.",
399
399
  default: 5,
400
400
  type: Integer
401
401
  },
402
- :'rails.insights.enabled' => {
403
- description: 'Enable automatic data collection for Ruby on Rails.',
402
+ "rails.insights.enabled": {
403
+ description: "Enable automatic data collection for Ruby on Rails.",
404
404
  default: true,
405
405
  type: Boolean
406
406
  },
407
- :'rails.insights.events' => {
408
- description: 'Enable automatic event capturing for Ruby on Rails.',
407
+ "rails.insights.events": {
408
+ description: "Enable automatic event capturing for Ruby on Rails.",
409
409
  default: true,
410
410
  type: Boolean
411
411
  },
412
- :'rails.insights.metrics' => {
413
- description: 'Enable automatic metric data collection for Ruby on Rails.',
412
+ "rails.insights.metrics": {
413
+ description: "Enable automatic metric data collection for Ruby on Rails.",
414
414
  default: false,
415
415
  type: Boolean
416
416
  },
417
- :'karafka.insights.enabled' => {
418
- description: 'Enable automatic data collection for Karafka.',
417
+ "karafka.insights.enabled": {
418
+ description: "Enable automatic data collection for Karafka.",
419
419
  default: true,
420
420
  type: Boolean
421
421
  },
422
- :'karafka.insights.events' => {
423
- description: 'Enable automatic event capturing for Karafka.',
422
+ "karafka.insights.events": {
423
+ description: "Enable automatic event capturing for Karafka.",
424
424
  default: true,
425
425
  type: Boolean
426
426
  },
427
- :'karafka.insights.metrics' => {
428
- description: 'Enable automatic metric data collection for Karafka.',
427
+ "karafka.insights.metrics": {
428
+ description: "Enable automatic metric data collection for Karafka.",
429
429
  default: false,
430
430
  type: Boolean
431
431
  },
432
- :'net_http.insights.enabled' => {
433
- description: 'Allow automatic instrumentation of Net::HTTP requests.',
432
+ "net_http.insights.enabled": {
433
+ description: "Allow automatic instrumentation of Net::HTTP requests.",
434
434
  default: true,
435
435
  type: Boolean
436
436
  },
437
- :'net_http.insights.events' => {
438
- description: 'Enable automatic event capturing for Net::HTTP requests.',
437
+ "net_http.insights.events": {
438
+ description: "Enable automatic event capturing for Net::HTTP requests.",
439
439
  default: true,
440
440
  type: Boolean
441
441
  },
442
- :'net_http.insights.metrics' => {
443
- description: 'Enable automatic metric data collection for Net::HTTP requests.',
442
+ "net_http.insights.metrics": {
443
+ description: "Enable automatic metric data collection for Net::HTTP requests.",
444
444
  default: false,
445
445
  type: Boolean
446
446
  },
447
- :'net_http.insights.full_url' => {
448
- description: 'Record the full request url during instrumentation.',
447
+ "net_http.insights.full_url": {
448
+ description: "Record the full request url during instrumentation.",
449
449
  default: false,
450
450
  type: Boolean
451
451
  },
452
- :'sinatra.enabled' => {
453
- description: 'Enable Sinatra auto-initialization.',
452
+ "sinatra.enabled": {
453
+ description: "Enable Sinatra auto-initialization.",
454
454
  default: true,
455
455
  type: Boolean
456
456
  },
457
- :'rails.subscriber_ignore_sources' => {
457
+ "rails.subscriber_ignore_sources": {
458
458
  description: "Sources (strings or regexes) that should be ignored when using the Rails' (7+) native error reporter (handled exceptions only).",
459
459
  # External libraries (eg Sidekiq, Resque) may wrap their execution in Rails' executor.
460
460
  # But this means errors will first be reported by Rails.error, before the library's native error handler
461
461
  # We ignore these reports, since the native error handler provides more context (such as job details)
462
- default: ['application.active_support'],
462
+ default: ["application.active_support"],
463
463
  type: Array
464
464
  },
465
- :'resque.resque_retry.send_exceptions_when_retrying' => {
466
- description: 'Send exceptions when retrying job.',
465
+ "resque.resque_retry.send_exceptions_when_retrying": {
466
+ description: "Send exceptions when retrying job.",
467
467
  default: true,
468
468
  type: Boolean
469
469
  },
470
- :'breadcrumbs.enabled' => {
471
- description: 'Disable breadcrumb functionality.',
470
+ "breadcrumbs.enabled": {
471
+ description: "Disable breadcrumb functionality.",
472
472
  default: true,
473
473
  type: Boolean
474
474
  },
475
- :'breadcrumbs.active_support_notifications' => {
476
- description: 'Configuration for automatic Active Support Instrumentation events.',
475
+ "breadcrumbs.active_support_notifications": {
476
+ description: "Configuration for automatic Active Support Instrumentation events.",
477
477
  default: Breadcrumbs::ActiveSupport.default_notifications,
478
478
  type: Hash
479
479
  },
480
- :'breadcrumbs.logging.enabled' => {
481
- description: 'Enable/Disable automatic breadcrumbs from log messages.',
480
+ "breadcrumbs.logging.enabled": {
481
+ description: "Enable/Disable automatic breadcrumbs from log messages.",
482
482
  default: true,
483
483
  type: Boolean
484
484
  },
485
- :'insights.enabled' => {
485
+ "insights.enabled": {
486
486
  description: "Enable/Disable Honeybadger Insights built-in instrumentation.",
487
- default: false,
487
+ default: true,
488
488
  type: Boolean
489
489
  },
490
- :'insights.console.enabled' => {
490
+ "insights.console.enabled": {
491
491
  description: "Enable/Disable Honeybadger Insights built-in instrumentation in a Rails console.",
492
492
  default: false,
493
493
  type: Boolean
494
494
  },
495
- :'insights.registry_flush_interval' => {
495
+ "insights.registry_flush_interval": {
496
496
  description: "Number of seconds between registry flushes.",
497
497
  default: 60,
498
498
  type: Integer
499
499
  },
500
- :'puma.insights.events' => {
501
- description: 'Enable automatic event capturing for Puma stats.',
500
+ "puma.insights.events": {
501
+ description: "Enable automatic event capturing for Puma stats.",
502
502
  default: true,
503
503
  type: Boolean
504
504
  },
505
- :'puma.insights.metrics' => {
506
- description: 'Enable automatic metric data aggregation for Puma stats.',
505
+ "puma.insights.metrics": {
506
+ description: "Enable automatic metric data aggregation for Puma stats.",
507
507
  default: false,
508
508
  type: Boolean
509
509
  },
510
- :'puma.insights.collection_interval' => {
511
- description: 'The frequency in which the Honeybadger gem will collect Puma stats.',
510
+ "puma.insights.collection_interval": {
511
+ description: "The frequency in which the Honeybadger gem will collect Puma stats.",
512
512
  default: 1,
513
513
  type: Integer
514
514
  },
515
- :'autotuner.insights.events' => {
516
- description: 'Enable automatic event capturing for Autotuner stats.',
515
+ "autotuner.insights.events": {
516
+ description: "Enable automatic event capturing for Autotuner stats.",
517
517
  default: true,
518
518
  type: Boolean
519
519
  },
520
- :'autotuner.insights.metrics' => {
521
- description: 'Enable automatic metric data aggregation for Autotuner stats.',
520
+ "autotuner.insights.metrics": {
521
+ description: "Enable automatic metric data aggregation for Autotuner stats.",
522
522
  default: false,
523
523
  type: Boolean
524
524
  }
525
525
  }.freeze
526
526
 
527
- DEFAULTS = Hash[OPTIONS.map{|k,v| [k, v[:default]] }].freeze
527
+ DEFAULTS = OPTIONS.map { |k, v| [k, v[:default]] }.to_h.freeze
528
528
  end
529
529
  end