Class: Bugsnag::Report

Inherits:
Object
  • Object
show all
Includes:
Utility::FeatureDataStore
Defined in:
lib/bugsnag/report.rb

Overview

rubocop:todo Metrics/ClassLength

Constant Summary collapse

NOTIFIER_NAME =
"Ruby Bugsnag Notifier"
NOTIFIER_VERSION =
Bugsnag::VERSION
NOTIFIER_URL =
"https://www.bugsnag.com"
UNHANDLED_EXCEPTION =
"unhandledException"
UNHANDLED_EXCEPTION_MIDDLEWARE =
"unhandledExceptionMiddleware"
ERROR_CLASS =
"errorClass"
HANDLED_EXCEPTION =
"handledException"
USER_SPECIFIED_SEVERITY =
"userSpecifiedSeverity"
USER_CALLBACK_SET_SEVERITY =
"userCallbackSetSeverity"
MAX_EXCEPTIONS_TO_UNWRAP =
5
CURRENT_PAYLOAD_VERSION =
"4.0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(exception, passed_configuration, auto_notify = false) ⇒ Report

Initializes a new report from an exception.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/bugsnag/report.rb', line 117

def initialize(exception, passed_configuration, auto_notify=false)
  # store the creation time for use as device.time
  @created_at = Time.now.utc.iso8601(3)

  @should_ignore = false
  @unhandled = auto_notify
  @initial_unhandled = @unhandled

  self.configuration = passed_configuration

  @original_error = exception
  self.raw_exceptions = generate_raw_exceptions(exception)
  self.exceptions = generate_exception_list
  @errors = generate_error_list

  self.api_key = configuration.api_key
  self.app_type = configuration.app_type
  self.app_version = configuration.app_version
  self.breadcrumbs = []
  self.context = configuration.context if configuration.context_set?
  self.delivery_method = configuration.delivery_method
  self.hostname = configuration.hostname
  self.runtime_versions = configuration.runtime_versions.dup
  self. = Utility::Duplicator.duplicate(configuration.)
  self.release_stage = configuration.release_stage
  self.severity = auto_notify ? "error" : "warning"
  self.severity_reason = auto_notify ? {:type => UNHANDLED_EXCEPTION} : {:type => HANDLED_EXCEPTION}
  self.user = {}

  @metadata_delegate = Utility::MetadataDelegate.new
  @feature_flag_delegate = Bugsnag.feature_flag_delegate.dup
end

Instance Attribute Details

#api_keyString?

Your Integration API Key

Returns:

  • (String, nil)

See Also:



32
33
34
# File 'lib/bugsnag/report.rb', line 32

def api_key
  @api_key
end

#app_typeString?

The type of application executing the current code

Returns:

  • (String, nil)

See Also:



37
38
39
# File 'lib/bugsnag/report.rb', line 37

def app_type
  @app_type
end

#app_versionString?

The current version of your application

Returns:

  • (String, nil)


41
42
43
# File 'lib/bugsnag/report.rb', line 41

def app_version
  @app_version
end

The list of breadcrumbs attached to this report

Returns:

  • (Array<Breadcrumb>)


45
46
47
# File 'lib/bugsnag/report.rb', line 45

def breadcrumbs
  @breadcrumbs
end

#contextString?

Additional context for this report

Returns:

  • (String, nil)


154
155
156
157
158
# File 'lib/bugsnag/report.rb', line 154

def context
  return @context if defined?(@context)

  @automatic_context
end

#delivery_methodSymbol

The delivery method that will be used for this report

Returns:

  • (Symbol)

See Also:



54
55
56
# File 'lib/bugsnag/report.rb', line 54

def delivery_method
  @delivery_method
end

#errorsArray<Error> (readonly)

A list of errors in this report

Returns:



109
110
111
# File 'lib/bugsnag/report.rb', line 109

def errors
  @errors
end

#exceptionsArray<Hash>

Deprecated.

Use #errors instead

The list of exceptions in this report

Returns:

  • (Array<Hash>)


59
60
61
# File 'lib/bugsnag/report.rb', line 59

def exceptions
  @exceptions
end

#grouping_hashString

All errors with the same grouping hash will be grouped in the Bugsnag app

Returns:

  • (String)


72
73
74
# File 'lib/bugsnag/report.rb', line 72

def grouping_hash
  @grouping_hash
end

#hostnameString

Returns:

  • (String)

See Also:



63
64
65
# File 'lib/bugsnag/report.rb', line 63

def hostname
  @hostname
end

