class Google::Cloud::ErrorReporting::Railtie

# Railtie

Google::Cloud::ErrorReporting::Railtie automatically add the {Google::Cloud::ErrorReporting::Middleware} to Rack in a Rails environment. It will automatically capture Exceptions from the Rails app and report them to the Stackdriver Error Reporting service.

The Middleware is only added when certain conditions are met. See `Google::Cloud.configure.use_error_reporting` for detail.

When loaded, the {Google::Cloud::ErrorReporting::Middleware} will be inserted after ActionDispatch::DebugExceptions or ActionDispatch::ShowExceptions Middleware, which allows it to intercept and handle all Exceptions without interfering with Rails's normal error pages. See the [Configuration Guide](googleapis.dev/ruby/stackdriver/latest/file.INSTRUMENTATION_CONFIGURATION.html) on how to configure the Railtie and Middleware.

Public Class Methods

consolidate_rails_config(config) click to toggle source

@private Consolidate Rails configuration into Error Reporting instrumentation configuration. Also consolidate the `use_error_reporting` setting by verifying credentials and Rails environment. The `use_error_reporting` setting will be true if credentials are valid, and the setting is manually set to true or Rails is in production environment.

@param [Rails::Railtie::Configuration] config The

Rails.application.config
# File lib/google/cloud/error_reporting/rails.rb, line 81
def self.consolidate_rails_config config
  merge_rails_config config

  init_default_config

  # Done if Google::Cloud.configure.use_error_reporting is explicitly
  # false
  return if Google::Cloud.configure.use_error_reporting == false

  # Verify credentials and set use_error_reporting to false if
  # credentials are invalid
  unless valid_credentials? ErrorReporting.configure.project_id,
                            ErrorReporting.configure.credentials
    Cloud.configure.use_error_reporting = false
    return
  end

  # Otherwise set use_error_reporting to true if Rails is running in
  # production
  Google::Cloud.configure.use_error_reporting ||= Rails.env.production?
end
init_middleware(app) click to toggle source

@private Init Error Reporting integration for Rails. Setup configuration and insert the Middleware.

# File lib/google/cloud/error_reporting/rails.rb, line 55
def self.init_middleware app
  # In later versions of Rails, ActionDispatch::DebugExceptions is
  # responsible for catching exceptions. But it didn't exist until
  # Rails 3.2. So we use ShowExceptions as fallback for earlier Rails.
  rails_exception_middleware =
    if defined? ::ActionDispatch::DebugExceptions
      ::ActionDispatch::DebugExceptions
    else
      ::ActionDispatch::ShowExceptions
    end

  app.middleware.insert_after rails_exception_middleware,
                              Google::Cloud::ErrorReporting::Middleware
end

Private Class Methods

init_default_config() click to toggle source

Fallback to default config values if config parameters not provided.

# File lib/google/cloud/error_reporting/rails.rb, line 134
def self.init_default_config
  config = ErrorReporting.configure
  config.project_id ||= ErrorReporting::Project.default_project_id
  config.service_name ||= ErrorReporting::Project.default_service_name
  config.service_version ||=
    ErrorReporting::Project.default_service_version
end
merge_rails_config(rails_config) click to toggle source

@private Merge Rails configuration into Error Reporting instrumentation configuration.

# File lib/google/cloud/error_reporting/rails.rb, line 108
def self.merge_rails_config rails_config
  gcp_config = rails_config.google_cloud
  er_config = gcp_config.error_reporting

  if Cloud.configure.use_error_reporting.nil?
    Cloud.configure.use_error_reporting = gcp_config.use_error_reporting
  end
  ErrorReporting.configure do |config|
    config.project_id ||= config.project
    config.project_id ||= er_config.project_id || er_config.project
    config.project_id ||= gcp_config.project_id || gcp_config.project
    config.credentials ||= config.keyfile
    config.credentials ||= er_config.credentials || er_config.keyfile
    config.credentials ||= gcp_config.credentials || gcp_config.keyfile
    config.service_name ||= \
      (er_config.service_name || gcp_config.service_name)
    config.service_version ||= \
      (er_config.service_version || gcp_config.service_version)
    config.ignore_classes ||= er_config.ignore_classes
  end
end
valid_credentials?(project_id, credentials) click to toggle source

@private Verify credentials

# File lib/google/cloud/error_reporting/rails.rb, line 144
def self.valid_credentials? project_id, credentials
  begin
    # if credentials is nil, get default
    credentials ||= ErrorReporting::Credentials.default
    # only create a new Credentials object if the val isn't one already
    unless credentials.is_a? Google::Auth::Credentials
      # if credentials is not a Credentials object, create one
      ErrorReporting::Credentials.new credentials
    end
  rescue StandardError => e
    $stdout.puts "Note: Google::Cloud::ErrorReporting is disabled " \
      "because it failed to authorize with the service. (#{e.message})"
    return false
  end

  if project_id.to_s.empty?
    $stdout.puts "Note: Google::Cloud::ErrorReporting is disabled " \
      "because the project ID could not be determined."
    return false
  end

  true
end