raygun4ruby 3.2.6 → 4.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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +48 -0
  3. data/.gitignore +22 -21
  4. data/.rspec +1 -1
  5. data/Appraisals +19 -0
  6. data/CHANGELOG.md +173 -133
  7. data/Gemfile +4 -4
  8. data/LICENSE.txt +22 -22
  9. data/README.md +430 -420
  10. data/Rakefile +32 -27
  11. data/examples/sinatras_raygun.rb +17 -17
  12. data/gemfiles/rails_6.gemfile +9 -0
  13. data/gemfiles/rails_7.gemfile +10 -0
  14. data/gemfiles/rails_7_sidekiq_6.gemfile +10 -0
  15. data/lib/generators/raygun/install_generator.rb +26 -26
  16. data/lib/raygun/affected_user.rb +59 -59
  17. data/lib/raygun/breadcrumbs/breadcrumb.rb +34 -34
  18. data/lib/raygun/breadcrumbs/store.rb +86 -86
  19. data/lib/raygun/breadcrumbs.rb +34 -34
  20. data/lib/raygun/client.rb +313 -308
  21. data/lib/raygun/configuration.rb +202 -194
  22. data/lib/raygun/demo_exception.rb +22 -22
  23. data/lib/raygun/error.rb +10 -10
  24. data/lib/raygun/error_subscriber.rb +25 -0
  25. data/lib/raygun/javascript_tracker.rb +42 -42
  26. data/lib/raygun/middleware/breadcrumbs_store_initializer.rb +19 -19
  27. data/lib/raygun/middleware/javascript_exception_tracking.rb +40 -32
  28. data/lib/raygun/middleware/rack_exception_interceptor.rb +18 -18
  29. data/lib/raygun/middleware/rails_insert_affected_user.rb +26 -26
  30. data/lib/raygun/railtie.rb +47 -39
  31. data/lib/raygun/services/apply_whitelist_filter_to_payload.rb +27 -27
  32. data/lib/raygun/sidekiq.rb +61 -71
  33. data/lib/raygun/version.rb +3 -3
  34. data/lib/raygun.rb +197 -179
  35. data/lib/raygun4ruby.rb +1 -1
  36. data/lib/resque/failure/raygun.rb +25 -25
  37. data/lib/tasks/raygun.tasks +7 -7
  38. data/raygun4ruby.gemspec +43 -45
  39. data/spec/features/javascript_spec.rb +48 -48
  40. data/spec/rails_applications/6.1.4/Gemfile +56 -0
  41. data/spec/{dummy/README.rdoc → rails_applications/6.1.4/README.md} +24 -28
  42. data/spec/{dummy → rails_applications/6.1.4}/Rakefile +6 -6
  43. data/spec/rails_applications/6.1.4/app/assets/config/manifest.js +2 -0
  44. data/spec/{dummy → rails_applications/6.1.4}/app/assets/images/.keep +0 -0
  45. data/spec/{dummy → rails_applications/6.1.4}/app/assets/stylesheets/application.css +15 -15
  46. data/spec/rails_applications/6.1.4/app/channels/application_cable/channel.rb +4 -0
  47. data/spec/rails_applications/6.1.4/app/channels/application_cable/connection.rb +4 -0
  48. data/spec/rails_applications/6.1.4/app/controllers/application_controller.rb +2 -0
  49. data/spec/{dummy → rails_applications/6.1.4}/app/controllers/concerns/.keep +0 -0
  50. data/spec/{dummy → rails_applications/6.1.4}/app/controllers/home_controller.rb +4 -4
  51. data/spec/{dummy → rails_applications/6.1.4}/app/helpers/application_helper.rb +2 -2
  52. data/spec/rails_applications/6.1.4/app/javascript/channels/consumer.js +6 -0
  53. data/spec/rails_applications/6.1.4/app/javascript/channels/index.js +5 -0
  54. data/spec/rails_applications/6.1.4/app/javascript/packs/application.js +13 -0
  55. data/spec/rails_applications/6.1.4/app/jobs/application_job.rb +7 -0
  56. data/spec/rails_applications/6.1.4/app/mailers/application_mailer.rb +4 -0
  57. data/spec/rails_applications/6.1.4/app/models/application_record.rb +3 -0
  58. data/spec/{dummy/app/mailers → rails_applications/6.1.4/app/models/concerns}/.keep +0 -0
  59. data/spec/{dummy → rails_applications/6.1.4}/app/views/home/index.html.erb +3 -3
  60. data/spec/{dummy → rails_applications/6.1.4}/app/views/home/index.json.erb +1 -1
  61. data/spec/rails_applications/6.1.4/app/views/layouts/application.html.erb +13 -0
  62. data/spec/rails_applications/6.1.4/app/views/layouts/mailer.html.erb +13 -0
  63. data/spec/rails_applications/6.1.4/app/views/layouts/mailer.text.erb +1 -0
  64. data/spec/rails_applications/6.1.4/bin/rails +5 -0
  65. data/spec/rails_applications/6.1.4/bin/rake +5 -0
  66. data/spec/rails_applications/6.1.4/bin/setup +36 -0
  67. data/spec/rails_applications/6.1.4/bin/spring +14 -0
  68. data/spec/rails_applications/6.1.4/bin/yarn +17 -0
  69. data/spec/rails_applications/6.1.4/config/application.rb +22 -0
  70. data/spec/rails_applications/6.1.4/config/boot.rb +3 -0
  71. data/spec/rails_applications/6.1.4/config/cable.yml +10 -0
  72. data/spec/rails_applications/6.1.4/config/credentials.yml.enc +1 -0
  73. data/spec/{dummy → rails_applications/6.1.4}/config/database.yml +25 -25
  74. data/spec/{dummy → rails_applications/6.1.4}/config/environment.rb +5 -5
  75. data/spec/rails_applications/6.1.4/config/environments/development.rb +76 -0
  76. data/spec/rails_applications/6.1.4/config/environments/production.rb +120 -0
  77. data/spec/rails_applications/6.1.4/config/environments/test.rb +60 -0
  78. data/spec/rails_applications/6.1.4/config/initializers/application_controller_renderer.rb +8 -0
  79. data/spec/rails_applications/6.1.4/config/initializers/assets.rb +14 -0
  80. data/spec/rails_applications/6.1.4/config/initializers/backtrace_silencers.rb +8 -0
  81. data/spec/rails_applications/6.1.4/config/initializers/content_security_policy.rb +30 -0
  82. data/spec/{dummy → rails_applications/6.1.4}/config/initializers/cookies_serializer.rb +5 -3
  83. data/spec/{dummy → rails_applications/6.1.4}/config/initializers/filter_parameter_logging.rb +6 -4
  84. data/spec/{dummy → rails_applications/6.1.4}/config/initializers/inflections.rb +16 -16
  85. data/spec/{dummy → rails_applications/6.1.4}/config/initializers/mime_types.rb +4 -4
  86. data/spec/rails_applications/6.1.4/config/initializers/permissions_policy.rb +11 -0
  87. data/spec/{dummy → rails_applications/6.1.4}/config/initializers/wrap_parameters.rb +14 -14
  88. data/spec/{dummy → rails_applications/6.1.4}/config/locales/en.yml +33 -23
  89. data/spec/rails_applications/6.1.4/config/master.key +1 -0
  90. data/spec/rails_applications/6.1.4/config/puma.rb +43 -0
  91. data/spec/rails_applications/6.1.4/config/routes.rb +4 -0
  92. data/spec/rails_applications/6.1.4/config/spring.rb +6 -0
  93. data/spec/rails_applications/6.1.4/config/storage.yml +34 -0
  94. data/spec/{dummy → rails_applications/6.1.4}/config.ru +6 -4
  95. data/spec/rails_applications/6.1.4/db/seeds.rb +7 -0
  96. data/spec/{dummy → rails_applications/6.1.4}/db/test.sqlite3 +0 -0
  97. data/spec/{dummy/app/models → rails_applications/6.1.4/lib/assets}/.keep +0 -0
  98. data/spec/{dummy/app/models/concerns → rails_applications/6.1.4/lib/tasks}/.keep +0 -0
  99. data/spec/rails_applications/6.1.4/package.json +11 -0
  100. data/spec/{dummy → rails_applications/6.1.4}/public/404.html +67 -67
  101. data/spec/{dummy → rails_applications/6.1.4}/public/422.html +67 -67
  102. data/spec/{dummy → rails_applications/6.1.4}/public/500.html +66 -66
  103. data/spec/{dummy/lib/assets/.keep → rails_applications/6.1.4/public/apple-touch-icon-precomposed.png} +0 -0
  104. data/spec/{dummy/lib/tasks/.keep → rails_applications/6.1.4/public/apple-touch-icon.png} +0 -0
  105. data/spec/{dummy → rails_applications/6.1.4}/public/favicon.ico +0 -0
  106. data/spec/rails_applications/6.1.4/public/robots.txt +1 -0
  107. data/spec/{dummy/log → rails_applications/6.1.4/storage}/.keep +0 -0
  108. data/spec/rails_applications/7.1.3/.dockerignore +37 -0
  109. data/spec/rails_applications/7.1.3/.gitattributes +9 -0
  110. data/spec/rails_applications/7.1.3/.gitignore +35 -0
  111. data/spec/rails_applications/7.1.3/.ruby-version +1 -0
  112. data/spec/rails_applications/7.1.3/Dockerfile +62 -0
  113. data/spec/rails_applications/7.1.3/Gemfile +67 -0
  114. data/spec/rails_applications/7.1.3/README.md +24 -0
  115. data/spec/rails_applications/7.1.3/Rakefile +6 -0
  116. data/spec/rails_applications/7.1.3/app/assets/config/manifest.js +4 -0
  117. data/spec/{dummy/test/controllers → rails_applications/7.1.3/app/assets/images}/.keep +0 -0
  118. data/spec/rails_applications/7.1.3/app/assets/stylesheets/application.css +15 -0
  119. data/spec/rails_applications/7.1.3/app/channels/application_cable/channel.rb +4 -0
  120. data/spec/rails_applications/7.1.3/app/channels/application_cable/connection.rb +4 -0
  121. data/spec/rails_applications/7.1.3/app/controllers/application_controller.rb +2 -0
  122. data/spec/{dummy/test/fixtures → rails_applications/7.1.3/app/controllers/concerns}/.keep +0 -0
  123. data/spec/rails_applications/7.1.3/app/controllers/home_controller.rb +2 -0
  124. data/spec/rails_applications/7.1.3/app/helpers/application_helper.rb +2 -0
  125. data/spec/rails_applications/7.1.3/app/helpers/home_helper.rb +2 -0
  126. data/spec/rails_applications/7.1.3/app/javascript/application.js +3 -0
  127. data/spec/rails_applications/7.1.3/app/javascript/controllers/application.js +9 -0
  128. data/spec/rails_applications/7.1.3/app/javascript/controllers/hello_controller.js +7 -0
  129. data/spec/rails_applications/7.1.3/app/javascript/controllers/index.js +11 -0
  130. data/spec/rails_applications/7.1.3/app/jobs/application_job.rb +7 -0
  131. data/spec/rails_applications/7.1.3/app/mailers/application_mailer.rb +4 -0
  132. data/spec/rails_applications/7.1.3/app/models/application_record.rb +3 -0
  133. data/spec/{dummy/test/helpers → rails_applications/7.1.3/app/models/concerns}/.keep +0 -0
  134. data/spec/rails_applications/7.1.3/app/views/home/index.html.erb +3 -0
  135. data/spec/rails_applications/7.1.3/app/views/home/index.json.erb +1 -0
  136. data/spec/rails_applications/7.1.3/app/views/layouts/application.html.erb +16 -0
  137. data/spec/rails_applications/7.1.3/app/views/layouts/mailer.html.erb +13 -0
  138. data/spec/rails_applications/7.1.3/app/views/layouts/mailer.text.erb +1 -0
  139. data/spec/rails_applications/7.1.3/bin/bundle +109 -0
  140. data/spec/rails_applications/7.1.3/bin/docker-entrypoint +8 -0
  141. data/spec/rails_applications/7.1.3/bin/importmap +4 -0
  142. data/spec/rails_applications/7.1.3/bin/rails +4 -0
  143. data/spec/rails_applications/7.1.3/bin/rake +4 -0
  144. data/spec/rails_applications/7.1.3/bin/setup +33 -0
  145. data/spec/rails_applications/7.1.3/config/application.rb +27 -0
  146. data/spec/rails_applications/7.1.3/config/boot.rb +4 -0
  147. data/spec/rails_applications/7.1.3/config/cable.yml +11 -0
  148. data/spec/rails_applications/7.1.3/config/credentials.yml.enc +1 -0
  149. data/spec/rails_applications/7.1.3/config/database.yml +25 -0
  150. data/spec/rails_applications/7.1.3/config/environment.rb +5 -0
  151. data/spec/rails_applications/7.1.3/config/environments/development.rb +76 -0
  152. data/spec/rails_applications/7.1.3/config/environments/production.rb +97 -0
  153. data/spec/rails_applications/7.1.3/config/environments/test.rb +64 -0
  154. data/spec/rails_applications/7.1.3/config/importmap.rb +7 -0
  155. data/spec/rails_applications/7.1.3/config/initializers/assets.rb +12 -0
  156. data/spec/rails_applications/7.1.3/config/initializers/content_security_policy.rb +25 -0
  157. data/spec/rails_applications/7.1.3/config/initializers/filter_parameter_logging.rb +8 -0
  158. data/spec/rails_applications/7.1.3/config/initializers/inflections.rb +16 -0
  159. data/spec/rails_applications/7.1.3/config/initializers/permissions_policy.rb +13 -0
  160. data/spec/rails_applications/7.1.3/config/locales/en.yml +31 -0
  161. data/spec/rails_applications/7.1.3/config/puma.rb +35 -0
  162. data/spec/rails_applications/7.1.3/config/routes.rb +11 -0
  163. data/spec/rails_applications/7.1.3/config/storage.yml +34 -0
  164. data/spec/rails_applications/7.1.3/config.ru +6 -0
  165. data/spec/rails_applications/7.1.3/db/seeds.rb +9 -0
  166. data/spec/{dummy/test/integration → rails_applications/7.1.3/lib/assets}/.keep +0 -0
  167. data/spec/{dummy/test/mailers → rails_applications/7.1.3/lib/tasks}/.keep +0 -0
  168. data/spec/rails_applications/7.1.3/public/404.html +67 -0
  169. data/spec/rails_applications/7.1.3/public/422.html +67 -0
  170. data/spec/rails_applications/7.1.3/public/500.html +66 -0
  171. data/spec/{dummy/test/models/.keep → rails_applications/7.1.3/public/apple-touch-icon-precomposed.png} +0 -0
  172. data/spec/{dummy/vendor/assets/javascripts/.keep → rails_applications/7.1.3/public/apple-touch-icon.png} +0 -0
  173. data/spec/{dummy/vendor/assets/stylesheets/.keep → rails_applications/7.1.3/public/favicon.ico} +0 -0
  174. data/spec/rails_applications/7.1.3/public/robots.txt +1 -0
  175. data/spec/rails_applications/7.1.3/storage/.keep +0 -0
  176. data/spec/rails_applications/7.1.3/test/application_system_test_case.rb +5 -0
  177. data/spec/rails_applications/7.1.3/test/channels/application_cable/connection_test.rb +13 -0
  178. data/spec/rails_applications/7.1.3/test/controllers/.keep +0 -0
  179. data/spec/rails_applications/7.1.3/test/controllers/home_controller_test.rb +7 -0
  180. data/spec/rails_applications/7.1.3/test/fixtures/files/.keep +0 -0
  181. data/spec/rails_applications/7.1.3/test/helpers/.keep +0 -0
  182. data/spec/rails_applications/7.1.3/test/integration/.keep +0 -0
  183. data/spec/rails_applications/7.1.3/test/mailers/.keep +0 -0
  184. data/spec/rails_applications/7.1.3/test/models/.keep +0 -0
  185. data/spec/rails_applications/7.1.3/test/system/.keep +0 -0
  186. data/spec/rails_applications/7.1.3/test/test_helper.rb +15 -0
  187. data/spec/rails_applications/7.1.3/vendor/.keep +0 -0
  188. data/spec/rails_applications/7.1.3/vendor/javascript/.keep +0 -0
  189. data/spec/rails_helper.rb +8 -4
  190. data/spec/raygun/breadcrumbs/breadcrumb_spec.rb +171 -171
  191. data/spec/raygun/breadcrumbs/store_spec.rb +170 -170
  192. data/spec/services/apply_whitelist_filter_to_payload_spec.rb +251 -251
  193. data/spec/spec_helper.rb +24 -24
  194. data/spec/support/fake_logger.rb +17 -17
  195. data/test/integration/client_test.rb +19 -19
  196. data/test/rails_helper.rb +6 -0
  197. data/test/test_helper.rb +76 -72
  198. data/test/unit/affected_user_test.rb +136 -136
  199. data/test/unit/client_test.rb +812 -812
  200. data/test/unit/configuration_test.rb +202 -206
  201. data/test/unit/error_subscriber_test.rb +43 -0
  202. data/test/unit/raygun_test.rb +106 -25
  203. data/test/unit/resque_failure_test.rb +27 -24
  204. data/test/unit/sidekiq_failure_test.rb +122 -32
  205. metadata +186 -125
  206. data/.travis.yml +0 -20
  207. data/spec/dummy/.gitignore +0 -17
  208. data/spec/dummy/Gemfile +0 -47
  209. data/spec/dummy/app/assets/config/manifest.js +0 -3
  210. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  211. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  212. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  213. data/spec/dummy/bin/bundle +0 -3
  214. data/spec/dummy/bin/rails +0 -9
  215. data/spec/dummy/bin/rake +0 -9
  216. data/spec/dummy/bin/setup +0 -29
  217. data/spec/dummy/bin/spring +0 -17
  218. data/spec/dummy/config/application.rb +0 -26
  219. data/spec/dummy/config/boot.rb +0 -3
  220. data/spec/dummy/config/environments/development.rb +0 -41
  221. data/spec/dummy/config/environments/production.rb +0 -79
  222. data/spec/dummy/config/environments/test.rb +0 -42
  223. data/spec/dummy/config/initializers/assets.rb +0 -11
  224. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  225. data/spec/dummy/config/initializers/session_store.rb +0 -3
  226. data/spec/dummy/config/initializers/to_time_preserves_timezone.rb +0 -10
  227. data/spec/dummy/config/routes.rb +0 -58
  228. data/spec/dummy/config/secrets.yml +0 -22
  229. data/spec/dummy/db/seeds.rb +0 -7
  230. data/spec/dummy/public/robots.txt +0 -5
  231. data/spec/dummy/test/test_helper.rb +0 -10
  232. data/spec/raygun/raygun_spec.rb +0 -47
