rollbar 2.8.3 → 3.6.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.
Files changed (238) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +18 -0
  3. data/.github/pull_request_template.md +34 -0
  4. data/.github/workflows/ci.yml +67 -0
  5. data/.gitignore +3 -1
  6. data/.rubocop.yml +206 -7
  7. data/Appraisals +10 -10
  8. data/CHANGELOG.md +257 -3
  9. data/Gemfile +74 -13
  10. data/README.md +38 -833
  11. data/Rakefile +0 -0
  12. data/THANKS.md +1 -0
  13. data/data/rollbar.snippet.js +1 -1
  14. data/docs/configuration.md +64 -3
  15. data/docs/plugins.md +46 -0
  16. data/gemfiles/rails50.gemfile +56 -0
  17. data/gemfiles/rails51.gemfile +57 -0
  18. data/gemfiles/rails52.gemfile +56 -0
  19. data/gemfiles/rails60.gemfile +52 -0
  20. data/gemfiles/rails61.gemfile +52 -0
  21. data/gemfiles/rails70.gemfile +52 -0
  22. data/gemfiles/rails71.gemfile +52 -0
  23. data/lib/generators/rollbar/rollbar_generator.rb +24 -20
  24. data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +19 -5
  25. data/lib/rails/rollbar_runner.rb +26 -22
  26. data/lib/rollbar/capistrano.rb +78 -38
  27. data/lib/rollbar/capistrano3.rb +62 -1
  28. data/lib/rollbar/capistrano_tasks.rb +166 -0
  29. data/lib/rollbar/configuration.rb +291 -71
  30. data/lib/rollbar/delay/active_job.rb +17 -0
  31. data/lib/rollbar/delay/delayed_job.rb +23 -0
  32. data/lib/rollbar/delay/girl_friday.rb +4 -9
  33. data/lib/rollbar/delay/resque.rb +3 -6
  34. data/lib/rollbar/delay/shoryuken.rb +36 -0
  35. data/lib/rollbar/delay/sidekiq.rb +6 -8
  36. data/lib/rollbar/delay/sucker_punch.rb +17 -22
  37. data/lib/rollbar/delay/thread.rb +74 -3
  38. data/lib/rollbar/deploy.rb +91 -0
  39. data/lib/rollbar/encoding/encoder.rb +22 -11
  40. data/lib/rollbar/encoding.rb +2 -7
  41. data/lib/rollbar/exception_reporter.rb +36 -12
  42. data/lib/rollbar/item/backtrace.rb +118 -0
  43. data/lib/rollbar/item/frame.rb +121 -0
  44. data/lib/rollbar/item/locals.rb +103 -0
  45. data/lib/rollbar/item.rb +314 -0
  46. data/lib/rollbar/js.rb +0 -28
  47. data/lib/rollbar/json.rb +7 -55
  48. data/lib/rollbar/language_support.rb +7 -19
  49. data/lib/rollbar/lazy_store.rb +8 -12
  50. data/lib/rollbar/logger.rb +71 -0
  51. data/lib/rollbar/logger_proxy.rb +18 -1
  52. data/lib/rollbar/middleware/js/json_value.rb +36 -0
  53. data/lib/rollbar/middleware/js.rb +297 -0
  54. data/lib/rollbar/middleware/rack/builder.rb +4 -4
  55. data/lib/rollbar/middleware/rack/test_session.rb +4 -4
  56. data/lib/rollbar/middleware/rack.rb +52 -0
  57. data/lib/rollbar/middleware/rails/rollbar.rb +19 -7
  58. data/lib/rollbar/middleware/rails/show_exceptions.rb +21 -9
  59. data/lib/rollbar/middleware/sinatra.rb +2 -40
  60. data/lib/rollbar/notifier/trace_with_bindings.rb +75 -0
  61. data/lib/rollbar/notifier.rb +913 -0
  62. data/lib/rollbar/plugin.rb +126 -0
  63. data/lib/rollbar/plugins/active_job.rb +54 -0
  64. data/lib/rollbar/plugins/basic_socket.rb +31 -0
  65. data/lib/rollbar/plugins/delayed_job/job_data.rb +50 -0
  66. data/lib/rollbar/plugins/delayed_job/plugin.rb +88 -0
  67. data/lib/rollbar/plugins/delayed_job.rb +12 -0
  68. data/lib/rollbar/plugins/error_context.rb +11 -0
  69. data/lib/rollbar/plugins/goalie.rb +65 -0
  70. data/lib/rollbar/plugins/rack.rb +18 -0
  71. data/lib/rollbar/plugins/rails/controller_methods.rb +56 -0
  72. data/lib/rollbar/plugins/rails/error_subscriber.rb +12 -0
  73. data/lib/rollbar/plugins/rails/railtie30.rb +18 -0
  74. data/lib/rollbar/plugins/rails/railtie32.rb +18 -0
  75. data/lib/rollbar/plugins/rails/railtie_mixin.rb +37 -0
  76. data/lib/rollbar/plugins/rails.rb +89 -0
  77. data/lib/rollbar/plugins/rake.rb +73 -0
  78. data/lib/rollbar/plugins/resque/failure.rb +39 -0
  79. data/lib/rollbar/plugins/resque.rb +11 -0
  80. data/lib/rollbar/plugins/sidekiq/plugin.rb +77 -0
  81. data/lib/rollbar/plugins/sidekiq.rb +37 -0
  82. data/lib/rollbar/plugins/thread.rb +14 -0
  83. data/lib/rollbar/plugins/validations.rb +45 -0
  84. data/lib/rollbar/plugins.rb +47 -0
  85. data/lib/rollbar/rails.rb +0 -1
  86. data/lib/rollbar/rake_tasks.rb +4 -66
  87. data/lib/rollbar/request_data_extractor.rb +157 -117
  88. data/lib/rollbar/rollbar_test.rb +38 -0
  89. data/lib/rollbar/scrubbers/params.rb +133 -0
  90. data/lib/rollbar/scrubbers/url.rb +90 -35
  91. data/lib/rollbar/scrubbers.rb +13 -0
  92. data/lib/rollbar/truncation/frames_strategy.rb +2 -1
  93. data/lib/rollbar/truncation/min_body_strategy.rb +3 -4
  94. data/lib/rollbar/truncation/mixin.rb +1 -1
  95. data/lib/rollbar/truncation/remove_any_key_strategy.rb +126 -0
  96. data/lib/rollbar/truncation/remove_extra_strategy.rb +37 -0
  97. data/lib/rollbar/truncation/remove_request_strategy.rb +21 -0
  98. data/lib/rollbar/truncation/strings_strategy.rb +6 -5
  99. data/lib/rollbar/truncation.rb +10 -4
  100. data/lib/rollbar/util/hash.rb +37 -6
  101. data/lib/rollbar/util/ip_anonymizer.rb +33 -0
  102. data/lib/rollbar/util/ip_obfuscator.rb +1 -1
  103. data/lib/rollbar/util.rb +101 -55
  104. data/lib/rollbar/version.rb +1 -1
  105. data/lib/rollbar.rb +91 -879
  106. data/lib/tasks/benchmark.rake +104 -0
  107. data/lib/tasks/tasks.rake +3 -3
  108. data/rollbar.gemspec +21 -32
  109. data/spec/support/rollbar_api.rb +67 -0
  110. metadata +78 -439
  111. data/.travis.yml +0 -155
  112. data/gemfiles/rails30.gemfile +0 -20
  113. data/gemfiles/rails31.gemfile +0 -16
  114. data/gemfiles/rails32.gemfile +0 -17
  115. data/gemfiles/rails40.gemfile +0 -17
  116. data/gemfiles/rails41.gemfile +0 -15
  117. data/gemfiles/rails42.gemfile +0 -15
  118. data/lib/rollbar/active_job.rb +0 -11
  119. data/lib/rollbar/active_record_extension.rb +0 -14
  120. data/lib/rollbar/core_ext/basic_socket.rb +0 -7
  121. data/lib/rollbar/core_ext/thread.rb +0 -9
  122. data/lib/rollbar/delayed_job.rb +0 -78
  123. data/lib/rollbar/encoding/legacy_encoder.rb +0 -20
  124. data/lib/rollbar/goalie.rb +0 -33
  125. data/lib/rollbar/js/frameworks/rails.rb +0 -29
  126. data/lib/rollbar/js/frameworks.rb +0 -6
  127. data/lib/rollbar/js/middleware.rb +0 -129
  128. data/lib/rollbar/js/version.rb +0 -5
  129. data/lib/rollbar/json/default.rb +0 -11
  130. data/lib/rollbar/json/oj.rb +0 -15
  131. data/lib/rollbar/rack.rb +0 -9
  132. data/lib/rollbar/rails/controller_methods.rb +0 -40
  133. data/lib/rollbar/railtie.rb +0 -46
  134. data/lib/rollbar/rake.rb +0 -38
  135. data/lib/rollbar/sidekiq.rb +0 -40
  136. data/lib/rollbar/tasks/rollbar.cap +0 -45
  137. data/spec/cacert.pem +0 -3988
  138. data/spec/controllers/home_controller_spec.rb +0 -455
  139. data/spec/delay/sidekiq_spec.rb +0 -61
  140. data/spec/delay/sucker_punch_spec.rb +0 -25
  141. data/spec/delayed/backend/test.rb +0 -139
  142. data/spec/delayed/serialization/test.rb +0 -0
  143. data/spec/dummyapp/.gitignore +0 -73
  144. data/spec/dummyapp/Rakefile +0 -7
  145. data/spec/dummyapp/app/assets/javascripts/application.js +0 -3
  146. data/spec/dummyapp/app/assets/stylesheets/application.css.scss +0 -37
  147. data/spec/dummyapp/app/controllers/application_controller.rb +0 -3
  148. data/spec/dummyapp/app/controllers/home_controller.rb +0 -60
  149. data/spec/dummyapp/app/controllers/users_controller.rb +0 -17
  150. data/spec/dummyapp/app/helpers/.gitkeep +0 -0
  151. data/spec/dummyapp/app/mailers/.gitkeep +0 -0
  152. data/spec/dummyapp/app/models/.gitkeep +0 -0
  153. data/spec/dummyapp/app/models/user.rb +0 -7
  154. data/spec/dummyapp/app/views/devise/registrations/edit.html.erb +0 -27
  155. data/spec/dummyapp/app/views/devise/registrations/new.html.erb +0 -20
  156. data/spec/dummyapp/app/views/devise/shared/_links.html.erb +0 -25
  157. data/spec/dummyapp/app/views/home/cause_exception.html.erb +0 -1
  158. data/spec/dummyapp/app/views/home/index.html.erb +0 -4
  159. data/spec/dummyapp/app/views/home/report_exception.html.erb +0 -1
  160. data/spec/dummyapp/app/views/js/test.html.erb +0 -1
  161. data/spec/dummyapp/app/views/layouts/_messages.html.erb +0 -5
  162. data/spec/dummyapp/app/views/layouts/_navigation.html.erb +0 -21
  163. data/spec/dummyapp/app/views/layouts/application.html.erb +0 -25
  164. data/spec/dummyapp/app/views/layouts/simple.html.erb +0 -18
  165. data/spec/dummyapp/app/views/users/index.html.erb +0 -8
  166. data/spec/dummyapp/app/views/users/show.html.erb +0 -3
  167. data/spec/dummyapp/config/application.rb +0 -59
  168. data/spec/dummyapp/config/boot.rb +0 -10
  169. data/spec/dummyapp/config/database.yml +0 -25
  170. data/spec/dummyapp/config/environment.rb +0 -5
  171. data/spec/dummyapp/config/environments/development.rb +0 -37
  172. data/spec/dummyapp/config/environments/production.rb +0 -67
  173. data/spec/dummyapp/config/environments/test.rb +0 -37
  174. data/spec/dummyapp/config/initializers/backtrace_silencers.rb +0 -7
  175. data/spec/dummyapp/config/initializers/inflections.rb +0 -15
  176. data/spec/dummyapp/config/initializers/mime_types.rb +0 -5
  177. data/spec/dummyapp/config/initializers/rollbar.rb +0 -23
  178. data/spec/dummyapp/config/initializers/secret_token.rb +0 -7
  179. data/spec/dummyapp/config/initializers/session_store.rb +0 -8
  180. data/spec/dummyapp/config/initializers/wrap_parameters.rb +0 -16
  181. data/spec/dummyapp/config/locales/devise.en.yml +0 -58
  182. data/spec/dummyapp/config/locales/en.yml +0 -5
  183. data/spec/dummyapp/config/routes.rb +0 -17
  184. data/spec/dummyapp/config.ru +0 -4
  185. data/spec/dummyapp/db/migrate/20121121184652_devise_create_users.rb +0 -46
  186. data/spec/dummyapp/db/migrate/20121121184654_add_name_to_users.rb +0 -5
  187. data/spec/dummyapp/db/schema.rb +0 -35
  188. data/spec/dummyapp/db/seeds.rb +0 -12
  189. data/spec/dummyapp/lib/assets/.gitkeep +0 -0
  190. data/spec/dummyapp/public/404.html +0 -26
  191. data/spec/dummyapp/public/422.html +0 -26
  192. data/spec/dummyapp/public/500.html +0 -25
  193. data/spec/dummyapp/public/favicon.ico +0 -0
  194. data/spec/dummyapp/script/rails +0 -6
  195. data/spec/fixtures/file1 +0 -1
  196. data/spec/fixtures/file2 +0 -1
  197. data/spec/fixtures/payloads/message.json +0 -25
  198. data/spec/fixtures/payloads/sample.trace.json +0 -275
  199. data/spec/fixtures/payloads/sample.trace_chain.json +0 -530
  200. data/spec/generators/rollbar/rollbar_generator_spec.rb +0 -24
  201. data/spec/requests/home_spec.rb +0 -49
  202. data/spec/rollbar/active_job_spec.rb +0 -33
  203. data/spec/rollbar/configuration_spec.rb +0 -24
  204. data/spec/rollbar/delay/girl_friday_spec.rb +0 -41
  205. data/spec/rollbar/delay/resque_spec.rb +0 -37
  206. data/spec/rollbar/delay/thread_spec.rb +0 -27
  207. data/spec/rollbar/delayed_job/job_data.rb +0 -35
  208. data/spec/rollbar/delayed_job_spec.rb +0 -90
  209. data/spec/rollbar/encoding/encoder_spec.rb +0 -63
  210. data/spec/rollbar/js/frameworks/rails_spec.rb +0 -19
  211. data/spec/rollbar/js/middleware_spec.rb +0 -162
  212. data/spec/rollbar/json/oj_spec.rb +0 -18
  213. data/spec/rollbar/json_spec.rb +0 -110
  214. data/spec/rollbar/lazy_store_spec.rb +0 -99
  215. data/spec/rollbar/logger_proxy_spec.rb +0 -34
  216. data/spec/rollbar/middleware/rack/builder_spec.rb +0 -151
  217. data/spec/rollbar/middleware/sinatra_spec.rb +0 -197
  218. data/spec/rollbar/rake_spec.rb +0 -34
  219. data/spec/rollbar/request_data_extractor_spec.rb +0 -82
  220. data/spec/rollbar/scrubbers/url_spec.rb +0 -111
  221. data/spec/rollbar/sidekiq_spec.rb +0 -90
  222. data/spec/rollbar/truncation/frames_strategy_spec.rb +0 -70
  223. data/spec/rollbar/truncation/min_body_strategy_spec.rb +0 -57
  224. data/spec/rollbar/truncation/strings_strategy_spec.rb +0 -89
  225. data/spec/rollbar/truncation_spec.rb +0 -27
  226. data/spec/rollbar/util/hash_spec.rb +0 -22
  227. data/spec/rollbar/util_spec.rb +0 -19
  228. data/spec/rollbar_bc_spec.rb +0 -380
  229. data/spec/rollbar_spec.rb +0 -2067
  230. data/spec/spec_helper.rb +0 -49
  231. data/spec/support/cause_exception.rb +0 -1
  232. data/spec/support/encoding_helpers.rb +0 -8
  233. data/spec/support/encodings/iso_8859_9 +0 -1
  234. data/spec/support/fixture_helpers.rb +0 -10
  235. data/spec/support/get_ip_raising.rb +0 -7
  236. data/spec/support/helpers.rb +0 -5
  237. data/spec/support/notifier_helpers.rb +0 -36
  238. data/spec/support/shared_contexts.rb +0 -12
