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)
-
(Airbrake::Error)
- if the notice is ignored
Returns:
-
(Object)
-
def [](key) raise_if_ignored @payload[key] end
def []=(key, value)
-
(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(exception)
def context(exception) { version: @config.app_version, versions: @config.versions, # 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, error_message: @truncator.truncate(exception.message), }.merge(CONTEXT).delete_if { |_key, val| val.nil? || val.empty? } end
def initialize(exception, params = {})
- Api: - private
def initialize(exception, params = {}) @config = Airbrake::Config.instance @truncator = Airbrake::Truncator.new(PAYLOAD_MAX_SIZE) @payload = { errors: NestedException.new(exception).as_json, context: context(exception), environment: { program_name: $PROGRAM_NAME, }, session: {}, params: params, } stash[:exception] = exception end
def to_json(*_args)
- Api: - private
Returns:
-
(Hash{String=>String}, nil)
-
def to_json(*_args) loop do begin json = @payload.to_json rescue *JSON_EXCEPTIONS => ex 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 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