class Airbrake::Notice

@since v1.0.0
Airbrake or ignored completely.
Represents a chunk of information that is meant to be either sent to
#

def [](key)

Raises:
  • (Airbrake::Error) - if the notice is ignored

Returns:
  • (Object) -
def [](key)
  raise_if_ignored
  @payload[key]
end

def []=(key, value)

Raises:
  • (Airbrake::Error) - if the root value is not a Hash
  • (Airbrake::Error) - if the +key+ is not recognized
  • (Airbrake::Error) - if the notice is ignored

Returns:
  • (void) -
def []=(key, value)
  raise_if_ignored
  unless WRITABLE_KEYS.include?(key)
    raise Airbrake::Error,
          ":#{key} is not recognized among #{WRITABLE_KEYS}"
  end
  unless value.respond_to?(:to_hash)
    raise Airbrake::Error, "Got #{value.class} value, wanted a Hash"
  end
  @payload[key] = value.to_hash
end

def context

def context
  {
    version: @config.app_version,
    # We ensure that root_directory is always a String, so it can always be
    # converted to JSON in a predictable manner (when it's a Pathname and in
    # Rails environment, it converts to unexpected JSON).
    rootDirectory: @config.root_directory.to_s,
    environment: @config.environment,
    # Make sure we always send hostname.
    hostname: HOSTNAME,
    severity: DEFAULT_SEVERITY
  }.merge(CONTEXT).delete_if { |_key, val| val.nil? || val.empty? }
end

def extract_custom_attributes(exception)

def extract_custom_attributes(exception)
  return unless exception.respond_to?(:to_airbrake)
  attributes = nil
  begin
    attributes = exception.to_airbrake
  rescue StandardError => ex
    @config.logger.error(
      "#{LOG_LABEL} #{exception.class}#to_airbrake failed: #{ex.class}: #{ex}"
    )
  end
  return unless attributes
  begin
    @payload.merge!(attributes)
  rescue TypeError
    @config.logger.error(
      "#{LOG_LABEL} #{exception.class}#to_airbrake failed:" \
      " #{attributes} must be a Hash"
    )
  end
end

def ignore!

Other tags:
    Note: - Ignored noticed can't be unignored

Other tags:
    See: #ignored? -

Returns:
  • (void) -
def ignore!
  @payload = nil
end

def ignored?

Other tags:
    See: #ignore! -

Returns:
  • (Boolean) -
def ignored?
  @payload.nil?
end

def initialize(config, exception, params = {})

def initialize(config, exception, params = {})
  @config = config
  @payload = {
    errors: NestedException.new(config, exception).as_json,
    context: context,
    environment: {
      program_name: $PROGRAM_NAME
    },
    session: {},
    params: params
  }
  @stash = { exception: exception }
  @truncator = Airbrake::Truncator.new(PAYLOAD_MAX_SIZE)
  extract_custom_attributes(exception)
end

def raise_if_ignored

def raise_if_ignored
  return unless ignored?
  raise Airbrake::Error, 'cannot access ignored notice'
end

def to_json

Returns:
  • (Hash{String=>String}, nil) -
def to_json
  loop do
    begin
      json = @payload.to_json
    rescue *JSON_EXCEPTIONS => ex
      @config.logger.debug("#{LOG_LABEL} `notice.to_json` failed: #{ex.class}: #{ex}")
    else
      return json if json && json.bytesize <= MAX_NOTICE_SIZE
    end
    break if truncate == 0
  end
end

def truncate

def truncate
  TRUNCATABLE_KEYS.each do |key|
    @payload[key] = @truncator.truncate(@payload[key])
  end
  new_max_size = @truncator.reduce_max_size
  if new_max_size == 0
    @config.logger.error(
      "#{LOG_LABEL} truncation failed. File an issue at " \
      "https://github.com/airbrake/airbrake-ruby " \
      "and attach the following payload: #{@payload}"
    )
  end
  new_max_size
end