@@ -2,74 +2,114 @@ require 'logger'
2
2
 
3
3
  module Rollbar
4
4
  class Configuration
5
+ SEND_EXTRA_FRAME_DATA_OPTIONS = [:none, :app, :all].freeze
5
6
 
6
- attr_accessor :access_token
7
- attr_accessor :async_handler
8
- attr_accessor :branch
9
- attr_accessor :before_process
10
- attr_accessor :code_version
11
- attr_accessor :custom_data_method
12
- attr_accessor :delayed_job_enabled
13
- attr_accessor :default_logger
14
- attr_accessor :disable_monkey_patch
15
- attr_accessor :disable_rack_monkey_patch
16
- attr_accessor :disable_core_monkey_patch
17
- attr_accessor :dj_threshold
18
- attr_accessor :enabled
19
- attr_accessor :endpoint
20
- attr_accessor :environment
21
- attr_accessor :exception_level_filters
22
- attr_accessor :failover_handlers
23
- attr_accessor :filepath
24
- attr_accessor :framework
25
- attr_accessor :ignored_person_ids
26
- attr_accessor :logger
27
- attr_accessor :payload_options
28
- attr_accessor :person_method
29
- attr_accessor :person_id_method
30
- attr_accessor :person_username_method
31
- attr_accessor :person_email_method
32
- attr_accessor :populate_empty_backtraces
33
- attr_accessor :report_dj_data
34
- attr_accessor :request_timeout
35
- attr_accessor :root
36
- attr_accessor :js_options
37
- attr_accessor :js_enabled
38
- attr_accessor :safely
39
- attr_accessor :scrub_fields
40
- attr_accessor :scrub_user
41
- attr_accessor :scrub_password
42
- attr_accessor :user_ip_obfuscator_secret
43
- attr_accessor :randomize_scrub_length
44
- attr_accessor :uncaught_exception_level
45
- attr_accessor :scrub_headers
46
- attr_accessor :sidekiq_threshold
47
- attr_accessor :transform
48
- attr_accessor :verify_ssl_peer
49
- attr_accessor :use_async
50
- attr_accessor :use_eventmachine
51
- attr_accessor :web_base
52
- attr_accessor :write_to_file
53
-
54
- attr_reader :project_gem_paths
55
-
56
- alias_method :safely?, :safely
57
-
58
- DEFAULT_ENDPOINT = 'https://api.rollbar.com/api/1/item/'
59
- DEFAULT_WEB_BASE = 'https://rollbar.com'
7
+ attr_accessor :access_token,
8
+ :anonymize_user_ip,
9
+ :async_handler,
10
+ :async_json_payload,
11
+ :async_skip_report_handler,
12
+ :backtrace_cleaner,
13
+ :branch,
14
+ :capture_uncaught,
15
+ :code_version,
16
+ :collect_user_ip,
17
+ :configured_options,
18
+ :custom_data_method,
19
+ :default_logger,
20
+ :delayed_job_enabled,
21
+ :disable_action_mailer_monkey_patch,
22
+ :disable_core_monkey_patch,
23
+ :disable_monkey_patch,
24
+ :disable_rack_monkey_patch,
25
+ :dj_threshold,
26
+ :dj_use_scoped_block,
27
+ :enable_error_context,
28
+ :enabled,
29
+ :endpoint,
30
+ :environment,
31
+ :exception_level_filters,
32
+ :failover_handlers,
33
+ :filepath,
34
+ :files_processed_duration,
35
+ :files_processed_enabled,
36
+ :files_processed_size,
37
+ :files_with_pid_name_enabled,
38
+ :framework,
39
+ :ignore_internal_errors,
40
+ :ignored_person_ids,
41
+ :js_enabled,
42
+ :js_options,
43
+ :host,
44
+ :locals,
45
+ :log_payload,
46
+ :net_retries,
47
+ :open_timeout,
48
+ :payload_options,
49
+ :person_email_method,
50
+ :person_id_method,
51
+ :person_method,
52
+ :person_username_method,
53
+ :populate_empty_backtraces,
54
+ :proxy,
55
+ :raise_on_error,
56
+ :randomize_scrub_length,
57
+ :report_dj_data,
58
+ :request_timeout,
59
+ :root,
60
+ :safely,
61
+ :scrub_fields,
62
+ :scrub_password,
63
+ :scrub_user,
64
+ :scrub_whitelist,
65
+ :transmit,
66
+ :uncaught_exception_level,
67
+ :user_ip_obfuscator_secret,
68
+ :user_ip_rack_env_key,
69
+ :scrub_headers,
70
+ :sidekiq_threshold,
71
+ :sidekiq_use_scoped_block,
72
+ :use_async,
73
+ :use_exception_level_filters_default,
74
+ :use_payload_access_token,
75
+ :verify_ssl_peer,
76
+ :web_base,
77
+ :write_to_file
78
+ attr_reader :before_process,
79
+ :enable_rails_error_subscriber,
80
+ :logger_level,
81
+ :project_gem_paths,
82
+ :send_extra_frame_data,
83
+ :transform,
84
+ :use_eventmachine
85
+ attr_writer :logger # seconds # bytes
86
+
87
+ alias safely? safely
88
+
89
+ DEFAULT_ENDPOINT = 'https://api.rollbar.com/api/1/item/'.freeze
90
+ DEFAULT_WEB_BASE = 'https://rollbar.com'.freeze
60
91
 
