google-cloud-error_reporting 0.24.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,41 @@
1
+ # Copyright 2017 Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "google/cloud/credentials"
17
+
18
+ module Google
19
+ module Cloud
20
+ module ErrorReporting
21
+ ##
22
+ # @private Represents the OAuth 2.0 signing logic for ErrorReporting.
23
+ class Credentials < Google::Cloud::Credentials
24
+ SCOPE = ["https://www.googleapis.com/auth/cloud-platform"]
25
+ PATH_ENV_VARS = %w(ERROR_REPORTING_KEYFILE GOOGLE_CLOUD_KEYFILE)
26
+ JSON_ENV_VARS =
27
+ %w(ERROR_REPORTING_KEYFILE_JSON GOOGLE_CLOUD_KEYFILE_JSON)
28
+
29
+ ##
30
+ # @private Create credentials with given scope and/or keyfile.
31
+ def self.credentials_with_scope keyfile, scope = nil
32
+ if keyfile.nil?
33
+ default(scope: scope)
34
+ else
35
+ new(keyfile, scope: scope)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,313 @@
1
+ # Copyright 2017 Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ module Google
17
+ module Cloud
18
+ module ErrorReporting
19
+ ##
20
+ # # ErrorEvent
21
+ #
22
+ # An individual error event to report to Stackdriver Error Reporting
23
+ # service.
24
+ #
25
+ # Google::Cloud::ErrorReporting::ErrorEvent is able to be transformed
26
+ # into
27
+ # {Google::Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent}
28
+ # gRPC structure. Once an error event is reported, the GCP
29
+ # Stackdriver ErrorReporting service is able to parse the message and
30
+ # backtrace, then group the error events by content.
31
+ #
32
+ # @see https://cloud.google.com/error-reporting/reference/rest/v1beta1/projects.events
33
+ #
34
+ # @example
35
+ # require "google/cloud/error_reporting"
36
+ #
37
+ # error_reporting = Google::Cloud::ErrorReporting.new
38
+ #
39
+ # error_event = error_reporting.error_event "Error with Backtrace",
40
+ # timestamp: Time.now,
41
+ # service_name: "my_app_name",
42
+ # service_version: "v8"
43
+ # error_reporting.report error_event
44
+ #
45
+ class ErrorEvent
46
+ ##
47
+ # Time when the event occurred. If not provided, the time when the event
48
+ # was received by the Error Reporting system will be used.
49
+ attr_accessor :event_time
50
+
51
+ ##
52
+ # A message describing the error. The message can contain an exception
53
+ # stack in one of the supported programming languages and formats. In
54
+ # that case, the message is parsed and detailed exception information is
55
+ # returned when retrieving the error event again.
56
+ attr_accessor :message
57
+
58
+ ##
59
+ # An identifier of the service, such as the name of the executable, job,
60
+ # or Google App Engine service name. This field is expected to have a
61
+ # low number of values that are relatively stable over time, as opposed
62
+ # to version, which can be changed whenever new code is deployed.
63
+ attr_accessor :service_name
64
+
65
+ ##
66
+ # Represents the source code version that the developer provided, which
67
+ # could represent a version label or a Git SHA-1 hash, for example.
68
+ attr_accessor :service_version
69
+
70
+ ##
71
+ # The type of HTTP request, such as GET, POST, etc.
72
+ attr_accessor :http_method
73
+
74
+ ##
75
+ # The URL of the request.
76
+ attr_accessor :http_url
77
+
78
+ ##
79
+ # The user agent information that is provided with the request.
80
+ attr_accessor :http_user_agent
81
+
82
+ ##
83
+ # The referrer information that is provided with the request.
84
+ attr_accessor :http_referrer
85
+
86
+ ##
87
+ # The HTTP response status code for the request.
88
+ attr_accessor :http_status
89
+
90
+ ##
91
+ # The IP address from which the request originated. This can be IPv4,
92
+ # IPv6, or a token which is derived from the IP address, depending on
93
+ # the data that has been provided in the error report.
94
+ attr_accessor :http_remote_ip
95
+
96
+ ##
97
+ # The user who caused or was affected by the crash. This can be a user
98
+ # ID, an email address, or an arbitrary token that uniquely identifies
99
+ # the user. When sending an error report, leave this field empty if the
100
+ # user was not logged in. In this case the Error Reporting system will
101
+ # use other data, such as remote IP address, to distinguish affected
102
+ # users. See affectedUsersCount in ErrorGroupStats.
103
+ attr_accessor :user
104
+
105
+ ##
106
+ # The source code filename, which can include a truncated relative path,
107
+ # or a full path from a production machine.
108
+ attr_accessor :file_path
109
+
110
+ ##
111
+ # 1-based. 0 indicates that the line number is unknown.
112
+ attr_accessor :line_number
113
+
114
+ ##
115
+ # Human-readable name of a function or method. The value can include
116
+ # optional context like the class or package name. For example,
117
+ # my.package.MyClass.method in case of Java.
118
+ attr_accessor :function_name
119
+
120
+ ##
121
+ # Build a new ErrorEvent from a
122
+ # Google::Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent
123
+ # object.
124
+ #
125
+ # @param [
126
+ # Google::Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent]
127
+ # grpc A
128
+ # Google::Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent
129
+ # object
130
+ #
131
+ # @return [ErrorEvent] A new ErrorEvent instance derived from given grpc
132
+ # object
133
+ #
134
+ def self.from_grpc grpc
135
+ return new if grpc.nil?
136
+ new.tap do |event|
137
+ event.event_time = extract_timestamp grpc.event_time
138
+ event.message = grpc.message
139
+
140
+ extract_service_context event, grpc.service_context
141
+ extract_error_context event, grpc.context
142
+ end
143
+ end
144
+
145
+ ##
146
+ # @private Get a Time object from a Google::Protobuf::Timestamp object.
147
+ #
148
+ # @param [Google::Protobuf::Timestamp] timestamp_grpc A protobuf
149
+ # Timestamp object
150
+ #
151
+ # @return [Time] The time object derived from input grpc timestamp
152
+ #
153
+ def self.extract_timestamp timestamp_grpc
154
+ return nil if timestamp_grpc.nil?
155
+ Time.at timestamp_grpc.seconds, Rational(timestamp_grpc.nanos, 1000)
156
+ end
157
+
158
+ ##
159
+ # @private Extract service context info from gRPC into an ErrorEvent.
160
+ def self.extract_service_context error_event, service_context_grpc
161
+ return nil if service_context_grpc.nil?
162
+
163
+ error_event.service_name = service_context_grpc.service
164
+ error_event.service_version = service_context_grpc.version
165
+ end
166
+
167
+ ##
168
+ # @private Extract error context info from gRPC into an ErrorEvent.
169
+ def self.extract_error_context error_event, error_context_grpc
170
+ return nil if error_context_grpc.nil?
171
+
172
+ error_event.user = error_context_grpc.user
173
+ extract_http_request error_event, error_context_grpc.http_request
174
+ extract_source_location error_event,
175
+ error_context_grpc.report_location
176
+ end
177
+
178
+ ##
179
+ # @private Extract http request info from gRPC into an ErrorEvent.
180
+ def self.extract_http_request error_event, http_request_grpc
181
+ return nil if http_request_grpc.nil?
182
+
183
+ error_event.http_method = http_request_grpc["method"]
184
+ error_event.http_url = http_request_grpc.url
185
+ error_event.http_user_agent = http_request_grpc.user_agent
186
+ error_event.http_referrer = http_request_grpc.referrer
187
+ error_event.http_status = http_request_grpc.response_status_code
188
+ error_event.http_remote_ip = http_request_grpc.remote_ip
189
+ end
190
+
191
+ ##
192
+ # @private Extract source location info from gRPC into an ErrorEvent.
193
+ def self.extract_source_location error_event, source_location_grpc
194
+ return nil if source_location_grpc.nil?
195
+
196
+ error_event.file_path = source_location_grpc.file_path
197
+ error_event.line_number = source_location_grpc.line_number
198
+ error_event.function_name = source_location_grpc.function_name
199
+ end
200
+
201
+ private_class_method :extract_timestamp,
202
+ :extract_service_context,
203
+ :extract_error_context,
204
+ :extract_http_request,
205
+ :extract_source_location
206
+
207
+ ##
208
+ # Construct an ErrorEvent object based on a given exception.
209
+ #
210
+ # @param [Exception] exception A Ruby exception.
211
+ #
212
+ # @return [ErrorEvent] An ErrorEvent object containing information
213
+ # from the given exception.
214
+ def self.from_exception exception
215
+ backtrace = exception.backtrace
216
+ message = exception.message
217
+
218
+ unless backtrace.nil?
219
+ error_location = backtrace.first
220
+
221
+ message = "#{error_location}: #{message} (#{exception.class})\n\t" +
222
+ backtrace.drop(1).join("\n\t")
223
+ file_path, line_number, function_name = error_location.split(":")
224
+ function_name = function_name.to_s[/`(.*)'/, 1]
225
+ end
226
+
227
+ new.tap do |e|
228
+ e.message = message
229
+ e.file_path = file_path
230
+ e.line_number = line_number.to_i
231
+ e.function_name = function_name
232
+ end
233
+ end
234
+
235
+ ##
236
+ # Convert ErrorEvent object to gRPC struct.
237
+ #
238
+ # @return [Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent]
239
+ # gRPC struct that represent an ErrorEvent.
240
+ def to_grpc
241
+ error_event_hash = {
242
+ event_time: event_time_hash,
243
+ message: message,
244
+ service_context: service_context_hash,
245
+ context: error_context_hash
246
+ }.delete_if { |_, v| v.nil? }
247
+
248
+ grpc_class =
249
+ Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent
250
+ grpc_class.decode_json error_event_hash.to_json
251
+ end
252
+
253
+ private
254
+
255
+ ##
256
+ # @private Formats the event_time as the hash representation of
257
+ # Google::Protobuf::Timestamp struct.
258
+ #
259
+ def event_time_hash
260
+ return nil if event_time.nil?
261
+ {
262
+ seconds: event_time.to_i,
263
+ nanos: event_time.nsec
264
+ }
265
+ end
266
+
267
+ ##
268
+ # @private Formats the service_name and service_version as the hash
269
+ # representation of
270
+ # Google::Devtools::Clouderrorreporting::V1beta1::SourceContext struct.
271
+ #
272
+ def service_context_hash
273
+ return nil if !service_name && !service_version
274
+ {
275
+ service: service_name,
276
+ version: service_version
277
+ }.delete_if { |_, v| v.nil? }
278
+ end
279
+
280
+ ##
281
+ # @private Formats the error context info as the hash
282
+ # representation of
283
+ # Google::Devtools::Clouderrorreporting::V1beta1::ErrorContext struct.
284
+ #
285
+ def error_context_hash
286
+ http_request_hash = {
287
+ method: http_method,
288
+ url: http_url,
289
+ user_agent: http_user_agent,
290
+ referrer: http_referrer,
291
+ response_status_code: http_status,
292
+ remote_ip: http_remote_ip
293
+ }.delete_if { |_, v| v.nil? }
294
+
295
+ source_location_hash = {
296
+ file_path: file_path,
297
+ line_number: line_number,
298
+ function_name: function_name
299
+ }.delete_if { |_, v| v.nil? }
300
+
301
+ result = {
302
+ http_request: http_request_hash.empty? ? nil : http_request_hash,
303
+ user: user,
304
+ report_location:
305
+ source_location_hash.empty? ? nil : source_location_hash
306
+ }.delete_if { |_, v| v.nil? }
307
+
308
+ result.empty? ? nil : result
309
+ end
310
+ end
311
+ end
312
+ end
313
+ end
@@ -13,69 +13,51 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- require "google/cloud/env"
17
- require "google/cloud/error_reporting/v1beta1"
18
- require "rack"
19
- require "rack/request"
20
-
21
16
  module Google
22
17
  module Cloud
23
18
  module ErrorReporting
24
19
  ##
25
- # Middleware
20
+ # # Middleware
26
21
  #
27
22
  # Google::Cloud::ErrorReporting::Middleware defines a Rack Middleware
28
23
  # that can automatically catch upstream exceptions and report them
29
24
  # to Stackdriver Error Reporting.
30
25
  #
31
26
  class Middleware
32
- attr_reader :error_reporting, :ignore_classes, :project_id,
33
- :service_name, :service_version
27
+ # A Google::Cloud::ErrorReporting::Project client used to report
28
+ # error events.
29
+ attr_reader :error_reporting
34
30
 
35
31
  ##
36
- # Construct a new instance of Middleware
32
+ # Construct a new instance of Middleware.
37
33
  #
38
- # @param [Rack Application] app The Rack application
39
- # @param [
40
- # Google::Cloud::ErrorReporting::V1beta1::ReportErrorsServiceClient]
41
- # error_reporting A ErrorReporting::V1beta1::ReportErrorsServiceClient
42
- # object to for reporting exceptions
43
- # @param [String] project_id Name of GCP project. Default to
44
- # ENV["ERROR_REPORTING_PROJECT"] then ENV["GOOGLE_CLOUD_PROJECT"].
45
- # Automatically discovered if on GAE
46
- # @param [String] service_name Name of the service. Default to
47
- # ENV["ERROR_REPORTING_SERVICE"] then "ruby". Automatically discovered
48
- # if on GAE
49
- # @param [String] service_version Version of the service. Optional.
50
- # ENV["ERROR_REPORTING_VERSION"]. Automatically discovered if on GAE
51
- # @param [Array<Class>] ignore_classes A single or an array of Exception
52
- # classes to ignore
34
+ # @param [Rack::Application] app The Rack application
35
+ # @param [Google::Cloud::ErrorReporting::Project] error_reporting A
36
+ # Google::Cloud::ErrorReporting::Project client for reporting
37
+ # exceptions
38
+ # @param [Hash] *kwargs Hash of configuration settings. Used for
39
+ # backward API compatibility. See the [Configuration
40
+ # Guide](https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/stackdriver/guides/instrumentation_configuration)
41
+ # for the prefered way to set configuration parameters.
53
42
  #
54
43
  # @return [Google::Cloud::ErrorReporting::Middleware] A new instance of
55
44
  # Middleware
56
45
  #
57
- def initialize app,
58
- error_reporting: V1beta1::ReportErrorsServiceClient.new,
59
- project_id: nil,
60
- service_name: nil,
61
- service_version: nil,
62
- ignore_classes: nil
46
+ def initialize app, error_reporting: nil, **kwargs
47
+ require "rack"
48
+ require "rack/request"
63
49
  @app = app
64
- @error_reporting = error_reporting
65
- @service_name = service_name ||
66
- ENV["ERROR_REPORTING_SERVICE"] ||
67
- Google::Cloud.env.app_engine_service_id ||
68
- "ruby"
69
- @service_version = service_version ||
70
- ENV["ERROR_REPORTING_VERSION"] ||
71
- Google::Cloud.env.app_engine_service_version
72
- @ignore_classes = Array(ignore_classes)
73
- @project_id = project_id ||
74
- ENV["ERROR_REPORTING_PROJECT"] ||
75
- ENV["GOOGLE_CLOUD_PROJECT"] ||
76
- Google::Cloud.env.project_id
77
50
 
78
- fail ArgumentError, "project_id is required" if @project_id.nil?
51
+ load_config kwargs
52
+
53
+ @error_reporting =
54
+ error_reporting ||
55
+ ErrorReporting.new(project: configuration.project_id,
56
+ keyfile: configuration.keyfile)
57
+
58
+ # Set module default client to reuse the same client. Update module
59
+ # configuration parameters.
60
+ ErrorReporting.class_variable_set :@@default_client, @error_reporting
79
61
  end
80
62
 
81
63
  ##
@@ -116,23 +98,22 @@ module Google
116
98
  #
117
99
  def report_exception env, exception
118
100
  # Do not any exceptions that's specified by the ignore_classes list.
119
- return if ignore_classes.include? exception.class
101
+ return if configuration.ignore_classes.include? exception.class
120
102
 
121
- error_event_grpc = build_error_event_from_exception env, exception
103
+ error_event = error_event_from_exception env, exception
122
104
 
123
105
  # If this exception maps to a HTTP status code less than 500, do
124
106
  # not report it.
125
- status_code =
126
- error_event_grpc.context.http_request.response_status_code.to_i
107
+ status_code = error_event.http_status.to_i
127
108
  return if status_code > 0 && status_code < 500
128
109
 
129
- error_reporting.report_error_event full_project_id, error_event_grpc
110
+ error_reporting.report error_event
130
111
  end
131
112
 
132
113
  ##
133
- # Creates a GRPC ErrorEvent based on the exception. Fill in the
134
- # HttpRequestContext section of the ErrorEvent based on the HTTP Request
135
- # headers.
114
+ # Creates a {Google::Cloud::ErrorReporting::ErrorEvent} based on the
115
+ # exception. Fill in the HttpRequestContext section of the ErrorEvent
116
+ # based on the HTTP Request headers.
136
117
  #
137
118
  # When used in Rails environment. It replies on
138
119
  # ActionDispatch::ExceptionWrapper class to derive a HTTP status code
@@ -141,56 +122,74 @@ module Google
141
122
  # @param [Hash] env Rack environment hash
142
123
  # @param [Exception] exception Exception to convert from
143
124
  #
144
- # @return [
145
- # Google::Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent]
146
- # The gRPC ReportedErrorEvent object that's based
147
- # on given exception
125
+ # @return [Google::Cloud::ErrorReporting::ErrorEvent] The gRPC
126
+ # ErrorEvent object that's based on given env and exception
148
127
  #
149
- def build_error_event_from_exception env, exception
150
- error_event = ErrorEvent.from_exception exception
128
+ def error_event_from_exception env, exception
129
+ error_event = ErrorReporting::ErrorEvent.from_exception exception
151
130
 
152
131
  # Inject service_context info into error_event object
153
- error_event[:service_context] = {
154
- service: service_name,
155
- version: service_version
156
- }.delete_if { |_, v| v.nil? }
132
+ error_event.service_name = configuration.service_name
133
+ error_event.service_version = configuration.service_version
157
134
 
158
135
  # Inject http_request_context info into error_event object
159
136
  rack_request = Rack::Request.new env
160
- error_event[:context][:http_request] = {
161
- method: rack_request.request_method,
162
- url: rack_request.url,
163
- user_agent: rack_request.user_agent,
164
- referrer: rack_request.referrer,
165
- response_status_code: get_http_status(exception),
166
- remote_ip: rack_request.ip
167
- }.delete_if { |_, v| v.nil? }
168
-
169
- error_event.to_grpc
137
+ error_event.http_method = rack_request.request_method
138
+ error_event.http_url = rack_request.url
139
+ error_event.http_user_agent = rack_request.user_agent
140
+ error_event.http_referrer = rack_request.referrer
141
+ error_event.http_status = http_status(exception)
142
+ error_event.http_remote_ip = rack_request.ip
143
+
144
+ error_event
170
145
  end
171
146
 
147
+ private
148
+
172
149
  ##
173
- # Build full ReportErrorsServiceClient project_path from project_id,
174
- # which is in "projects/#{project_id}" format.
175
- #
176
- # @return [String] fully qualified project id in
177
- # "projects/#{project_id}" format
178
- def full_project_id
179
- V1beta1::ReportErrorsServiceClient.project_path project_id
150
+ # Consolidate configurations from various sources. Also set
151
+ # instrumentation config parameters to default values if not set
152
+ # already.
153
+ #
154
+ def load_config **kwargs
155
+ configuration.project_id = kwargs[:project_id] ||
156
+ configuration.project_id
157
+ configuration.keyfile = kwargs[:keyfile] ||
158
+ configuration.keyfile
159
+ configuration.service_name = kwargs[:service_name] ||
160
+ configuration.service_name
161
+ configuration.service_version = kwargs[:service_version] ||
162
+ configuration.service_version
163
+ configuration.ignore_classes = kwargs[:ignore_classes] ||
164
+ configuration.ignore_classes
165
+
166
+ init_default_config
180
167
  end
181
168
 
182
- private
169
+ ##
170
+ # Fallback to default configuration values if not defined already
171
+ def init_default_config
172
+ configuration.project_id ||= Cloud.configure.project_id ||
173
+ ErrorReporting::Project.default_project
174
+ configuration.keyfile ||= Cloud.configure.keyfile
175
+ configuration.service_name ||=
176
+ ErrorReporting::Project.default_service_name
177
+
178
+ configuration.service_version ||=
179
+ ErrorReporting::Project.default_service_version
180
+ configuration.ignore_classes = Array(configuration.ignore_classes)
181
+ end
183
182
 
184
183
  ##
185
184
  # Helper method to derive HTTP status code base on exception class in
186
- # Rails. Returns nil if not in Rails environment
185
+ # Rails. Returns nil if not in Rails environment.
187
186
  #
188
187
  # @param [Exception] exception An Ruby exception
189
188
  #
190
189
  # @return [Integer] A number that represents HTTP status code or nil if
191
190
  # status code can't be determined
192
191
  #
193
- def get_http_status exception
192
+ def http_status exception
194
193
  http_status = nil
195
194
  if defined?(ActionDispatch::ExceptionWrapper) &&
196
195
  ActionDispatch::ExceptionWrapper.respond_to?(
@@ -206,108 +205,10 @@ module Google
206
205
  end
207
206
 
208
207
  ##
209
- # This class implements a hash representation of
210
- # Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent
211
- class ErrorEvent
212
- # Internal data structure mirroring gRPC ReportedErrorEvent structure
213
- attr_reader :hash
214
-
215
- ##
216
- # Construct a new ErrorEvent object
217
- #
218
- # @return [ErrorEvent] A new ErrorEvent object
219
- def initialize
220
- @hash = {}
221
- end
222
-
223
- ##
224
- # Construct an ErrorEvent object based on a given exception
225
- #
226
- # @param [Exception] exception A Ruby exception
227
- #
228
- # @return [ErrorEvent] An ErrorEvent object containing information
229
- # from the given exception
230
- def self.from_exception exception
231
- exception_data = extract_exception exception
232
-
233
- # Build error_context hash
234
- error_context = {
235
- user: ENV["USER"],
236
- report_location: {
237
- file_path: exception_data[:file_path],
238
- function_name: exception_data[:function_name],
239
- line_number: exception_data[:line_number].to_i
240
- }.delete_if { |_, v| v.nil? }
241
- }.delete_if { |_, v| v.nil? }
242
-
243
- # Build error_event hash
244
- error_event = ErrorEvent.new
245
- t = Time.now
246
- error_event.hash.merge!({
247
- event_time: {
248
- seconds: t.to_i,
249
- nanos: t.nsec
250
- },
251
- message: exception_data[:message],
252
- context: error_context
253
- }.delete_if { |_, v| v.nil? })
254
-
255
- error_event
256
- end
257
-
258
- ##
259
- # Helper method extract data from exception
260
- #
261
- # @param [Exception] exception A Ruby Exception
262
- #
263
- # @return [Hash] A hash containing formatted error message with
264
- # backtrace, file_path, line_number, and function_name
265
- def self.extract_exception exception
266
- if exception.backtrace.nil? || exception.backtrace.empty?
267
- message = exception.message
268
- else
269
- message = "#{exception.backtrace.first}: #{exception.message} " \
270
- "(#{exception.class})\n\t" +
271
- exception.backtrace.drop(1).join("\n\t")
272
- file_path, line_number, function_name =
273
- exception.backtrace.first.split(":")
274
- function_name = function_name.to_s[/`(.*)'/, 1]
275
- end
276
-
277
- {
278
- message: message,
279
- file_path: file_path,
280
- line_number: line_number,
281
- function_name: function_name
282
- }
283
- end
284
- private_class_method :extract_exception
285
-
286
- ##
287
- # Get the value of the given key from internal hash
288
- def [] key
289
- hash[key]
290
- end
291
-
292
- ##
293
- # Write new value with the key in internal hash
294
- def []= key, value
295
- hash[key] = value
296
- end
297
-
298
- ##
299
- # Convert ErrorEvent object to gRPC struct
300
- #
301
- # @return [Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent]
302
- # gRPC struct that represent an ErrorEvent
303
- def to_grpc
304
- grpc_module =
305
- Devtools::Clouderrorreporting::V1beta1::ReportedErrorEvent
306
- grpc_module.decode_json hash.to_json
307
- end
208
+ # @private Get Google::Cloud::ErrorReporting.configure
209
+ def configuration
210
+ Google::Cloud::ErrorReporting.configure
308
211
  end
309
-
310
- private_constant :ErrorEvent
311
212
  end
312
213
  end
313
214
  end