data/lib/raygun.rb CHANGED
@@ -1,179 +1,197 @@
1
- require "concurrent"
2
- require "httparty"
3
- require "logger"
4
- require "json"
5
- require "socket"
6
- require "rack"
7
- require "ostruct"
8
-
9
- require "raygun/version"
10
- require "raygun/configuration"
11
- require "raygun/client"
12
- require "raygun/javascript_tracker"
13
- require "raygun/middleware/rack_exception_interceptor"
14
- require "raygun/middleware/breadcrumbs_store_initializer"
15
- require "raygun/middleware/javascript_exception_tracking"
16
- require "raygun/demo_exception"
17
- require "raygun/error"
18
- require "raygun/affected_user"
19
- require "raygun/services/apply_whitelist_filter_to_payload"
20
- require "raygun/breadcrumbs/breadcrumb"
21
- require "raygun/breadcrumbs/store"
22
- require "raygun/breadcrumbs"
23
- require "raygun/railtie" if defined?(Rails)
24
-
25
- module Raygun
26
-
27
- # used to identify ourselves to Raygun
28
- CLIENT_URL = "https://github.com/MindscapeHQ/raygun4ruby"
29
- CLIENT_NAME = "Raygun4Ruby Gem"
30
-
31
- class << self
32
- include DemoException
33
-
34
- # Configuration Object (instance of Raygun::Configuration)
35
- attr_writer :configuration
36
-
37
- def setup
38
- yield(configuration)
39
-
40
- log("configuration settings: #{configuration.inspect}")
41
- end
42
-
43
- def configuration
44
- @configuration ||= Configuration.new
45
- end
46
-
47
- def default_configuration
48
- configuration.defaults
49
- end
50
-
51
- def reset_configuration
52
- @configuration = Configuration.new
53
- end
54
-
55
- def configured?
56
- !!configuration.api_key
57
- end
58
-
59
- def track_exception(exception_instance, env = {}, user = nil, retry_count = 1)
60
- log('tracking exception')
61
-
62
- if configuration.send_in_background
63
- track_exception_async(exception_instance, env, user, retry_count)
64
- else
65
- track_exception_sync(exception_instance, env, user, retry_count)
66
- end
67
- end
68
-
69
- def track_exceptions
70
- yield
71
- rescue => e
72
- track_exception(e)
73
- end
74
-
75
- def record_breadcrumb(
76
- message: nil,
77
- category: '',
78
- level: :info,
79
- timestamp: Time.now.utc,
80
- metadata: {},
81
- class_name: nil,
82
- method_name: nil,
83
- line_number: nil
84
- )
85
- log('recording breadcrumb')
86
-
87
- Raygun::Breadcrumbs::Store.record(
88
- message: message,
89
- category: category,
90
- level: level,
91
- timestamp: timestamp,
92
- metadata: metadata,
93
- class_name: class_name,
94
- method_name: method_name,
95
- line_number: line_number,
96
- )
97
- end
98
-
99
- def log(message)
100
- return unless configuration.debug
101
-
102
- configuration.logger.info("[Raygun] #{message}") if configuration.logger
103
- end
104
-
105
- def failsafe_log(message)
106
- configuration.failsafe_logger.info(message)
107
- end
108
-
109
- def deprecation_warning(message)
110
- if defined?(ActiveSupport::Deprecation)
111
- ActiveSupport::Deprecation.warn(message)
112
- else
113
- puts message
114
- end
115
- end
116
-
117
- private
118
-
119
- def track_exception_async(*args)
120
- future = Concurrent::Future.execute { track_exception_sync(*args) }
121
- future.add_observer(lambda do |_, value, reason|
122
- if value == nil || !value.responds_to?(:response) || value.response.code != "202"
123
- log("unexpected response from Raygun, could indicate error: #{value.inspect}")
124
- end
125
- end, :call)
126
- end
127
-
128
- def track_exception_sync(exception_instance, env, user, retry_count)
129
- if should_report?(exception_instance)
130
- log('attempting to send exception')
131
- resp = Client.new.track_exception(exception_instance, env, user)
132
- log('sent payload to api')
133
-
134
- resp
135
- end
136
- rescue Exception => e
137
- log('error sending exception to raygun, see failsafe logger for more information')
138
-
139
- if configuration.failsafe_logger
140
- failsafe_log("Problem reporting exception to Raygun: #{e.class}: #{e.message}\n\n#{e.backtrace.join("\n")}")
141
- end
142
-
143
- if retry_count > 0
144
- new_exception = e.exception("raygun4ruby encountered an exception processing your exception")
145
- new_exception.set_backtrace(e.backtrace)
146
-
147
- env[:custom_data] ||= {}
148
- env[:custom_data].merge!(original_stacktrace: exception_instance.backtrace)
149
-
150
- ::Raygun::Breadcrumbs::Store.clear
151
-
152
- track_exception(new_exception, env, user, retry_count - 1)
153
- else
154
- raise e
155
- end
156
- end
157
-
158
-
159
- def print_api_key_warning
160
- $stderr.puts(NO_API_KEY_MESSAGE)
161
- end
162
-
163
- def should_report?(exception)
164
- if configuration.silence_reporting
165
- log('skipping reporting because Configuration.silence_reporting is enabled')
166
-
167
- return false
168
- end
169
-
170
- if configuration.ignore.flatten.include?(exception.class.to_s)
171
- log("skipping reporting of exception #{exception.class} because it is in the ignore list")
172
-
173
- return false
174
- end
175
-
176
- true
177
- end
178
- end
179
- end
1
+ require "concurrent"
2
+ require "httparty"
3
+ require "logger"
4
+ require "json"
5
+ require "socket"
6
+ require "rack"
7
+ require "ostruct"
8
+
9
+ require "raygun/version"
10
+ require "raygun/configuration"
11
+ require "raygun/client"
12
+ require "raygun/javascript_tracker"
13
+ require "raygun/middleware/rack_exception_interceptor"
14
+ require "raygun/middleware/breadcrumbs_store_initializer"
15
+ require "raygun/middleware/javascript_exception_tracking"
16
+ require "raygun/demo_exception"
17
+ require "raygun/error_subscriber"
18
+ require "raygun/error"
19
+ require "raygun/affected_user"
20
+ require "raygun/services/apply_whitelist_filter_to_payload"
21
+ require "raygun/breadcrumbs/breadcrumb"
22
+ require "raygun/breadcrumbs/store"
23
+ require "raygun/breadcrumbs"
24
+ require "raygun/railtie" if defined?(Rails)
25
+
26
+ module Raygun
27
+
28
+ # used to identify ourselves to Raygun
29
+ CLIENT_URL = "https://github.com/MindscapeHQ/raygun4ruby"
30
+ CLIENT_NAME = "Raygun4Ruby Gem"
31
+
32
+ class << self
33
+ include DemoException
34
+
35
+ # Configuration Object (instance of Raygun::Configuration)
36
+ attr_writer :configuration
37
+
38
+ # List of futures that are currently running
39
+ @@active_futures = []
40
+
41
+ def setup
42
+ yield(configuration)
43
+
44
+ log("configuration settings: #{configuration.inspect}")
45
+ end
46
+
47
+ def configuration
48
+ @configuration ||= Configuration.new
49
+ end
50
+
51
+ def default_configuration
52
+ configuration.defaults
53
+ end
54
+
55
+ def reset_configuration
56
+ @configuration = Configuration.new
57
+ end
58
+
59
+ def configured?
60
+ !!configuration.api_key
61
+ end
62
+
63
+ def track_exception(exception_instance, env = {}, user = nil, retry_count = 1)
64
+ log('tracking exception')
65
+
66
+ exception_instance.set_backtrace(caller) if exception_instance.is_a?(Exception) && exception_instance.backtrace.nil?
67
+
68
+ result = if configuration.send_in_background
69
+ track_exception_async(exception_instance, env, user, retry_count)
70
+ else
71
+ track_exception_sync(exception_instance, env, user, retry_count)
72
+ end
73
+
74
+ result
75
+ end
76
+
77
+ def track_exceptions
78
+ yield
79
+ rescue => e
80
+ track_exception(e)
81
+ end
82
+
83
+ def record_breadcrumb(
84
+ message: nil,
85
+ category: '',
86
+ level: :info,
87
+ timestamp: Time.now.utc,
88
+ metadata: {},
89
+ class_name: nil,
90
+ method_name: nil,
91
+ line_number: nil
92
+ )
93
+ log('recording breadcrumb')
94
+
95
+ Raygun::Breadcrumbs::Store.record(
96
+ message: message,
97
+ category: category,
98
+ level: level,
99
+ timestamp: timestamp,
100
+ metadata: metadata,
101
+ class_name: class_name,
102
+ method_name: method_name,
103
+ line_number: line_number,
104
+ )
105
+ end
106
+
107
+ def log(message)
108
+ return unless configuration.debug
109
+
110
+ configuration.logger.info("[Raygun] #{message}") if configuration.logger
111
+ end
112
+
113
+ def failsafe_log(message)
114
+ configuration.failsafe_logger.info(message)
115
+ end
116
+
117
+ def deprecation_warning(message)
118
+ if defined?(ActiveSupport::Deprecation)
119
+ ActiveSupport::Deprecation.warn(message)
120
+ else
121
+ puts message
122
+ end
123
+ end
124
+
125
+ def wait_for_futures
126
+ @@active_futures.each(&:value)
127
+ end
128
+
129
+ private
130
+
131
+ def track_exception_async(exception_instance, env, user, retry_count)
132
+ env[:rg_breadcrumb_store] = Raygun::Breadcrumbs::Store.take_until_size(Client::MAX_BREADCRUMBS_SIZE) if Raygun::Breadcrumbs::Store.any?
133
+
134
+ future = Concurrent::Future.execute { track_exception_sync(exception_instance, env, user, retry_count) }
135
+ future.add_observer(lambda do |_, value, reason|
136
+ if value == nil || !value.responds_to?(:response) || value.response.code != "202"
137
+ log("unexpected response from Raygun, could indicate error: #{value.inspect}")
138
+ end
139
+ @@active_futures.delete(future)
140
+ end, :call)
141
+ @@active_futures << future
142
+
143
+ future
144
+ end
145
+
146
+ def track_exception_sync(exception_instance, env, user, retry_count)
147
+ if should_report?(exception_instance)
148
+ log('attempting to send exception')
149
+ resp = Client.new.track_exception(exception_instance, env, user)
150
+ log('sent payload to api')
151
+
152
+ resp
153
+ end
154
+ rescue Exception => e
155
+ log('error sending exception to raygun, see failsafe logger for more information')
156
+
157
+ if configuration.failsafe_logger
158
+ failsafe_log("Problem reporting exception to Raygun: #{e.class}: #{e.message}\n\n#{e.backtrace.join("\n")}")
159
+ end
160
+
161
+ if retry_count > 0
162
+ new_exception = e.exception("raygun4ruby encountered an exception processing your exception")
163
+ new_exception.set_backtrace(e.backtrace)
164
+
165
+ env[:custom_data] ||= {}
166
+ env[:custom_data].merge!(original_stacktrace: exception_instance.backtrace)
167
+
168
+ ::Raygun::Breadcrumbs::Store.clear
169
+
170
+ track_exception(new_exception, env, user, retry_count - 1)
171
+ else
172
+ raise e
173
+ end
174
+ end
175
+
176
+
177
+ def print_api_key_warning
178
+ $stderr.puts(NO_API_KEY_MESSAGE)
179
+ end
180
+
181
+ def should_report?(exception)
182
+ if configuration.silence_reporting
183
+ log('skipping reporting because Configuration.silence_reporting is enabled')
184
+
185
+ return false
186
+ end
187
+
188
+ if configuration.ignore.flatten.include?(exception.class.to_s)
189
+ log("skipping reporting of exception #{exception.class} because it is in the ignore list")
190
+
191
+ return false
192
+ end
193
+
194
+ true
195
+ end
196
+ end
197
+ end
data/lib/raygun4ruby.rb CHANGED
@@ -1 +1 @@
1
- require "raygun"
1
+ require "raygun"
@@ -1,26 +1,26 @@
1
- begin
2
- require 'resque'
3
- rescue LoadError
4
- raise "Can't find 'resque' gem. You'll need to require it before you require the Raygun Failure handler"
5
- end
6
-
7
- module Resque
8
- module Failure
9
- class Raygun < Base
10
-
11
- def save
12
- ::Raygun.track_exception(exception,
13
- custom_data: {
14
- resque: {
15
- worker: worker.to_s,
16
- queue: queue.to_s,
17
- job: payload['class'].to_s,
18
- args: payload['args'].inspect
19
- }
20
- }
21
- )
22
- end
23
-
24
- end
25
- end
1
+ begin
2
+ require 'resque'
3
+ rescue LoadError
4
+ raise "Can't find 'resque' gem. You'll need to require it before you require the Raygun Failure handler"
5
+ end
6
+
7
+ module Resque
8
+ module Failure
9
+ class Raygun < Base
10
+
11
+ def save
12
+ ::Raygun.track_exception(exception,
13
+ custom_data: {
14
+ resque: {
15
+ worker: worker.to_s,
16
+ queue: queue.to_s,
17
+ job: payload['class'].to_s,
18
+ args: payload['args'].inspect
19
+ }
20
+ }
21
+ )
22
+ end
23
+
24
+ end
25
+ end
26
26
  end