61
92
  def initialize
93
+ @access_token = nil
62
94
  @async_handler = nil
63
95
  @before_process = []
96
+ @branch = nil
97
+ @capture_uncaught = nil
64
98
  @code_version = nil
65
99
  @custom_data_method = nil
66
- @default_logger = lambda { Logger.new(STDERR) }
100
+ @default_logger = lambda { ::Logger.new($stderr) }
101
+ @logger_level = :info
67
102
  @delayed_job_enabled = true
68
103
  @disable_monkey_patch = false
104
+ @disable_action_mailer_monkey_patch = false
69
105
  @disable_core_monkey_patch = false
70
106
  @disable_rack_monkey_patch = false
107
+ @enable_error_context = true
108
+ @enable_rails_error_subscriber = false
71
109
  @dj_threshold = 0
72
- @enabled = nil # set to true when configure is called
110
+ @dj_use_scoped_block = false
111
+ @async_skip_report_handler = nil
112
+ @enabled = nil # set to true when configure is called
73
113
  @endpoint = DEFAULT_ENDPOINT
74
114
  @environment = nil
75
115
  @exception_level_filters = {
@@ -79,34 +119,72 @@ module Rollbar
79
119
  }
80
120
  @failover_handlers = []
81
121
  @framework = 'Plain'
