google-cloud-debugger 0.25.0 → 0.26.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -878,6 +878,33 @@ module Google
878
878
  result
879
879
  end
880
880
 
881
+ ##
882
+ # Format log message by interpolate expressions.
883
+ #
884
+ # @example
885
+ # Evaluator.format_log_message("Hello $0",
886
+ # ["World"]) #=> "Hello World"
887
+ #
888
+ # @param [String] message_format The message with with
889
+ # expression placeholders such as `$0`, `$1`, etc.
890
+ # @param [Array<Google::Cloud::Debugger::Breakpoint::Variable>]
891
+ # expressions An array of evaluated expression variables to be
892
+ # placed into message_format's placeholders. The variables need
893
+ # to have type equal String.
894
+ #
895
+ # @return [String] The formatted message string
896
+ #
897
+ def format_message message_format, expressions
898
+ # Substitute placeholders with expressions
899
+ message = message_format.gsub(/(?<!\$)\$\d+/) do |placeholder|
900
+ index = placeholder.match(/\$(\d+)/)[1].to_i
901
+ index < expressions.size ? expressions[index].inspect : ""
902
+ end
903
+
904
+ # Unescape "$" charactors
905
+ message.gsub(/\$\$/, "$")
906
+ end
907
+
881
908
  private
882
909
 
883
910
  ##
@@ -32,6 +32,11 @@ module Google
32
32
  class BreakpointManager
33
33
  include MonitorMixin
34
34
 
35
+ ##
36
+ # The debugger agent this tracer belongs to
37
+ # @return [Google::Cloud::Debugger::Agent]
38
+ attr_reader :agent
39
+
35
40
  ##
36
41
  # @private The gRPC Service object.
37
42
  attr_reader :service
@@ -53,9 +58,10 @@ module Google
53
58
 
54
59
  ##
55
60
  # @private Construct new instance of BreakpointManager
56
- def initialize service
61
+ def initialize agent, service
57
62
  super()
58
63
 
64
+ @agent = agent
59
65
  @service = service
60
66
 
61
67
  @completed_breakpoints = []
@@ -133,6 +139,58 @@ module Google
133
139
  end
134
140
  end
135
141
 
142
+ ##
143
+ # Evaluates a hit breakpoint, and submit the breakpoint to
144
+ # Transmitter if this breakpoint is evaluated successfully.
145
+ #
146
+ # See {Breakpoint#evaluate} for evaluation details.
147
+ #
148
+ # @param [Google::Cloud::Debugger::Breakpoint] breakpoint The breakpoint
149
+ # to be evaluated
150
+ # @param [Array<Binding>] call_stack_bindings An array of Ruby Binding
151
+ # objects, from the each frame of the call stack that leads to the
152
+ # triggering of the breakpoints.
153
+ #
154
+ def breakpoint_hit breakpoint, call_stack_bindings
155
+ breakpoint.evaluate call_stack_bindings
156
+
157
+ case breakpoint.action
158
+ when :CAPTURE
159
+ # Take this completed breakpoint off manager's active breakpoints
160
+ # list, submit the breakpoint snapshot, and update Tracer's
161
+ # breakpoints_cache.
162
+ return unless breakpoint.complete?
163
+
164
+ # Remove this breakpoint from active list
165
+ mark_off breakpoint
166
+ # Signal transmitter to submit this breakpoint
167
+ agent.transmitter.submit breakpoint
168
+ when :LOG
169
+ log_logpoint breakpoint
170
+ end
171
+ end
172
+
173
+ ##
174
+ # Assume the given logpoint is successfully evaluated, log the
175
+ # evaluated log message via logger
176
+ #
177
+ # @param [Google::Cloud::Debugger::Breakpoint] logpoint The evaluated
178
+ # logpoint.
179
+ def log_logpoint logpoint
180
+ return unless agent.logger && logpoint.evaluated_log_message
181
+
182
+ message = "LOGPOINT: #{logpoint.evaluated_log_message}"
183
+
184
+ case logpoint.log_level
185
+ when :INFO
186
+ agent.logger.info message
187
+ when :WARNING
188
+ agent.logger.warn message
189
+ when :ERROR
190
+ agent.logger.error message
191
+ end
192
+ end
193
+
136
194
  ##
137
195
  # Mark a given active breakpoint as completed. Meaning moving it from
138
196
  # list of active breakpoints to completed breakpoints.
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
+ require "google/cloud/logging/logger"
17
+
16
18
  module Google
17
19
  module Cloud
18
20
  module Debugger