@@ -1,8 +1,8 @@
1
- namespace :raygun do
2
-
3
- desc "Test Raygun integration"
4
- task :test => :environment do
5
- Raygun.track_test_exception
6
- end
7
-
1
+ namespace :raygun do
2
+
3
+ desc "Test Raygun integration"
4
+ task :test => :environment do
5
+ Raygun.track_test_exception
6
+ end
7
+
8
8
  end
data/raygun4ruby.gemspec CHANGED
@@ -1,45 +1,43 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'raygun/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "raygun4ruby"
8
- spec.version = Raygun::VERSION
9
- spec.authors = ["Mindscape", "Nik Wakelin"]
10
- spec.email = ["hello@raygun.com"]
11
- spec.description = %q{Ruby Adapter for Raygun}
12
- spec.summary = %q{This gem provides support for Ruby and Ruby on Rails for the Raygun error reporter}
13
- spec.homepage = "https://raygun.com"
14
- spec.license = "MIT"
15
- spec.required_ruby_version = '>= 2.0'
16
-
17
- spec.files = `git ls-files | grep -Ev '^(test)'`.split("\n")
18
- spec.test_files = `git ls-files -- test/*`.split("\n")
19
-
20
- spec.executables = []
21
- spec.require_paths = ["lib"]
22
-
23
- spec.add_runtime_dependency "httparty", "> 0.13.7"
24
- spec.add_runtime_dependency "json"
25
- spec.add_runtime_dependency "rack"
26
- spec.add_runtime_dependency "concurrent-ruby"
27
-
28
- spec.add_development_dependency "bundler", ">= 1.1"
29
- spec.add_development_dependency "rake", ">= 12.3.3"
30
- spec.add_development_dependency "timecop"
31
- spec.add_development_dependency "minitest", "~> 5.11"
32
- spec.add_development_dependency "redis-namespace", ">= 1.3.1"
33
- spec.add_development_dependency "resque"
34
- spec.add_development_dependency "sidekiq", [">= 3", "< 3.2.2"]
35
- spec.add_development_dependency "mocha"
36
- spec.add_development_dependency "pry"
37
- spec.add_development_dependency "webmock"
38
-
39
- spec.add_development_dependency 'rails', "= 4.2.11"
40
- spec.add_development_dependency 'sqlite3', '~> 1.3.6'
41
- spec.add_development_dependency 'capybara'
42
- spec.add_development_dependency "rspec-rails", '~> 3.9'
43
- spec.add_development_dependency "launchy"
44
- spec.add_development_dependency "simplecov"
45
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "raygun/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "raygun4ruby"
8
+ spec.version = Raygun::VERSION
9
+ spec.authors = ["Mindscape", "Nik Wakelin"]
10
+ spec.email = ["hello@raygun.com"]
11
+ spec.description = %q{Ruby Adapter for Raygun}
12
+ spec.summary = %q{This gem provides support for Ruby and Ruby on Rails for the Raygun.com error reporter}
13
+ spec.homepage = "https://raygun.com"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 2.0"
16
+
17
+ spec.files = `git ls-files | grep -Ev "^(test)"`.split("\n")
18
+ spec.test_files = `git ls-files -- test/*`.split("\n")
19
+
20
+ spec.executables = []
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_runtime_dependency "httparty", "> 0.13.7"
24
+ spec.add_runtime_dependency "json"
25
+ spec.add_runtime_dependency "rack"
26
+ spec.add_runtime_dependency "concurrent-ruby"
27
+
28
+ spec.add_development_dependency "bundler", ">= 2.3"
29
+ spec.add_development_dependency "rake", ">= 12.3.3"
30
+ spec.add_development_dependency "appraisal"
31
+ spec.add_development_dependency "timecop"
32
+ spec.add_development_dependency "minitest", "~> 5.11"
33
+ spec.add_development_dependency "redis-namespace", ">= 1.3.1"
34
+ spec.add_development_dependency "resque"
35
+ spec.add_development_dependency "mocha"
36
+ spec.add_development_dependency "pry"
37
+ spec.add_development_dependency "webmock"
38
+
39
+ spec.add_development_dependency "capybara"
40
+ spec.add_development_dependency "rspec-rails"
41
+ spec.add_development_dependency "launchy"
42
+ spec.add_development_dependency "simplecov"
43
+ end
@@ -1,48 +1,48 @@
1
- require 'rails_helper'
2
-
3
- feature 'JavaScript Tracking', feature: true do
4
- before { Raygun.configuration.js_api_key = nil }
5
- after { Raygun.configuration.js_api_key = nil }
6
-
7
- it "Includes the Raygun Javascript Middleware" do
8
- expect(Rails.application.config.middleware).to include(Raygun::Middleware::JavascriptExceptionTracking)
9
- end
10
-
11
- it "Does not inject the JS snippet" do
12
- visit root_path
13
-
14
- expect(page.html).to_not include('cdn.raygun.io/raygun4js/raygun.min.js')
15
- expect(page.html).to_not include('rg4js(')
16
- end
17
-
18
- context 'With a JS API Key' do
19
- before { Raygun.configuration.js_api_key = 'Sample key' }
20
-
21
- it "Injects the JS snippet" do
22
- visit root_path
23
-
24
- expect(page.html).to include('cdn.raygun.io/raygun4js/raygun.min.js')
25
- expect(page.html).to include('rg4js(')
26
- end
27
-
28
- it "Does not inject the JS snippet" do
29
- visit root_path(format: :json)
30
-
31
- expect(page.html).to_not include('cdn.raygun.io/raygun4js/raygun.min.js')
32
- expect(page.html).to_not include('rg4js(')
33
- end
34
- end
35
-
36
- context "With JS version overriden" do
37
- before do
38
- Raygun.configuration.js_api_version = "2.14.1"
39
- Raygun.configuration.js_api_key = "Sample key"
40
- end
41
-
42
- it "Uses the overriden version" do
43
- visit root_path
44
-
45
- expect(page.html).to include('cdn.raygun.io/raygun4js/2.14.1/raygun.min.js')
46
- end
47
- end
48
- end
1
+ require 'rails_helper'
2
+
3
+ feature 'JavaScript Tracking', feature: true do
4
+ before { Raygun.configuration.js_api_key = nil }
5
+ after { Raygun.configuration.js_api_key = nil }
6
+
7
+ it "Includes the Raygun Javascript Middleware" do
8
+ expect(Rails.application.config.middleware).to include(Raygun::Middleware::JavascriptExceptionTracking)
9
+ end
10
+
11
+ it "Does not inject the JS snippet" do
12
+ visit root_path
13
+
14
+ expect(page.html).to_not include('cdn.raygun.io/raygun4js/raygun.min.js')
15
+ expect(page.html).to_not include('rg4js(')
16
+ end
17
+
18
+ context 'With a JS API Key' do
19
+ before { Raygun.configuration.js_api_key = 'Sample key' }
20
+
21
+ it "Injects the JS snippet" do
22
+ visit root_path
23
+
24
+ expect(page.html).to include('cdn.raygun.io/raygun4js/raygun.min.js')
25
+ expect(page.html).to include('rg4js(')
26
+ end
27
+
28
+ it "Does not inject the JS snippet" do
29
+ visit root_path(format: :json)
30
+
31
+ expect(page.html).to_not include('cdn.raygun.io/raygun4js/raygun.min.js')
32
+ expect(page.html).to_not include('rg4js(')
33
+ end
34
+ end
35
+
36
+ context "With JS version overriden" do
37
+ before do
38
+ Raygun.configuration.js_api_version = "2.14.1"
39
+ Raygun.configuration.js_api_key = "Sample key"
40
+ end
41
+
42
+ it "Uses the overriden version" do
43
+ visit root_path
44
+
45
+ expect(page.html).to include('cdn.raygun.io/raygun4js/2.14.1/raygun.min.js')
46
+ end
47
+ end
48
+ end