right_agent 2.2.1 → 2.3.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.
- checksums.yaml +7 -0
- data/lib/right_agent.rb +1 -0
- data/lib/right_agent/actor.rb +0 -28
- data/lib/right_agent/actors/agent_manager.rb +20 -18
- data/lib/right_agent/agent.rb +69 -87
- data/lib/right_agent/agent_tag_manager.rb +1 -1
- data/lib/right_agent/clients/api_client.rb +0 -1
- data/lib/right_agent/clients/auth_client.rb +2 -6
- data/lib/right_agent/clients/balanced_http_client.rb +2 -2
- data/lib/right_agent/clients/base_retry_client.rb +12 -19
- data/lib/right_agent/clients/right_http_client.rb +1 -5
- data/lib/right_agent/clients/router_client.rb +8 -15
- data/lib/right_agent/command/command_parser.rb +3 -3
- data/lib/right_agent/command/command_runner.rb +1 -1
- data/lib/right_agent/connectivity_checker.rb +7 -11
- data/lib/right_agent/dispatcher.rb +7 -42
- data/lib/right_agent/enrollment_result.rb +2 -2
- data/lib/right_agent/error_tracker.rb +202 -0
- data/lib/right_agent/log.rb +0 -2
- data/lib/right_agent/packets.rb +1 -1
- data/lib/right_agent/pending_requests.rb +10 -4
- data/lib/right_agent/pid_file.rb +3 -3
- data/lib/right_agent/protocol_version_mixin.rb +3 -3
- data/lib/right_agent/scripts/agent_deployer.rb +13 -1
- data/lib/right_agent/sender.rb +14 -30
- data/lib/right_agent/serialize/secure_serializer.rb +4 -4
- data/right_agent.gemspec +2 -2
- data/spec/agent_spec.rb +5 -5
- data/spec/clients/auth_client_spec.rb +1 -1
- data/spec/clients/balanced_http_client_spec.rb +4 -2
- data/spec/clients/base_retry_client_spec.rb +5 -6
- data/spec/clients/router_client_spec.rb +1 -4
- data/spec/dispatcher_spec.rb +6 -55
- data/spec/error_tracker_spec.rb +293 -0
- data/spec/pending_requests_spec.rb +2 -2
- data/spec/sender_spec.rb +3 -3
- data/spec/spec_helper.rb +4 -2
- metadata +33 -66
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eb258d0df08bc7694ac92eb41a9e819eebfc8d6a
|
4
|
+
data.tar.gz: 6e5674fe87ac4372a3ae2479cae0f7911b65bc54
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fc15f988d7292135374f76a736570d746669d8ab369435723c8b10f5ef8e229d41864dc122fd92658b46c4a1ebc5d67229dfad0fe78e1611a59162ded66ba39a
|
7
|
+
data.tar.gz: 060fdb4a7cb60604c45c4498add812ac079388edbf417bd4bc8fc0d83e2c9449101f369db7ba9f29c8d9d65a44dc36ee7b8788aa6a0ee4cc74daf38a6283b936
|
data/lib/right_agent.rb
CHANGED
@@ -34,6 +34,7 @@ require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'console'))
|
|
34
34
|
require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'daemonize'))
|
35
35
|
require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'exceptions'))
|
36
36
|
require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'http_exceptions'))
|
37
|
+
require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'error_tracker'))
|
37
38
|
require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'multiplexer'))
|
38
39
|
require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'tracer'))
|
39
40
|
require File.normalize_path(File.join(RIGHT_AGENT_BASE_DIR, 'audit_formatter'))
|
data/lib/right_agent/actor.rb
CHANGED
@@ -128,34 +128,6 @@ module RightScale
|
|
128
128
|
@exposed[method] if @exposed
|
129
129
|
end
|
130
130
|
|
131
|
-
# Set method called when dispatching to this actor fails
|
132
|
-
#
|
133
|
-
# The callback method is required to accept the following parameters:
|
134
|
-
# method(Symbol):: Actor method being dispatched to
|
135
|
-
# deliverable(Packet):: Packet delivered to dispatcher
|
136
|
-
# exception(Exception):: Exception raised
|
137
|
-
#
|
138
|
-
# === Parameters
|
139
|
-
# proc(Proc|Symbol|String):: Procedure to be called on exception
|
140
|
-
#
|
141
|
-
# === Block
|
142
|
-
# Block to be executed if no Proc provided
|
143
|
-
#
|
144
|
-
# === Return
|
145
|
-
# @exception_callback(Proc):: Callback procedure
|
146
|
-
def on_exception(proc = nil, &blk)
|
147
|
-
raise 'No callback provided for on_exception' unless proc || blk
|
148
|
-
@exception_callback = proc || blk
|
149
|
-
end
|
150
|
-
|
151
|
-
# Get exception callback procedure
|
152
|
-
#
|
153
|
-
# === Return
|
154
|
-
# @exception_callback(Proc):: Callback procedure
|
155
|
-
def exception_callback
|
156
|
-
@exception_callback
|
157
|
-
end
|
158
|
-
|
159
131
|
end # ClassMethods
|
160
132
|
|
161
133
|
module InstanceMethods
|
@@ -28,8 +28,6 @@ class AgentManager
|
|
28
28
|
include RightScale::Actor
|
29
29
|
include RightScale::OperationResultHelper
|
30
30
|
|
31
|
-
on_exception { |meth, deliverable, e| RightScale::ExceptionMailer.deliver_notification(meth, deliverable, e) }
|
32
|
-
|
33
31
|
expose_idempotent :ping, :stats, :profile, :set_log_level, :connect, :disconnect, :connect_failed
|
34
32
|
expose_non_idempotent :execute, :terminate
|
35
33
|
|
@@ -42,6 +40,7 @@ class AgentManager
|
|
42
40
|
# agent(RightScale::Agent):: This agent
|
43
41
|
def initialize(agent)
|
44
42
|
@agent = agent
|
43
|
+
@error_tracker = RightScale::ErrorTracker.instance
|
45
44
|
end
|
46
45
|
|
47
46
|
# Always return success along with identity, protocol version, and broker information
|
@@ -140,7 +139,7 @@ class AgentManager
|
|
140
139
|
begin
|
141
140
|
success_result(self.instance_eval(code))
|
142
141
|
rescue Exception => e
|
143
|
-
error_result(
|
142
|
+
error_result("Failed executing: #{code.inspect}", e, :trace)
|
144
143
|
end
|
145
144
|
end
|
146
145
|
|
@@ -157,18 +156,19 @@ class AgentManager
|
|
157
156
|
# :force(Boolean):: Reconnect even if already connected
|
158
157
|
#
|
159
158
|
# === Return
|
160
|
-
#
|
159
|
+
# (RightScale::OperationResult):: Success unless exception is raised
|
161
160
|
def connect(options)
|
162
161
|
options = RightScale::SerializationHelper.symbolize_keys(options)
|
163
|
-
|
162
|
+
result = success_result
|
164
163
|
begin
|
165
164
|
if (error = @agent.connect(options[:host], options[:port], options[:id], options[:priority], options[:force]))
|
166
|
-
|
165
|
+
result = error_result(error)
|
167
166
|
end
|
168
167
|
rescue Exception => e
|
169
|
-
|
168
|
+
@error_tracker.log(self, error = "Failed to connect to broker", e)
|
169
|
+
result = error_result(error, e)
|
170
170
|
end
|
171
|
-
|
171
|
+
result
|
172
172
|
end
|
173
173
|
|
174
174
|
# Disconnect agent from a broker
|
@@ -180,18 +180,19 @@ class AgentManager
|
|
180
180
|
# :remove(Boolean):: Remove broker from configuration in addition to disconnecting it
|
181
181
|
#
|
182
182
|
# === Return
|
183
|
-
#
|
183
|
+
# (RightScale::OperationResult):: Success unless exception is raised
|
184
184
|
def disconnect(options)
|
185
185
|
options = RightScale::SerializationHelper.symbolize_keys(options)
|
186
|
-
|
186
|
+
result = success_result
|
187
187
|
begin
|
188
188
|
if (error = @agent.disconnect(options[:host], options[:port], options[:remove]))
|
189
|
-
|
189
|
+
result = error_result(error)
|
190
190
|
end
|
191
191
|
rescue Exception => e
|
192
|
-
|
192
|
+
@error_tracker.log(self, error = "Failed to disconnect from broker", e)
|
193
|
+
result = error_result(error, e)
|
193
194
|
end
|
194
|
-
|
195
|
+
result
|
195
196
|
end
|
196
197
|
|
197
198
|
# Declare one or more broker connections unusable because connection setup has failed
|
@@ -201,18 +202,19 @@ class AgentManager
|
|
201
202
|
# :brokers(Array):: Identity of brokers
|
202
203
|
#
|
203
204
|
# === Return
|
204
|
-
#
|
205
|
+
# (RightScale::OperationResult):: Success unless exception is raised
|
205
206
|
def connect_failed(options)
|
206
207
|
options = RightScale::SerializationHelper.symbolize_keys(options)
|
207
|
-
|
208
|
+
result = success_result
|
208
209
|
begin
|
209
210
|
if (error = @agent.connect_failed(options[:brokers]))
|
210
|
-
|
211
|
+
result = error_result(error)
|
211
212
|
end
|
212
213
|
rescue Exception => e
|
213
|
-
|
214
|
+
@error_tracker.log(self, error = "Failed to notify agent that brokers #{options[:brokers]} are unusable", e)
|
215
|
+
result = error_result(error, e)
|
214
216
|
end
|
215
|
-
|
217
|
+
result
|
216
218
|
end
|
217
219
|
|
218
220
|
# Terminate self
|
data/lib/right_agent/agent.rb
CHANGED
@@ -57,9 +57,6 @@ module RightScale
|
|
57
57
|
# (Array) Tag strings published by agent
|
58
58
|
attr_accessor :tags
|
59
59
|
|
60
|
-
# (Proc) Callback procedure for exceptions
|
61
|
-
attr_reader :exception_callback
|
62
|
-
|
63
60
|
# Default option settings for the agent
|
64
61
|
DEFAULT_OPTIONS = {
|
65
62
|
:user => 'agent',
|
@@ -90,6 +87,15 @@ module RightScale
|
|
90
87
|
# Block to be activated when finish terminating
|
91
88
|
TERMINATE_BLOCK = lambda { EM.stop if EM.reactor_running? }
|
92
89
|
|
90
|
+
# Exceptions with restricted error backtrace level
|
91
|
+
# Value :no_trace means no backtrace and no tracking in stats or reporting to Errbit
|
92
|
+
TRACE_LEVEL = {
|
93
|
+
RightSupport::Net::NoResult => :no_trace,
|
94
|
+
RightScale::Exceptions::ConnectivityFailure => :no_trace,
|
95
|
+
RightScale::BalancedHttpClient::NotResponding => :no_trace,
|
96
|
+
RightAMQP::HABrokerClient::NoConnectedBrokers => :no_trace
|
97
|
+
}
|
98
|
+
|
93
99
|
# Initializes a new agent and establishes an HTTP or AMQP RightNet connection
|
94
100
|
# This must be used inside an EM.run block unless the EventMachine reactor
|
95
101
|
# was already started by the server that this application runs on
|
@@ -129,10 +135,8 @@ module RightScale
|
|
129
135
|
# :prefetch(Integer):: Maximum number of messages the AMQP broker is to prefetch for this agent
|
130
136
|
# before it receives an ack. Value 1 ensures that only last unacknowledged gets redelivered
|
131
137
|
# if the agent crashes. Value 0 means unlimited prefetch.
|
132
|
-
# :
|
133
|
-
#
|
134
|
-
# message(Packet):: Message being processed
|
135
|
-
# agent(Agent):: Reference to agent
|
138
|
+
# :airbrake_endpoint(String):: URL for Airbrake for reporting unexpected exceptions to Errbit
|
139
|
+
# :airbrake_api_key(String):: Key for using the Airbrake API access to Errbit
|
136
140
|
# :ready_callback(Proc):: Called once agent is connected to AMQP broker and ready for service (no argument)
|
137
141
|
# :restart_callback(Proc):: Called on each restart vote with votes being initiated by offline queue
|
138
142
|
# exceeding MAX_QUEUED_REQUESTS or by repeated failures to access RightNet when online (no argument)
|
@@ -192,7 +196,10 @@ module RightScale
|
|
192
196
|
Log.init(@identity, @options[:log_path], :print => true)
|
193
197
|
Log.level = @options[:log_level] if @options[:log_level]
|
194
198
|
RightSupport::Log::Mixin.default_logger = Log
|
199
|
+
ErrorTracker.init(self, @options[:agent_name], :shard_id => @options[:shard_id], :trace_level => TRACE_LEVEL,
|
200
|
+
:airbrake_endpoint => @options[:airbrake_endpoint], :airbrake_api_key => @options[:airbrake_api_key])
|
195
201
|
@history.update("start")
|
202
|
+
|
196
203
|
now = Time.now
|
197
204
|
Log.info("[start] Agent #{@identity} starting; time: #{now.utc}; utc_offset: #{now.utc_offset}")
|
198
205
|
@options.each { |k, v| Log.info("- #{k}: #{k.to_s =~ /pass/ ? '****' : (v.respond_to?(:each) ? v.inspect : v)}") }
|
@@ -213,7 +220,7 @@ module RightScale
|
|
213
220
|
else
|
214
221
|
# Initiate AMQP broker connection, wait for connection before proceeding
|
215
222
|
# otherwise messages published on failed connection will be lost
|
216
|
-
@client = RightAMQP::HABrokerClient.new(Serializer.new(:secure), @options)
|
223
|
+
@client = RightAMQP::HABrokerClient.new(Serializer.new(:secure), @options.merge(:exception_stats => ErrorTracker.exception_stats))
|
217
224
|
@queues.each { |s| @remaining_queue_setup[s] = @client.all }
|
218
225
|
@client.connection_status(:one_off => @options[:connect_timeout]) do |status|
|
219
226
|
if status == :connected
|
@@ -230,12 +237,10 @@ module RightScale
|
|
230
237
|
end
|
231
238
|
end
|
232
239
|
end
|
233
|
-
rescue SystemExit
|
234
|
-
raise
|
235
240
|
rescue PidFile::AlreadyRunning
|
236
241
|
EM.stop if EM.reactor_running?
|
237
242
|
raise
|
238
|
-
rescue
|
243
|
+
rescue StandardError => e
|
239
244
|
terminate("failed startup", e)
|
240
245
|
end
|
241
246
|
true
|
@@ -289,14 +294,14 @@ module RightScale
|
|
289
294
|
# force(Boolean):: Reconnect even if already connected
|
290
295
|
#
|
291
296
|
# === Return
|
292
|
-
#
|
297
|
+
# (String|nil):: Error message if failed, otherwise nil
|
293
298
|
def connect(host, port, index, priority = nil, force = false)
|
294
299
|
@connect_request_stats.update("connect b#{index}")
|
295
300
|
even_if = " even if already connected" if force
|
296
301
|
Log.info("Connecting to broker at host #{host.inspect} port #{port.inspect} " +
|
297
302
|
"index #{index.inspect} priority #{priority.inspect}#{even_if}")
|
298
303
|
Log.info("Current broker configuration: #{@client.status.inspect}")
|
299
|
-
|
304
|
+
result = nil
|
300
305
|
begin
|
301
306
|
@client.connect(host, port, index, priority, force) do |id|
|
302
307
|
@client.connection_status(:one_off => @options[:connect_timeout], :brokers => [id]) do |status|
|
@@ -310,20 +315,18 @@ module RightScale
|
|
310
315
|
Log.warning("Successfully connected to broker #{id} but failed to update config file")
|
311
316
|
end
|
312
317
|
else
|
313
|
-
|
318
|
+
ErrorTracker.log(self, "Failed to connect to broker #{id}, status #{status.inspect}")
|
314
319
|
end
|
315
320
|
rescue Exception => e
|
316
|
-
|
317
|
-
@exception_stats.track("connect", e)
|
321
|
+
ErrorTracker.log(self, "Failed to connect to broker #{id}, status #{status.inspect}", e)
|
318
322
|
end
|
319
323
|
end
|
320
324
|
end
|
321
|
-
rescue
|
322
|
-
|
323
|
-
|
325
|
+
rescue StandardError => e
|
326
|
+
ErrorTracker.log(self, msg = "Failed to connect to broker at host #{host.inspect} and port #{port.inspect}", e)
|
327
|
+
result = Log.format(msg, e)
|
324
328
|
end
|
325
|
-
|
326
|
-
res
|
329
|
+
result
|
327
330
|
end
|
328
331
|
|
329
332
|
# Disconnect from an AMQP broker and optionally remove it from the configuration
|
@@ -336,7 +339,7 @@ module RightScale
|
|
336
339
|
# defaults to false
|
337
340
|
#
|
338
341
|
# === Return
|
339
|
-
#
|
342
|
+
# (String|nil):: Error message if failed, otherwise nil
|
340
343
|
def disconnect(host, port, remove = false)
|
341
344
|
and_remove = " and removing" if remove
|
342
345
|
Log.info("Disconnecting#{and_remove} broker at host #{host.inspect} port #{port.inspect}")
|
@@ -344,29 +347,28 @@ module RightScale
|
|
344
347
|
id = RightAMQP::HABrokerClient.identity(host, port)
|
345
348
|
@connect_request_stats.update("disconnect #{@client.alias_(id)}")
|
346
349
|
connected = @client.connected
|
347
|
-
|
350
|
+
result = e = nil
|
348
351
|
if connected.include?(id) && connected.size == 1
|
349
|
-
|
352
|
+
result = "Not disconnecting from #{id} because it is the last connected broker for this agent"
|
350
353
|
elsif @client.get(id)
|
351
354
|
begin
|
352
355
|
if remove
|
353
356
|
@client.remove(host, port) do |id|
|
354
357
|
unless update_configuration(:host => @client.hosts, :port => @client.ports)
|
355
|
-
|
358
|
+
result = "Successfully disconnected from broker #{id} but failed to update config file"
|
356
359
|
end
|
357
360
|
end
|
358
361
|
else
|
359
362
|
@client.close_one(id)
|
360
363
|
end
|
361
|
-
rescue
|
362
|
-
|
363
|
-
@exception_stats.track("disconnect", e)
|
364
|
+
rescue StandardError => e
|
365
|
+
result = Log.format("Failed to disconnect from broker #{id}", e)
|
364
366
|
end
|
365
367
|
else
|
366
|
-
|
368
|
+
result = "Cannot disconnect from broker #{id} because not configured for this agent"
|
367
369
|
end
|
368
|
-
|
369
|
-
|
370
|
+
ErrorTracker.log(self, result, e) if result
|
371
|
+
result
|
370
372
|
end
|
371
373
|
|
372
374
|
# There were problems while setting up service for this agent on the given AMQP brokers,
|
@@ -377,11 +379,11 @@ module RightScale
|
|
377
379
|
# ids(Array):: Identity of brokers
|
378
380
|
#
|
379
381
|
# === Return
|
380
|
-
#
|
382
|
+
# (String|nil):: Error message if failed, otherwise nil
|
381
383
|
def connect_failed(ids)
|
382
384
|
aliases = @client.aliases(ids).join(", ")
|
383
385
|
@connect_request_stats.update("enroll failed #{aliases}")
|
384
|
-
|
386
|
+
result = nil
|
385
387
|
begin
|
386
388
|
Log.info("Received indication that service initialization for this agent for brokers #{ids.inspect} has failed")
|
387
389
|
connected = @client.connected
|
@@ -389,12 +391,11 @@ module RightScale
|
|
389
391
|
Log.info("Not marking brokers #{ignored.inspect} as unusable because currently connected") if ignored
|
390
392
|
Log.info("Current broker configuration: #{@client.status.inspect}")
|
391
393
|
@client.declare_unusable(ids - ignored)
|
392
|
-
rescue
|
393
|
-
|
394
|
-
Log.
|
395
|
-
@exception_stats.track("connect failed", e)
|
394
|
+
rescue StandardError => e
|
395
|
+
ErrorTracker.log(self, msg = "Failed handling broker connection failure indication for #{ids.inspect}", e)
|
396
|
+
result = Log.format(msg, e)
|
396
397
|
end
|
397
|
-
|
398
|
+
result
|
398
399
|
end
|
399
400
|
|
400
401
|
# Update agent's persisted configuration
|
@@ -411,11 +412,11 @@ module RightScale
|
|
411
412
|
AgentConfig.store_cfg(@agent_name, cfg)
|
412
413
|
true
|
413
414
|
else
|
414
|
-
|
415
|
+
ErrorTracker.log(self, "Could not access configuration file #{AgentConfig.cfg_file(@agent_name).inspect} for update")
|
415
416
|
false
|
416
417
|
end
|
417
|
-
rescue
|
418
|
-
|
418
|
+
rescue StandardError => e
|
419
|
+
ErrorTracker.log(self, "Failed updating configuration file #{AgentConfig.cfg_file(@agent_name).inspect}", e)
|
419
420
|
false
|
420
421
|
end
|
421
422
|
|
@@ -432,7 +433,7 @@ module RightScale
|
|
432
433
|
def terminate(reason = nil, exception = nil)
|
433
434
|
begin
|
434
435
|
@history.update("stop") if @history
|
435
|
-
|
436
|
+
ErrorTracker.log(self, "[stop] Terminating because #{reason}", exception) if reason
|
436
437
|
if exception.is_a?(Exception)
|
437
438
|
h = @history.analyze_service
|
438
439
|
if h[:last_crashed]
|
@@ -455,10 +456,8 @@ module RightScale
|
|
455
456
|
Log.info("[stop] Agent #{@identity} terminating")
|
456
457
|
stop_gracefully(@options[:grace_timeout])
|
457
458
|
end
|
458
|
-
rescue
|
459
|
-
|
460
|
-
rescue Exception => e
|
461
|
-
Log.error("Failed to terminate gracefully", e, :trace)
|
459
|
+
rescue StandardError => e
|
460
|
+
ErrorTracker.log(self, "Failed to terminate gracefully", e)
|
462
461
|
begin @terminate_callback.call; rescue Exception; end
|
463
462
|
end
|
464
463
|
true
|
@@ -523,10 +522,9 @@ module RightScale
|
|
523
522
|
# with percentage breakdown per failure type, or nil if none
|
524
523
|
def agent_stats(reset = false)
|
525
524
|
stats = {
|
526
|
-
"exceptions" => @exception_stats.stats,
|
527
525
|
"request failures" => @request_failure_stats.all,
|
528
526
|
"response failures" => @response_failure_stats.all
|
529
|
-
}
|
527
|
+
}.merge(ErrorTracker.stats(reset))
|
530
528
|
if @mode != :http
|
531
529
|
stats["connect requests"] = @connect_request_stats.all
|
532
530
|
stats["non-deliveries"] = @non_delivery_stats.all
|
@@ -544,7 +542,6 @@ module RightScale
|
|
544
542
|
@non_delivery_stats = RightSupport::Stats::Activity.new
|
545
543
|
@request_failure_stats = RightSupport::Stats::Activity.new
|
546
544
|
@response_failure_stats = RightSupport::Stats::Activity.new
|
547
|
-
@exception_stats = RightSupport::Stats::Exceptions.new(self, @options[:exception_callback])
|
548
545
|
true
|
549
546
|
end
|
550
547
|
|
@@ -588,7 +585,6 @@ module RightScale
|
|
588
585
|
@mode = @options[:mode].to_sym
|
589
586
|
@stats_routing_key = "stats.#{@agent_type}.#{parsed_identity.base_id}"
|
590
587
|
@terminate_callback = TERMINATE_BLOCK
|
591
|
-
@exception_callback = @options[:exception_callback]
|
592
588
|
@revision = revision
|
593
589
|
@queues = [@identity]
|
594
590
|
@remaining_queue_setup = {}
|
@@ -623,9 +619,7 @@ module RightScale
|
|
623
619
|
# reconnect attempt, which can result in repeated attempts to setup
|
624
620
|
# queues when finally do connect
|
625
621
|
setup_status_checks([@options[:check_interval], @options[:connect_timeout]].max)
|
626
|
-
rescue
|
627
|
-
raise
|
628
|
-
rescue Exception => e
|
622
|
+
rescue StandardError => e
|
629
623
|
terminate("failed service startup", e)
|
630
624
|
end
|
631
625
|
true
|
@@ -650,20 +644,20 @@ module RightScale
|
|
650
644
|
end
|
651
645
|
rescue Dispatcher::DuplicateRequest
|
652
646
|
rescue Exception => e
|
653
|
-
|
647
|
+
ErrorTracker.log(self, "Failed sending response for <#{event[:uuid]}>", e)
|
654
648
|
end
|
655
649
|
end
|
656
650
|
elsif event[:type] == "Result"
|
657
651
|
if (data = event[:data]) && (result = data[:result]) && result.respond_to?(:non_delivery?) && result.non_delivery?
|
658
652
|
Log.info("Non-delivery of event <#{data[:request_uuid]}>: #{result.content}")
|
659
653
|
else
|
660
|
-
|
654
|
+
ErrorTracker.log(self, "Unexpected Result event from #{event[:from]}: #{event.inspect}")
|
661
655
|
end
|
662
656
|
else
|
663
|
-
|
657
|
+
ErrorTracker.log(self, "Unrecognized event type #{event[:type]} from #{event[:from]}")
|
664
658
|
end
|
665
659
|
else
|
666
|
-
|
660
|
+
ErrorTracker.log(self, "Unrecognized event: #{event.class}")
|
667
661
|
end
|
668
662
|
nil
|
669
663
|
end
|
@@ -742,14 +736,14 @@ module RightScale
|
|
742
736
|
actors.delete(actor)
|
743
737
|
end
|
744
738
|
end
|
745
|
-
|
739
|
+
ErrorTracker.log(self, "Actors #{actors.inspect} not found in #{actors_dirs.inspect}") unless actors.empty?
|
746
740
|
|
747
741
|
# Perform agent-specific initialization including actor creation and registration
|
748
742
|
if (init_file = AgentConfig.init_file)
|
749
743
|
Log.info("[setup] Initializing agent from #{init_file}")
|
750
744
|
instance_eval(File.read(init_file), init_file)
|
751
745
|
else
|
752
|
-
|
746
|
+
ErrorTracker.log(self, "No agent init.rb file found in init directory of #{AgentConfig.root_dir.inspect}")
|
753
747
|
end
|
754
748
|
true
|
755
749
|
end
|
@@ -786,7 +780,7 @@ module RightScale
|
|
786
780
|
old.call if old.is_a? Proc
|
787
781
|
end
|
788
782
|
rescue Exception => e
|
789
|
-
|
783
|
+
ErrorTracker.log(self, "Failed in termination", e)
|
790
784
|
end
|
791
785
|
end
|
792
786
|
end
|
@@ -828,8 +822,7 @@ module RightScale
|
|
828
822
|
result = Result.new(token, from, OperationResult.non_delivery(reason), to)
|
829
823
|
@sender.handle_response(result)
|
830
824
|
rescue Exception => e
|
831
|
-
|
832
|
-
@exception_stats.track("message return", e)
|
825
|
+
ErrorTracker.log(self, "Failed handling non-delivery for <#{token}>", e)
|
833
826
|
end
|
834
827
|
end
|
835
828
|
end
|
@@ -881,8 +874,7 @@ module RightScale
|
|
881
874
|
end
|
882
875
|
@sender.message_received
|
883
876
|
rescue Exception => e
|
884
|
-
|
885
|
-
@exception_stats.track("#{queue} queue", e, packet)
|
877
|
+
ErrorTracker.log(self, "#{queue} queue processing error", e)
|
886
878
|
ensure
|
887
879
|
# Relying on fact that all dispatches/deliveries are synchronous and therefore
|
888
880
|
# need to have completed or failed by now, thus allowing packet acknowledgement
|
@@ -907,17 +899,16 @@ module RightScale
|
|
907
899
|
@client.publish(exchange, result, :persistent => true, :mandatory => true, :log_filter => [:request_from, :tries, :persistent, :duration])
|
908
900
|
end
|
909
901
|
else
|
910
|
-
|
902
|
+
ErrorTracker.log(self, "Failed to dispatch request #{request.trace} from queue #{queue} because no dispatcher configured")
|
911
903
|
@request_failure_stats.update("NoConfiguredDispatcher")
|
912
904
|
end
|
913
905
|
rescue Dispatcher::DuplicateRequest
|
914
906
|
rescue RightAMQP::HABrokerClient::NoConnectedBrokers => e
|
915
|
-
|
907
|
+
ErrorTracker.log(self, "Failed to publish result of dispatched request #{request.trace} from queue #{queue}", e)
|
916
908
|
@request_failure_stats.update("NoConnectedBrokers")
|
917
|
-
rescue
|
918
|
-
|
909
|
+
rescue StandardError => e
|
910
|
+
ErrorTracker.log(self, "Failed to dispatch request #{request.trace} from queue #{queue}", e)
|
919
911
|
@request_failure_stats.update(e.class.name)
|
920
|
-
@exception_stats.track("request", e)
|
921
912
|
end
|
922
913
|
true
|
923
914
|
end
|
@@ -932,10 +923,9 @@ module RightScale
|
|
932
923
|
def deliver_response(result)
|
933
924
|
begin
|
934
925
|
@sender.handle_response(result)
|
935
|
-
rescue
|
936
|
-
|
926
|
+
rescue StandardError => e
|
927
|
+
ErrorTracker.log(self, "Failed to deliver response #{result.trace}", e)
|
937
928
|
@response_failure_stats.update(e.class.name)
|
938
|
-
@exception_stats.track("response", e)
|
939
929
|
end
|
940
930
|
true
|
941
931
|
end
|
@@ -968,8 +958,7 @@ module RightScale
|
|
968
958
|
begin
|
969
959
|
callback.call(type, state)
|
970
960
|
rescue RuntimeError => e
|
971
|
-
|
972
|
-
@exception_stats.track("update status", e)
|
961
|
+
ErrorTracker.log(self, "Failed status callback", e, nil, :caller)
|
973
962
|
end
|
974
963
|
end
|
975
964
|
true
|
@@ -1005,38 +994,31 @@ module RightScale
|
|
1005
994
|
update_status(:auth, :failed)
|
1006
995
|
end
|
1007
996
|
rescue Exception => e
|
1008
|
-
|
1009
|
-
@exception_stats.track("check status", e)
|
997
|
+
ErrorTracker.log(self, "Failed switching mode", e)
|
1010
998
|
end
|
1011
999
|
|
1012
1000
|
begin
|
1013
1001
|
finish_setup unless @terminating || @mode == :http
|
1014
1002
|
rescue Exception => e
|
1015
|
-
|
1016
|
-
@exception_stats.track("check status", e)
|
1003
|
+
ErrorTracker.log(self, "Failed finishing setup", e)
|
1017
1004
|
end
|
1018
1005
|
|
1019
1006
|
begin
|
1020
1007
|
@client.queue_status(@queues, timeout = @options[:check_interval] / 10) unless @terminating || @mode == :http
|
1021
1008
|
rescue Exception => e
|
1022
|
-
|
1023
|
-
@exception_stats.track("check status", e)
|
1009
|
+
ErrorTracker.log(self, "Failed checking queue status", e)
|
1024
1010
|
end
|
1025
1011
|
|
1026
1012
|
begin
|
1027
1013
|
publish_stats unless @terminating || @stats_routing_key.nil?
|
1028
|
-
rescue Exceptions::ConnectivityFailure => e
|
1029
|
-
Log.error("Failed publishing stats", e, :no_trace)
|
1030
1014
|
rescue Exception => e
|
1031
|
-
|
1032
|
-
@exception_stats.track("check status", e)
|
1015
|
+
ErrorTracker.log(self, "Failed publishing stats", e)
|
1033
1016
|
end
|
1034
1017
|
|
1035
1018
|
begin
|
1036
1019
|
check_other(@check_status_count) unless @terminating
|
1037
1020
|
rescue Exception => e
|
1038
|
-
|
1039
|
-
@exception_stats.track("check status", e)
|
1021
|
+
ErrorTracker.log(self, "Failed to perform other check status check", e)
|
1040
1022
|
end
|
1041
1023
|
|
1042
1024
|
@check_status_count += 1
|
@@ -1131,7 +1113,7 @@ module RightScale
|
|
1131
1113
|
Log.info("[stop] Continuing with termination")
|
1132
1114
|
finish.call
|
1133
1115
|
rescue Exception => e
|
1134
|
-
|
1116
|
+
ErrorTracker.log(self, "Failed while finishing termination", e)
|
1135
1117
|
begin @terminate_callback.call; rescue Exception; end
|
1136
1118
|
end
|
1137
1119
|
end
|