@@ -47,6 +49,7 @@ module Google
47
49
  keyfile: configuration.keyfile,
48
50
  module_name: configuration.module_name,
49
51
  module_version: configuration.module_version)
52
+
50
53
  # Immediately start the debugger agent
51
54
  @debugger.start
52
55
  end
@@ -65,6 +68,11 @@ module Google
65
68
  # Enable/resume breakpoints tracing
66
69
  @debugger.agent.tracer.start
67
70
 
71
+ # Use Stackdriver Logger for debugger if available
72
+ if env["rack.logger"].is_a? Google::Cloud::Logging::Logger
73
+ @debugger.agent.logger = env["rack.logger"]
74
+ end
75
+
68
76
  @app.call env
69
77
  ensure
70
78
  # Stop breakpoints tracing beyond this point
@@ -103,31 +103,14 @@ module Google
103
103
  end
104
104
 
105
105
  ##
106
- # Evaluates a hit breakpoint, and signal BreakpointManager and
107
- # Transmitter if this breakpoint is evaluated successfully.
106
+ # Callback function when a breakpoint is hit. Handover the hit
107
+ # breakpoint to breakpoint_manager to be evaluated.
108
108
  #
109
- # See {Breakpoint#eval_call_stack} for evaluation details.
110
- #
111
- # @param [Google::Cloud::Debugger::Breakpoint] breakpoint The breakpoint
112
- # to be evaluated
113
- # @param [Array<Binding>] call_stack_bindings An array of Ruby Binding
114
- # objects, from the each frame of the call stack that leads to the
115
- # triggering of the breakpoints.
116
- #
117
- def eval_breakpoint breakpoint, call_stack_bindings
109
+ def breakpoint_hit breakpoint, call_stack_bindings
118
110
  return if breakpoint.nil? || breakpoint.complete?
119
111
 
120
- breakpoint.eval_call_stack call_stack_bindings
121
-
122
- # Take this completed breakpoint off manager's active breakpoints
123
- # list, submit the breakpoint snapshot, and update Tracer's
124
- # breakpoints_cache.
125
- return unless breakpoint.complete?
126
-
127
- # Signal breakpoint_manager that this breakpoint is evaluated
128
- agent.breakpoint_manager.mark_off breakpoint
129
- # Signal transmitter to submit this breakpoint
130
- agent.transmitter.submit breakpoint
112
+ agent.breakpoint_manager.breakpoint_hit breakpoint,
113
+ call_stack_bindings
131
114
 
132
115
  update_breakpoints_cache
133
116
 
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- require "google/cloud/debugger/async_actor"
16
+ require "stackdriver/core/async_actor"
17
17
 
18
18
  module Google
19
19
  module Cloud
@@ -32,7 +32,7 @@ module Google
32
32
  # interaction with the rest debugger agent components
33
33
  #
34
34
  class Transmitter
35
- include AsyncActor
35
+ include Stackdriver::Core::AsyncActor
36
36
 
37
37
  ##
38
38
  # @private Default maximum backlog size for the job queue
@@ -53,12 +53,13 @@ module Google
53
53
 
54
54
  ##
55
55
  # @private Construct a new instance of Tramsnitter
56
- def initialize service, agent, max_queue_size = DEFAULT_MAX_QUEUE_SIZE
56
+ def initialize agent, service, max_queue_size = DEFAULT_MAX_QUEUE_SIZE
57
57
  super()
58
58
  @service = service
59
59
  @agent = agent
60
60
  @max_queue_size = max_queue_size
61
- @queue = Thread::Queue.new
61
+ @queue = []
62
+ @queue_resource = new_cond
62
63
  end
63
64
 
64
65
  ##
@@ -82,7 +83,7 @@ module Google
82
83
  def submit breakpoint
83
84
  synchronize do
84
85
  @queue.push breakpoint
85
- @lock_cond.broadcast
86
+ @queue_resource.broadcast
86
87
  # Discard old entries if queue gets too large
87
88
  @queue.pop while @queue.size > @max_queue_size
88
89
  end
@@ -101,6 +102,14 @@ module Google
101
102
  end
102
103
  end
103
104
 
105
+ ##
106
+ # @private Callback function when the async actor thread state changes
107
+ def on_async_state_change
108
+ synchronize do
109
+ @queue_resource.broadcast
110
+ end
111
+ end
112
+
104
113
  private
105
114
 
106
115
  ##
@@ -109,18 +118,20 @@ module Google
109
118
  # enqueued
110
119
  def wait_next_item
111
120
  synchronize do