122
+ @ignore_internal_errors = [
123
+ 'Net::ReadTimeout',
124
+ 'Net::OpenTimeout',
125
+ 'SocketError'
126
+ ]
82
127
  @ignored_person_ids = []
128
+ @host = nil
83
129
  @payload_options = {}
84
130
  @person_method = 'current_user'
85
131
  @person_id_method = 'id'
86
- @person_username_method = 'username'
87
- @person_email_method = 'email'
132
+ @person_username_method = nil
133
+ @person_email_method = nil
88
134
  @project_gems = []
89
135
  @populate_empty_backtraces = false
90
136
  @report_dj_data = true
137
+ @open_timeout = 3
91
138
  @request_timeout = 3
139
+ @net_retries = 3
140
+ @root = nil
92
141
  @js_enabled = false
93
142
  @js_options = {}
143
+ @locals = {}
94
144
  @scrub_fields = [:passwd, :password, :password_confirmation, :secret,
95
145
  :confirm_password, :password_confirmation, :secret_token,
96
- :api_key, :access_token ]
146
+ :api_key, :access_token, :accessToken, :session_id]
97
147
  @scrub_user = true
98
148
  @scrub_password = true
99
- @randomize_scrub_length = true
149
+ @randomize_scrub_length = false
150
+ @scrub_whitelist = []
100
151
  @uncaught_exception_level = 'error'
