diff options
author | Stan Hu <stanhu@gmail.com> | 2016-08-18 17:06:33 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2016-08-24 12:09:51 -0700 |
commit | 170885edd6f3ea52792511586778e0dce8021cf7 (patch) | |
tree | 4e7b04f41722dd4b369ecc7ed55285845e1e536f /lib/api/helpers.rb | |
parent | 7b0b2417491e28e5536688e0fca96829a4cb7900 (diff) | |
download | gitlab-ce-170885edd6f3ea52792511586778e0dce8021cf7.tar.gz |
Add Sentry logging to API callsadd-sentry-logging-to-api
Closes #21043
Diffstat (limited to 'lib/api/helpers.rb')
-rw-r--r-- | lib/api/helpers.rb | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index d0469d6602d..da4b1bf9902 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -279,6 +279,24 @@ module API error!({ 'message' => message }, status) end + def handle_api_exception(exception) + if sentry_enabled? && report_exception?(exception) + define_params_for_grape_middleware + sentry_context + Raven.capture_exception(exception) + end + + # lifted from https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb#L60 + trace = exception.backtrace + + message = "\n#{exception.class} (#{exception.message}):\n" + message << exception.annoted_source_code.to_s if exception.respond_to?(:annoted_source_code) + message << " " << trace.join("\n ") + + API.logger.add Logger::FATAL, message + rack_response({ 'message' => '500 Internal Server Error' }.to_json, 500) + end + # Projects helpers def filter_projects(projects) @@ -419,5 +437,19 @@ module API Entities::Issue end end + + # The Grape Error Middleware only has access to env but no params. We workaround this by + # defining a method that returns the right value. + def define_params_for_grape_middleware + self.define_singleton_method(:params) { Rack::Request.new(env).params.symbolize_keys } + end + + # We could get a Grape or a standard Ruby exception. We should only report anything that + # is clearly an error. + def report_exception?(exception) + return true unless exception.respond_to?(:status) + + exception.status == 500 + end end end |