112
- @lock_cond.wait_while do
113
- async_state == :suspended ||
114
- (async_state == :running && @queue.empty?)
115
- end
116
- queue_item = nil
117
- if @queue.empty?
118
- @async_state = :stopped
119
- else
120
- queue_item = @queue.pop
121
+ @queue_resource.wait_while do
122
+ async_suspended? || (async_running? && @queue.empty?)
121
123
  end
122
- @lock_cond.broadcast
123
- queue_item
124
+ @queue.pop
125
+ end
126
+ end
127
+
128
+ ##
129
+ # @private Override the #backgrounder_stoppable? method from AsyncActor
130
+ # module. The actor can be gracefully stopped when queue is
131
+ # empty.
132
+ def backgrounder_stoppable?
133
+ synchronize do
134
+ @queue.empty?
124
135
  end
125
136
  end
126
137
  end
@@ -11,5 +11,5 @@
11
11
  # See the License for the specific language governing permissions and
12
12
  # limitations under the License.
13
13
 
14
- require "google/cloud/debugger/v2/controller2_client"
15
14
  require "google/cloud/debugger/v2/debugger2_client"
15
+ require "google/cloud/debugger/v2/controller2_client"
@@ -82,6 +82,12 @@ module Google
82
82
  # A Channel object through which to make calls.
83
83
  # @param chan_creds [Grpc::ChannelCredentials]
84
84
  # A ChannelCredentials for the setting up the RPC client.
85
+ # @param updater_proc [Proc]
86
+ # A function that transforms the metadata for requests, e.g., to give
87
+ # OAuth credentials.
88
+ # @param scopes [Array<String>]
89
+ # The OAuth scopes for this service. This parameter is ignored if
90
+ # an updater_proc is supplied.
85
91
  # @param client_config[Hash]
86
92
  # A Hash for call options for each method. See
87
93
  # Google::Gax#construct_settings for the structure of
@@ -94,6 +100,7 @@ module Google
94
100
  port: DEFAULT_SERVICE_PORT,
95
101
  channel: nil,
96
102
  chan_creds: nil,
103
+ updater_proc: nil,
97
104
  scopes: ALL_SCOPES,
98
105
  client_config: {},
99
106
  timeout: DEFAULT_TIMEOUT,
@@ -138,6 +145,7 @@ module Google
138
145
  port,
139
146
  chan_creds: chan_creds,
140
147
  channel: channel,
148
+ updater_proc: updater_proc,
141
149
  scopes: scopes,
142
150
  &Google::Devtools::Clouddebugger::V2::Controller2::Stub.method(:new)
143
151
  )
@@ -179,7 +187,7 @@ module Google
179
187
  # @return [Google::Devtools::Clouddebugger::V2::RegisterDebuggeeResponse]
180
188
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
181
189
  # @example
182
- # require "google/cloud/debugger/v2/controller2_client"
190
+ # require "google/cloud/debugger/v2"
183
191
  #
184
192
  # Controller2Client = Google::Cloud::Debugger::V2::Controller2Client
185
193
  # Debuggee = Google::Devtools::Clouddebugger::V2::Debuggee
@@ -230,7 +238,7 @@ module Google
230
238
  # @return [Google::Devtools::Clouddebugger::V2::ListActiveBreakpointsResponse]
231
239
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
232
240
  # @example
233
- # require "google/cloud/debugger/v2/controller2_client"
241
+ # require "google/cloud/debugger/v2"
234
242
  #
235
243
  # Controller2Client = Google::Cloud::Debugger::V2::Controller2Client
236
244
  #
@@ -272,7 +280,7 @@ module Google
272
280
  # @return [Google::Devtools::Clouddebugger::V2::UpdateActiveBreakpointResponse]
273
281
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
274
282
  # @example
275
- # require "google/cloud/debugger/v2/controller2_client"
283
+ # require "google/cloud/debugger/v2"
276
284
  #
277
285
  # Breakpoint = Google::Devtools::Clouddebugger::V2::Breakpoint
278
286
  # Controller2Client = Google::Cloud::Debugger::V2::Controller2Client
@@ -6,9 +6,7 @@
6
6
  "DEADLINE_EXCEEDED",
7
7
  "UNAVAILABLE"
8
8
  ],
9
- "non_idempotent": [
10
- "UNAVAILABLE"
11
- ]
9
+ "non_idempotent": []
12
10
  },