101
152
  @scrub_headers = ['Authorization']
102
153
  @sidekiq_threshold = 0
154
+ @sidekiq_use_scoped_block = false
103
155
  @safely = false
104
156
  @transform = []
105
157
  @use_async = false
158
+ @async_json_payload = false
106
159
  @use_eventmachine = false
107
160
  @verify_ssl_peer = true
108
161
  @web_base = DEFAULT_WEB_BASE
162
+ @send_extra_frame_data = :none
163
+ @project_gem_paths = []
164
+ @use_exception_level_filters_default = false
165
+ @proxy = nil
166
+ @raise_on_error = false
167
+ @transmit = true
168
+ @log_payload = false
169
+ @collect_user_ip = true
170
+ @anonymize_user_ip = false
171
+ @user_ip_obfuscator_secret = nil
172
+ @user_ip_rack_env_key = nil
173
+ @backtrace_cleaner = nil
174
+ @hooks = {
175
+ :on_error_response => nil, # params: response
176
+ :on_report_internal_error => nil # params: exception
177
+ }
178
+
109
179
  @write_to_file = false
180
+ @filepath = nil
181
+ @files_with_pid_name_enabled = false
182
+ @files_processed_enabled = false
183
+ @files_processed_duration = 60
184
+ @files_processed_size = 5 * 1000 * 1000
185
+ @use_payload_access_token = false
186
+
187
+ @configured_options = ConfiguredOptions.new(self)
110
188
  end
