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
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!
- Note: - Ignored noticed can't be unignored
Other tags:
- See: #ignored? -
Returns:
-
(void)
-
def ignore! @payload = nil end
def ignored?
- 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
-
(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