#meta_dataHash

Deprecated.

Use #metadata instead

Arbitrary metadata attached to this report

Returns:

  • (Hash)


77
78
79
# File 'lib/bugsnag/report.rb', line 77

def 
  @meta_data
end

#metadataHash

A Hash containing arbitrary metadata

Returns:

  • (Hash)


309
310
311
# File 'lib/bugsnag/report.rb', line 309

def 
  @meta_data
end

#original_errorException (readonly)

The Exception instance this report was created for

Returns:

  • (Exception)


113
114
115
# File 'lib/bugsnag/report.rb', line 113

def original_error
  @original_error
end

#raw_exceptionsArray<Exception>

Deprecated.

Use #original_error instead

The raw Exception instances for this report

Returns:

  • (Array<Exception>)

See Also:



83
84
85
# File 'lib/bugsnag/report.rb', line 83

def raw_exceptions
  @raw_exceptions
end

#release_stageString?

The current stage of the release process, e.g. ‘development’, production’

Returns:

  • (String, nil)

See Also:



88
89
90
# File 'lib/bugsnag/report.rb', line 88

def release_stage
  @release_stage
end

#sessionHash

The session that active when this report was generated

Returns:

  • (Hash)

See Also:



93
94
95
# File 'lib/bugsnag/report.rb', line 93

def session
  @session
end

#severityString

The severity of this report, e.g. ‘error’, ‘warning’

Returns:

  • (String)


97
98
99
# File 'lib/bugsnag/report.rb', line 97

def severity
  @severity
end

#unhandledBoolean

Whether this report is for a handled or unhandled error

Returns:

  • (Boolean)


27
28
29
# File 'lib/bugsnag/report.rb', line 27

def unhandled
  @unhandled
end

#userHash

The current user when this report was generated

Returns:

  • (Hash)


105
106
107
# File 'lib/bugsnag/report.rb', line 105

def user
  @user
end

Instance Method Details

#add_feature_flag(name, variant = nil) ⇒ void Originally defined in module Utility::FeatureDataStore

This method returns an undefined value.

Add a feature flag with the given name & variant

Parameters:

  • name (String)
  • variant (String, nil) (defaults to: nil)

#add_feature_flags(feature_flags) ⇒ void Originally defined in module Utility::FeatureDataStore

This method returns an undefined value.

Merge the given array of FeatureFlag instances into the stored feature flags

New flags will be appended to the array. Flags with the same name will be overwritten, but their position in the array will not change

Parameters:

#add_metadata(section, data) ⇒ void #add_metadata(section, key, value) ⇒ void

This method returns an undefined value.

Add values to metadata

Overloads:

  • #add_metadata(section, data) ⇒ void

    Merges data into the given section of metadata

    Parameters:

    • section (String, Symbol)
    • data (Hash)
  • #add_metadata(section, key, value) ⇒ void

    Sets key to value in the given section of metadata. If the value is nil the key will be deleted

    Parameters:

    • section (String, Symbol)
    • key (String, Symbol)
    • value


343
344
345
# File 'lib/bugsnag/report.rb', line 343

def (section, key_or_data, *args)
  @metadata_delegate.(@meta_data, section, key_or_data, *args)
end

#add_tab(name, value) ⇒ void

Deprecated.

Use #add_metadata instead

This method returns an undefined value.

Add a new metadata tab to this notification.