111
189
 
112
190
  def initialize_copy(orig)
@@ -114,10 +192,56 @@ module Rollbar
114
192
 
115
193
  instance_variables.each do |var|
116
194
  instance_var = instance_variable_get(var)
117
- instance_variable_set(var, Rollbar::Util::deep_copy(instance_var))
195
+ instance_variable_set(var, Rollbar::Util.deep_copy(instance_var))
118
196
  end
119
197
  end
120
198
 
199
+ def wrapped_clone
200
+ original_clone.tap do |new_config|
201
+ new_config.configured_options = ConfiguredOptions.new(new_config)
202
+ new_config.configured_options.configured = configured_options.configured
203
+ end
204
+ end
205
+ alias original_clone clone
206
+ alias clone wrapped_clone
207
+
208
+ def merge(options)
209
+ new_configuration = clone
210
+ new_configuration.merge!(options)
211
+
212
+ new_configuration
213
+ end
214
+
215
+ def merge!(options)
216
+ options.each do |name, value|
217
+ variable_name = "@#{name}"
218
+ next unless instance_variable_defined?(variable_name)
219
+
220
+ instance_variable_set(variable_name, value)
221
+ end
222
+
223
+ self
224
+ end
225
+
226
+ def use_active_job(options = {})
227
+ require 'rollbar/delay/active_job'
228
+
229
+ Rollbar::Delay::ActiveJob.queue_as(options[:queue] ||
230
+ Rollbar::Delay::ActiveJob.default_queue_name)
231
+
232
+ @use_async = true
233
+ @async_handler = Rollbar::Delay::ActiveJob
234
+ end
235
+
236
+ def use_delayed_job(options = {})
237
+ require 'rollbar/delay/delayed_job'
238
+
239
+ Rollbar::Delay::DelayedJob.queue = options[:queue] if options[:queue]
240
+
241
+ @use_async = true
242
+ @async_handler = Rollbar::Delay::DelayedJob
243
+ end
244
+
121
245
  def use_sidekiq(options = {})
122
246
  require 'rollbar/delay/sidekiq' if defined?(Sidekiq)
123
247
  @use_async = true
@@ -133,16 +257,31 @@ module Rollbar
133
257
  @async_handler = Rollbar::Delay::Resque
134
258
  end
135
259
 
260
+ def use_shoryuken(options = {})
261
+ require 'rollbar/delay/shoryuken' if defined?(Shoryuken)
262
+
263
+ Rollbar::Delay::Shoryuken.queue = options[:queue] if options[:queue]
264
+
265
+ @use_async = true
266
+ @async_handler = Rollbar::Delay::Shoryuken
267
+ end
268
+
136
269
  def use_sidekiq=(value)
137
- deprecation_message = "#use_sidekiq=(value) has been deprecated in favor of #use_sidekiq(options = {}). Please update your rollbar configuration."
138
- defined?(ActiveSupport) ? ActiveSupport::Deprecation.warn(deprecation_message) : puts(deprecation_message)
270
+ deprecation_message = '#use_sidekiq=(value) has been deprecated in favor ' \
271
+ 'of #use_sidekiq(options = {}). Please update your rollbar configuration.'
272
+ if defined?(ActiveSupport)
273
+ ActiveSupport::Deprecation.warn(deprecation_message)
274
+ else
275
+ puts(deprecation_message)
276
+ end
139
277
 
140
278
  value.is_a?(Hash) ? use_sidekiq(value) : use_sidekiq
141
279
  end
142
280
 
143
- def use_thread
281
+ def use_thread(options = {})
144
282
  require 'rollbar/delay/thread'
145
283
  @use_async = true
284
+ Rollbar::Delay::Thread.options = options
146
285
  @async_handler = Rollbar::Delay::Thread
147
286
  end
148
287
 
@@ -152,9 +291,14 @@ module Rollbar
152
291
  @async_handler = Rollbar::Delay::SuckerPunch
153
292
  end
154
293
 
155
- def use_sucker_punch=(value)
156
- deprecation_message = "#use_sucker_punch=(value) has been deprecated in favor of #use_sucker_punch. Please update your rollbar configuration."
157
- defined?(ActiveSupport) ? ActiveSupport::Deprecation.warn(deprecation_message) : puts(deprecation_message)
294
+ def use_sucker_punch=(_value)
295
+ deprecation_message = '#use_sucker_punch=(value) has been deprecated in ' \
296
+ 'favor of #use_sucker_punch. Please update your rollbar configuration.'
297
+ if defined?(ActiveSupport)
298
+ ActiveSupport::Deprecation.warn(deprecation_message)
299
+ else
300
+ puts(deprecation_message)
301
+ end
158
302
 
159
303
  use_sucker_punch
160
304
  end