13
11
  "retry_params": {
14
12
  "default": {
@@ -74,6 +74,12 @@ module Google
74
74
  # A Channel object through which to make calls.
75
75
  # @param chan_creds [Grpc::ChannelCredentials]
76
76
  # A ChannelCredentials for the setting up the RPC client.
77
+ # @param updater_proc [Proc]
78
+ # A function that transforms the metadata for requests, e.g., to give
79
+ # OAuth credentials.
80
+ # @param scopes [Array<String>]
81
+ # The OAuth scopes for this service. This parameter is ignored if
82
+ # an updater_proc is supplied.
77
83
  # @param client_config[Hash]
78
84
  # A Hash for call options for each method. See
79
85
  # Google::Gax#construct_settings for the structure of
@@ -86,6 +92,7 @@ module Google
86
92
  port: DEFAULT_SERVICE_PORT,
87
93
  channel: nil,
88
94
  chan_creds: nil,
95
+ updater_proc: nil,
89
96
  scopes: ALL_SCOPES,
90
97
  client_config: {},
91
98
  timeout: DEFAULT_TIMEOUT,
@@ -130,6 +137,7 @@ module Google
130
137
  port,
131
138
  chan_creds: chan_creds,
132
139
  channel: channel,
140
+ updater_proc: updater_proc,
133
141
  scopes: scopes,
134
142
  &Google::Devtools::Clouddebugger::V2::Debugger2::Stub.method(:new)
135
143
  )
@@ -174,7 +182,7 @@ module Google
174
182
  # @return [Google::Devtools::Clouddebugger::V2::SetBreakpointResponse]
175
183
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
176
184
  # @example
177
- # require "google/cloud/debugger/v2/debugger2_client"
185
+ # require "google/cloud/debugger/v2"
178
186
  #
179
187
  # Breakpoint = Google::Devtools::Clouddebugger::V2::Breakpoint
180
188
  # Debugger2Client = Google::Cloud::Debugger::V2::Debugger2Client
@@ -213,7 +221,7 @@ module Google
213
221
  # @return [Google::Devtools::Clouddebugger::V2::GetBreakpointResponse]
214
222
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
215
223
  # @example
216
- # require "google/cloud/debugger/v2/debugger2_client"
224
+ # require "google/cloud/debugger/v2"
217
225
  #
218
226
  # Debugger2Client = Google::Cloud::Debugger::V2::Debugger2Client
219
227
  #
@@ -250,7 +258,7 @@ module Google
250
258
  # retries, etc.
251
259
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
252
260
  # @example
253
- # require "google/cloud/debugger/v2/debugger2_client"
261
+ # require "google/cloud/debugger/v2"
254
262
  #
255
263
  # Debugger2Client = Google::Cloud::Debugger::V2::Debugger2Client
256
264
  #
@@ -304,7 +312,7 @@ module Google
304
312
  # @return [Google::Devtools::Clouddebugger::V2::ListBreakpointsResponse]
305
313
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
306
314
  # @example
307
- # require "google/cloud/debugger/v2/debugger2_client"
315
+ # require "google/cloud/debugger/v2"
308
316
  #
309
317
  # Debugger2Client = Google::Cloud::Debugger::V2::Debugger2Client
310
318
  #
@@ -350,7 +358,7 @@ module Google
350
358
  # @return [Google::Devtools::Clouddebugger::V2::ListDebuggeesResponse]
351
359
  # @raise [Google::Gax::GaxError] if the RPC is aborted.
352
360
  # @example
353
- # require "google/cloud/debugger/v2/debugger2_client"
361
+ # require "google/cloud/debugger/v2"
354
362
  #
355
363
  # Debugger2Client = Google::Cloud::Debugger::V2::Debugger2Client
356
364
  #
@@ -6,9 +6,7 @@
6
6
  "DEADLINE_EXCEEDED",
7
7
  "UNAVAILABLE"
8
8
  ],
9
- "non_idempotent": [
10
- "UNAVAILABLE"
11
- ]
9
+ "non_idempotent": []
12
10
  },
13
11
  "retry_params": {
14
12
  "default": {
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Debugger
19
- VERSION = "0.25.0"
19
+ VERSION = "0.26.1"
20
20
  end
21
21
  end
22
22
  end
@@ -22,6 +22,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
22
22
  value :BREAKPOINT_SOURCE_LOCATION, 3
23
23
  value :BREAKPOINT_CONDITION, 4
24
24
  value :BREAKPOINT_EXPRESSION, 7
25
+ value :BREAKPOINT_AGE, 8
25
26
  value :VARIABLE_NAME, 5
26
27
  value :VARIABLE_VALUE, 6
27
28
  end