Parameters:

  • name (String, #to_s)

    The name of the tab to add

  • value (Hash, Object)

    The value to add to the tab. If the tab already exists, this will be merged with the existing values. If a Hash is not given, the value will be placed into the ‘custom’ tab



179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/bugsnag/report.rb', line 179

def add_tab(name, value)
  return if name.nil?

  if value.is_a? Hash
    [name] ||= {}
    [name].merge! value
  else
    ["custom"] = {} unless ["custom"]

    ["custom"][name.to_s] = value
  end
end

#as_jsonHash

Builds and returns the exception payload for this notification.

Returns:

  • (Hash)


209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/bugsnag/report.rb', line 209

def as_json
  # Build the payload's exception event
  payload_event = {
    app: {
      version: app_version,
      releaseStage: release_stage,
      type: app_type
    },
    breadcrumbs: breadcrumbs.map(&:to_h),
    context: context,
    device: {
      hostname: hostname,
      runtimeVersions: runtime_versions,
      time: @created_at
    },
    exceptions: exceptions,
    featureFlags: @feature_flag_delegate.as_json,
    groupingHash: grouping_hash,
    metaData: ,
    session: session,
    severity: severity,
    severityReason: severity_reason,
    unhandled: @unhandled,
    user: user
  }

  payload_event.reject! {|k, v| v.nil? }

  # return the payload hash
  {
    :apiKey => api_key,
    :notifier => {
      :name => NOTIFIER_NAME,
      :version => NOTIFIER_VERSION,
      :url => NOTIFIER_URL
    },
    :payloadVersion => CURRENT_PAYLOAD_VERSION,
    :events => [payload_event]
  }
end

#clear_feature_flag(name) ⇒ void Originally defined in module Utility::FeatureDataStore

This method returns an undefined value.

Remove the stored flag with the given name

Parameters:

  • name (String)

#clear_feature_flagsvoid Originally defined in module Utility::FeatureDataStore

This method returns an undefined value.

Remove all the stored flags

#clear_metadata(section) ⇒ void #clear_metadata(section, key) ⇒ void

This method returns an undefined value.

Clear values from metadata

Overloads:

  • #clear_metadata(section) ⇒ void

    Clears the given section of metadata

    Parameters:

    • section (String, Symbol)
  • #clear_metadata(section, key) ⇒ void

    Clears the key in the given section of metadata

    Parameters:

    • section (String, Symbol)
    • key (String, Symbol)


360
361
362
# File 'lib/bugsnag/report.rb', line 360

def (section, *args)
  @metadata_delegate.(@meta_data, section, *args)
end

#feature_flagsArray<Bugsnag::FeatureFlag>

Get the array of stored feature flags

Returns:



367
368
369
# File 'lib/bugsnag/report.rb', line 367

def feature_flags
  @feature_flag_delegate.to_a
end

#headersHash{String => String}

Returns the headers required for the notification.

Returns:

  • (Hash{String => String})


254
255
256
257
258
259
260
# File 'lib/bugsnag/report.rb', line 254

def headers
  {
    "Bugsnag-Api-Key" => api_key,
    "Bugsnag-Payload-Version" => CURRENT_PAYLOAD_VERSION,
    "Bugsnag-Sent-At" => Time.now.utc.iso8601(3)
  }
end

#ignore!void

This method returns an undefined value.

Tells the client this report should not be sent.



282
283
284
# File 'lib/bugsnag/report.rb', line 282

def ignore!
  @should_ignore = true
end

#ignore?Boolean

Whether this report should be ignored and not sent.

Returns:

  • (Boolean)


266
267
268
# File 'lib/bugsnag/report.rb', line 266

def ignore?
  @should_ignore
end

#remove_tab(name) ⇒ void

Deprecated.

Use #clear_metadata instead

This method returns an undefined value.

Removes a metadata tab from this notification.

Parameters:

  • name (String)


199
200
201
202
203
# File 'lib/bugsnag/report.rb', line 199

def remove_tab(name)
  return if name.nil?

  .delete(name)
end

#requestHash?

Data from the current HTTP request. May be nil if no data has been recorded

Returns:

  • (Hash, nil)


323
324
325
# File 'lib/bugsnag/report.rb', line 323

def request
  @meta_data[:request]
end

#request_dataHash

Data set on the configuration to be attached to every error notification.

Returns:

  • (Hash)


274
275
276
# File 'lib/bugsnag/report.rb', line 274

def request_data
  configuration.request_data
end

#set_user(id = nil, email = nil, name = nil) ⇒ void

This method returns an undefined value.

Set information about the current user

Additional user fields can be added as metadata in a “user” section

Setting a field to ‘nil’ will remove it from the user data

Parameters:

  • id (String, nil) (defaults to: nil)
  • email (String, nil) (defaults to: nil)
  • name (String, nil) (defaults to: nil)


382
383
384
385
386
387
# File 'lib/bugsnag/report.rb', line 382

def set_user(id = nil, email = nil, name = nil)
  new_user = { id: id, email: email, name: name }
  new_user.reject! { |key, value| value.nil? }

  @user = new_user
end

#summaryHash

Generates a summary to be attached as a breadcrumb

Returns:

  • (Hash)

    a Hash containing the report’s error class, error message, and severity



290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
# File 'lib/bugsnag/report.rb', line 290

def summary
  # Guard against the exceptions array being removed/changed or emptied here
  if exceptions.respond_to?(:first) && exceptions.first
    {
      :error_class => exceptions.first[:errorClass],
      :message => exceptions.first[:message],
      :severity => severity
    }
  else
    {
      :error_class => "Unknown",
      :severity => severity
    }
  end
end