@@ -167,11 +311,12 @@ module Rollbar
167
311
  def project_gems=(gems)
168
312
  @project_gem_paths = gems.map do |name|
169
313
  found = Gem::Specification.each.select { |spec| name === spec.name }
170
- if found.empty?
171
- puts "[Rollbar] No gems found matching #{name.inspect}"
172
- end
314
+ puts "[Rollbar] No gems found matching #{name.inspect}" if found.empty?
173
315
  found
174
- end.flatten.uniq.map(&:gem_dir)
316
+ end
317
+ @project_gem_paths.flatten!
318
+ @project_gem_paths.uniq!
319
+ @project_gem_paths.map!(&:gem_dir)
175
320
  end
176
321
 
177
322
  def before_process=(*handler)
@@ -182,13 +327,88 @@ module Rollbar
182
327
  @transform = Array(handler)
183
328
  end
184
329
 
330
+ def send_extra_frame_data=(value)
331
+ unless SEND_EXTRA_FRAME_DATA_OPTIONS.include?(value)
332
+ logger.warning(
333
+ "Wrong 'send_extra_frame_data' value, :none, :app or :all is expected"
334
+ )
335
+
336
+ return
337
+ end
338
+
339
+ @send_extra_frame_data = value
340
+ end
341
+
342
+ def enable_rails_error_subscriber=(enable)
343
+ return if !defined?(::Rails) || ::Rails.gem_version < ::Gem::Version.new('7.1.0')
344
+
345
+ if @enable_rails_error_subscriber && !enable
346
+ ::Rails.error.unsubscribe(Rollbar::ErrorSubscriber)
347
+ end
348
+
349
+ if !@enable_rails_error_subscriber && enable
350
+ ::Rails.error.subscribe(Rollbar::ErrorSubscriber.new)
351
+ end
352
+
353
+ @enable_rails_error_subscriber = enable
354
+ end
355
+
185
356
  # allow params to be read like a hash
186
357
  def [](option)
187
358
  send(option)
188
359
  end
189
360
 
361
+ def logger_level=(level)
362
+ @logger_level = if level
363
+ level.to_sym
364
+ else
365
+ level
366
+ end
367
+ end
368
+
190
369
  def logger
191
370
  @logger ||= default_logger.call
192
371
  end
372
+
373
+ def hook(symbol, &block)
374
+ unless @hooks.key?(symbol)
375
+ raise StandardError, "Hook :#{symbol} is not supported by Rollbar SDK."
376
+ end
377
+
378
+ if block_given?
379
+ @hooks[symbol] = block
380
+ else
381
+ @hooks[symbol]
382
+ end
383
+ end
384
+
385
+ def execute_hook(symbol, *args)
386
+ hook(symbol).call(*args) if hook(symbol).is_a?(Proc)
387
+ end
388
+ end
389
+
390
+ class ConfiguredOptions
391
+ attr_accessor :configuration, :configured
392
+
393
+ def initialize(configuration)
394
+ @configuration = configuration
395
+ @configured = {}
396
+ end
397
+
398
+ def method_missing(method, *args, &block)
399
+ return super unless configuration.respond_to?(method)
400
+
401
+ method_string = method.to_s
402
+ if method_string.end_with?('=')
403
+ configured[method_string.chomp('=').to_sym] =
404
+ args.first
405
+ end
406
+
407
+ configuration.send(method, *args, &block)
408
+ end
409
+
410
+ def respond_to_missing?(method)
411
+ configuration.respond_to?(method) || super
412
+ end
193
413
  end
194
414
  end
@@ -0,0 +1,17 @@
1
+ module Rollbar
2
+ module Delay
3
+ # This class provides the ActiveJob async handler. Users can
4
+ # use ActiveJob in order to send the reports to the Rollbar API
5
+ class ActiveJob < ::ActiveJob::Base
6
+ queue_as :default
7
+
8
+ def perform(payload)
9
+ Rollbar.process_from_async_handler(payload)
10
+ end
11
+
12
+ def self.call(payload)
13
+ perform_later payload
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module Rollbar
2
+ module Delay
3
+ # This class provides the DelayedJob async handler. Users can
4
+ # use DelayedJob in order to send the reports to the Rollbar API
5
+ class DelayedJob
6
+ class << self
7
+ attr_accessor :queue
8
+
9
+ def call(payload)
10
+ if queue
11
+ new.delay(:queue => queue).call(payload)
12
+ else
13
+ new.delay.call(payload)
14
+ end
15
+ end
16
+ end
17
+
18
+ def call(payload)
19
+ Rollbar.process_from_async_handler(payload)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,7 +1,6 @@
1
1
  module Rollbar
2
2
  module Delay
3
3
  class GirlFriday
4
-
5
4
  class << self
6
5
  def queue_class
7
6
  ::GirlFriday::WorkQueue
@@ -12,14 +11,10 @@ module Rollbar
12
11
  end
13
12
 
14
13
  def queue
