raygun4ruby 3.2.6 → 4.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
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 +169 -133
  7. data/Gemfile +4 -4
  8. data/LICENSE.txt +22 -22
  9. data/README.md +424 -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 +197 -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 +21 -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 +51 -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 +42 -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