15
- @queue ||= self.queue_class.new(nil, :size => 5) do |payload|
16
- begin
17
- Rollbar.process_from_async_handler(payload)
18
- rescue
19
- # According to https://github.com/mperham/girl_friday/wiki#error-handling
20
- # we reraise the exception so it can be handled some way
21
- raise
22
- end
14
+ @queue ||= queue_class.new(nil, :size => 5) do |payload|
15
+ Rollbar.process_from_async_handler(payload)
16
+
17
+ # Do not rescue. GirlFriday will call the error handler.
23
18
  end
24
19
  end
25
20
  end
@@ -23,12 +23,9 @@ module Rollbar
23
23
  end
24
24
 
25
25
  def perform(payload)
26
- begin
27
- Rollbar.process_from_async_handler(payload)
28
- rescue
29
- # Raise the exception so Resque can track the errored job
30
- raise
31
- end
26
+ Rollbar.process_from_async_handler(payload)
27
+
28
+ # Do not rescue. Resque will call the error handler.
32
29
  end
33
30
  end
34
31
  end
@@ -0,0 +1,36 @@
1
+ require 'shoryuken'
2
+
3
+ module Rollbar
4
+ module Delay
5
+ # Following class allows to send rollbars using Sho-ryu-ken as a background
6
+ # jobs processor. See the queue_name method which states that your queues
7
+ # needs to be names as "rollbar_ENVIRONMENT". Retry intervals will be used
8
+ # to retry sending the same message again if failed before.
9
+ class Shoryuken
10
+ include ::Shoryuken::Worker
11
+
12
+ class << self
13
+ attr_accessor :queue
14
+ end
15
+
16
+ self.queue = "rollbar_#{Rollbar.configuration.environment}"
17
+
18
+ def self.call(payload)
19
+ new.call(payload, :queue => queue)
20
+ end
21
+
22
+ def call(payload, options = {})
23
+ self.class.perform_async(payload, options)
24
+ end
25
+
26
+ # not allowing bulk, to not double-report rollbars if one of them failed in bunch.
27
+ shoryuken_options :auto_delete => true,
28
+ :body_parser => :json,
29
+ :retry_intervals => [60, 180, 360, 120_0, 360_0, 186_00]
30
+
31
+ def perform(_sqs_message, payload)
32
+ Rollbar.process_from_async_handler(payload)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -10,19 +10,17 @@ module Rollbar
10
10
  end
11
11
 
12
12
  def call(payload)
13
- ::Sidekiq::Client.push @options.merge('args' => [payload])
13
+ return unless ::Sidekiq::Client.push(@options.merge('args' => [payload])).nil?
14
+
15
+ raise(StandardError, 'Unable to push the job to Sidekiq')
14
16
  end
15
17
 
16
18
  include ::Sidekiq::Worker
17
19
 
18
20
  def perform(*args)
19
- begin
20
- Rollbar.process_from_async_handler(*args)
21
- rescue
22
- # Raise the exception so Sidekiq can track the errored job
23
- # and retry it
24
- raise
25
- end
21
+ Rollbar.process_from_async_handler(*args)
22
+
23
+ # Do not rescue. Sidekiq will call the error handler.
26
24
  end
27
25
  end
28
26
  end
@@ -4,12 +4,10 @@ require 'sucker_punch/version'
4
4
  module Rollbar
5
5
  module Delay
6
6
  class SuckerPunch
7
-
8
7
  include ::SuckerPunch::Job
9
8
 
10
9
  class << self
11
- attr_accessor :perform_proc
12
- attr_accessor :ready
10
+ attr_accessor :perform_proc, :ready
13
11
  end
14
12
 
15
13
  self.ready = false
@@ -17,11 +15,11 @@ module Rollbar
17
15
  def self.setup
18
16
  major_version = ::SuckerPunch::VERSION.split.first.to_i
19
17
 
20
- if major_version > 1
21
- self.perform_proc = proc { |payload| perform_async(payload) }
22
- else
23
- self.perform_proc = proc { |payload| new.async.perform(payload) }
24
- end
18
+ self.perform_proc = if major_version > 1
19
+ proc { |payload| perform_async(payload) }
20
+ else
21
+ proc { |payload| new.async.perform(payload) }
22
+ end
25
23
 
26
24
  self.ready = true
27
25
  end
@@ -33,20 +31,17 @@ module Rollbar
33
31
  end
34
32
 
35
33
  def perform(*args)
36
- begin
37
- Rollbar.process_from_async_handler(*args)
38
- rescue
39
- # SuckerPunch can configure an exception handler with:
40
- #
41
- # SuckerPunch.exception_handler { # do something here }
42
- #
43
- # This is just passed to Celluloid.exception_handler which will
44
- # push the reiceved block to an array of handlers, by default empty, [].
45
- #
46
- # We reraise the exception here casue it's safe and users could have defined
47
- # their own exception handler for SuckerPunch
48
- raise
49
- end
34
+ Rollbar.process_from_async_handler(*args)
35
+
36
+ # SuckerPunch can configure an exception handler with:
37
+ #
38
+ # SuckerPunch.exception_handler { # do something here }
39
+ #
40
+ # This is just passed to Celluloid.exception_handler which will
41
+ # push the reiceved block to an array of handlers, by default empty, [].
42
+ #
43
+
44
+ # Do not rescue. SuckerPunch will call the error handler.
50
45
  end
51
46
  end
52
47
  end