scout 5.4.6.alpha → 5.5.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.
- data/.gitignore +1 -1
- data/CHANGELOG +17 -0
- data/bin/scout +0 -1
- data/lib/scout.rb +1 -1
- data/lib/scout/command.rb +12 -10
- data/lib/scout/command/install.rb +1 -1
- data/lib/scout/command/run.rb +10 -10
- data/lib/scout/command/sign.rb +8 -2
- data/lib/scout/command/test.rb +1 -1
- data/lib/scout/server.rb +5 -6
- data/lib/scout/streamer.rb +17 -9
- data/lib/scout/streamer_daemon.rb +58 -0
- data/lib/scout/version.rb +1 -1
- data/test/scout_test.rb +66 -25
- metadata +8 -10
- data/lib/scout/command/stream.rb +0 -50
- data/lib/scout/streamer_control.rb +0 -43
data/.gitignore
CHANGED
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
== Master
|
|
2
|
+
|
|
3
|
+
== 5.5.0
|
|
4
|
+
|
|
5
|
+
* yes, the version number jumped from 5.3.5 to 5.5.0
|
|
6
|
+
* Implemented "real time" mode
|
|
7
|
+
|
|
8
|
+
== 5.3.5
|
|
9
|
+
|
|
10
|
+
* Moved proxy support to explicit command line flags --http_proxy and https_proxy
|
|
11
|
+
* fixed two unused variables that were causing warnings under 1.9.3
|
|
12
|
+
|
|
13
|
+
== 5.3.4
|
|
14
|
+
|
|
15
|
+
* Incorporating sleep interval into Server#time_to_checkin?
|
|
16
|
+
* Added proxy support command line flags
|
|
17
|
+
|
|
1
18
|
== 5.3.3
|
|
2
19
|
|
|
3
20
|
* Sending embedded options to server for local & plugin overrides.
|
data/bin/scout
CHANGED
data/lib/scout.rb
CHANGED
data/lib/scout/command.rb
CHANGED
|
@@ -72,6 +72,16 @@ module Scout
|
|
|
72
72
|
options[:server_name] = server_name
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
+
opts.on("--http-proxy URL", String,
|
|
76
|
+
"Optional http proxy for non-SSL traffic." ) do |http_proxy|
|
|
77
|
+
options[:http_proxy] = http_proxy
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
opts.on("--https-proxy URL", String,
|
|
81
|
+
"Optional https proxy for SSL traffic." ) do |https_proxy|
|
|
82
|
+
options[:https_proxy] = https_proxy
|
|
83
|
+
end
|
|
84
|
+
|
|
75
85
|
opts.separator " "
|
|
76
86
|
opts.separator "Common Options:"
|
|
77
87
|
opts.separator "--------------------------------------------------------------------------"
|
|
@@ -95,16 +105,6 @@ module Scout
|
|
|
95
105
|
options[:force] = bool
|
|
96
106
|
end
|
|
97
107
|
|
|
98
|
-
opts.on( "-p", "--plugin_ids PLUGINS", String,
|
|
99
|
-
"A subset of plugin ids, for streaming mode only - not generally used manually.") do |plugins|
|
|
100
|
-
options[:plugin_ids] = plugins.split(",").map(&:to_i)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
opts.on( "-k", "--streaming_key KEY", String,
|
|
104
|
-
"for streaming mode only - not generally used manually.") do |streaming_key|
|
|
105
|
-
options[:streaming_key] = streaming_key
|
|
106
|
-
end
|
|
107
|
-
|
|
108
108
|
opts.separator " "
|
|
109
109
|
opts.separator "Troubleshooting Options:"
|
|
110
110
|
opts.separator "--------------------------------------------------------------------------"
|
|
@@ -164,6 +164,8 @@ module Scout
|
|
|
164
164
|
@level = options[:level] || "info"
|
|
165
165
|
@force = options[:force] || false
|
|
166
166
|
@server_name = options[:server_name]
|
|
167
|
+
@http_proxy = options[:http_proxy] || ""
|
|
168
|
+
@https_proxy = options[:https_proxy] || ""
|
|
167
169
|
|
|
168
170
|
@options = options
|
|
169
171
|
@args = args
|
|
@@ -22,7 +22,7 @@ module Scout
|
|
|
22
22
|
|
|
23
23
|
puts "\nAttempting to contact the server..."
|
|
24
24
|
begin
|
|
25
|
-
Scout::Server.new(server, key, history, log) do |scout|
|
|
25
|
+
Scout::Server.new(server, key, history, log, @http_proxy, @https_proxy) do |scout|
|
|
26
26
|
scout.fetch_plan
|
|
27
27
|
scout.run_plugins_by_plan
|
|
28
28
|
end
|
data/lib/scout/command/run.rb
CHANGED
|
@@ -9,7 +9,7 @@ module Scout
|
|
|
9
9
|
configuration_directory = config_dir
|
|
10
10
|
log.debug("Configuration directory is #{configuration_directory} ") if log
|
|
11
11
|
# TODO: too much external logic of command doing things TO server. This should be moved into the server class.
|
|
12
|
-
@scout = Scout::Server.new(server, key, history, log, server_name)
|
|
12
|
+
@scout = Scout::Server.new(server, key, history, log, server_name, @http_proxy, @https_proxy)
|
|
13
13
|
@scout.load_history
|
|
14
14
|
|
|
15
15
|
unless $stdin.tty?
|
|
@@ -19,15 +19,15 @@ module Scout
|
|
|
19
19
|
|
|
20
20
|
@scout.fetch_plan
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
# Spawn or stop streamer as needed
|
|
23
|
+
if @scout.streamer_command.is_a?(String)
|
|
24
|
+
if @scout.streamer_command.start_with?("start")
|
|
25
|
+
log.info "streamer command: start"
|
|
26
|
+
Scout::StreamerDaemon.start_daemon(history, @scout.streamer_command)
|
|
27
|
+
elsif @scout.streamer_command == "stop"
|
|
28
|
+
log.info "streamer command: stop"
|
|
29
|
+
Scout::StreamerDaemon.stop_daemon(history)
|
|
30
|
+
end
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# Check in if appropriate
|
data/lib/scout/command/sign.rb
CHANGED
|
@@ -11,7 +11,7 @@ module Scout
|
|
|
11
11
|
VERIFY_MODE = OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
|
|
12
12
|
|
|
13
13
|
def run
|
|
14
|
-
url
|
|
14
|
+
url = @args.first
|
|
15
15
|
# read the plugin_code from the file specified
|
|
16
16
|
if url.nil? or url == ''
|
|
17
17
|
puts "Please specify the path to the plugin (scout sign /path/to/plugin.rb)"
|
|
@@ -35,7 +35,13 @@ module Scout
|
|
|
35
35
|
|
|
36
36
|
puts "Posting Signature..."
|
|
37
37
|
uri = URI.parse(url)
|
|
38
|
-
|
|
38
|
+
|
|
39
|
+
# take care of http/https proxy, if specified in command line options
|
|
40
|
+
# Given a blank string, the proxy_uri URI instance's host/port/user/pass will be nil
|
|
41
|
+
# Net::HTTP::Proxy returns a regular Net::HTTP class if the first argument (host) is nil
|
|
42
|
+
proxy_uri = URI.parse(uri.is_a?(URI::HTTPS) ? @https_proxy : @http_proxy)
|
|
43
|
+
http=Net::HTTP::Proxy(proxy_uri.host,proxy_uri.port,proxy_uri.user,proxy_uri.port).new(uri.host, uri.port)
|
|
44
|
+
|
|
39
45
|
if uri.is_a?(URI::HTTPS)
|
|
40
46
|
http.use_ssl = true
|
|
41
47
|
http.ca_file = CA_FILE
|
data/lib/scout/command/test.rb
CHANGED
|
@@ -45,7 +45,7 @@ module Scout
|
|
|
45
45
|
puts "== You haven't provided any options for running this plugin."
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
Scout::Server.new(nil, nil, history, log) do |scout|
|
|
48
|
+
Scout::Server.new(nil, nil, history, log, @http_proxy, @https_proxy) do |scout|
|
|
49
49
|
scout.prepare_checkin
|
|
50
50
|
scout.process_plugin( 'interval' => 0,
|
|
51
51
|
'plugin_id' => 1,
|
data/lib/scout/server.rb
CHANGED
|
@@ -26,13 +26,15 @@ module Scout
|
|
|
26
26
|
attr_reader :streamer_command
|
|
27
27
|
|
|
28
28
|
# Creates a new Scout Server connection.
|
|
29
|
-
def initialize(server, client_key, history_file, logger = nil, server_name=nil)
|
|
29
|
+
def initialize(server, client_key, history_file, logger = nil, server_name=nil, http_proxy='', https_proxy='')
|
|
30
30
|
@server = server
|
|
31
31
|
@client_key = client_key
|
|
32
32
|
@history_file = history_file
|
|
33
33
|
@history = Hash.new
|
|
34
34
|
@logger = logger
|
|
35
35
|
@server_name = server_name
|
|
36
|
+
@http_proxy = http_proxy
|
|
37
|
+
@https_proxy = https_proxy
|
|
36
38
|
@plugin_plan = []
|
|
37
39
|
@plugins_with_signature_errors = []
|
|
38
40
|
@directives = {} # take_snapshots, interval, sleep_interval
|
|
@@ -231,7 +233,7 @@ module Scout
|
|
|
231
233
|
def time_to_checkin?
|
|
232
234
|
@history['last_checkin'] == nil ||
|
|
233
235
|
@directives['interval'] == nil ||
|
|
234
|
-
(Time.now.to_i - Time.at(@history['last_checkin']).to_i).abs+15 > @directives['interval'].to_i*60
|
|
236
|
+
(Time.now.to_i - Time.at(@history['last_checkin']).to_i).abs+15+sleep_interval > @directives['interval'].to_i*60
|
|
235
237
|
rescue
|
|
236
238
|
debug "Failed to calculate time_to_checkin. @history['last_checkin']=#{@history['last_checkin']}. "+
|
|
237
239
|
"@directives['interval']=#{@directives['interval']}. Time.now.to_i=#{Time.now.to_i}"
|
|
@@ -481,7 +483,7 @@ module Scout
|
|
|
481
483
|
contents=File.read(@history_file)
|
|
482
484
|
begin
|
|
483
485
|
@history = YAML.load(contents)
|
|
484
|
-
rescue
|
|
486
|
+
rescue
|
|
485
487
|
backup_path=File.join(File.dirname(@history_file), "history.corrupt")
|
|
486
488
|
info "Couldn't parse the history file. Deleting it and resetting to an empty history file. Keeping a backup at #{backup_path}"
|
|
487
489
|
File.open(backup_path,"w"){|f|f.write contents}
|
|
@@ -546,9 +548,6 @@ module Scout
|
|
|
546
548
|
debug $!.message
|
|
547
549
|
debug $!.backtrace
|
|
548
550
|
end
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
private
|
|
552
551
|
|
|
553
552
|
# Called during initialization; loads the plugin_configs (local plugin configurations for passwords, etc)
|
|
554
553
|
# if the file is there. Returns a hash like {"db.username"=>"secr3t"}
|
data/lib/scout/streamer.rb
CHANGED
|
@@ -2,31 +2,34 @@ require 'rubygems'
|
|
|
2
2
|
require 'json'
|
|
3
3
|
|
|
4
4
|
module Scout
|
|
5
|
-
class
|
|
5
|
+
class PluginTimeoutError < RuntimeError; end
|
|
6
|
+
class Streamer
|
|
6
7
|
MAX_DURATION = 60*30 # will shut down automatically after this many seconds
|
|
7
8
|
SLEEP = 1
|
|
8
9
|
|
|
9
10
|
# * history_file is the *path* to the history file
|
|
10
11
|
# * plugin_ids is an array of integers
|
|
11
|
-
def initialize(
|
|
12
|
-
|
|
13
|
-
@client_key = client_key
|
|
12
|
+
def initialize(history_file, streaming_key, p_app_id, p_key, p_secret, plugin_ids, logger = nil)
|
|
13
|
+
@@continue_streaming = true
|
|
14
14
|
@history_file = history_file
|
|
15
15
|
@history = Hash.new
|
|
16
16
|
@logger = logger
|
|
17
17
|
|
|
18
18
|
@plugin_hashes = []
|
|
19
19
|
|
|
20
|
-
Pusher.app_id
|
|
21
|
-
Pusher.key
|
|
22
|
-
Pusher.secret
|
|
20
|
+
Pusher.app_id=p_app_id
|
|
21
|
+
Pusher.key=p_key
|
|
22
|
+
Pusher.secret=p_secret
|
|
23
|
+
|
|
24
|
+
#[[:app_id,p_app_id],[:key,p_key],[:secret,p_secret]].each { |p| Pusher.send p.first, p.last}
|
|
23
25
|
|
|
24
26
|
streamer_start_time = Time.now
|
|
25
27
|
|
|
26
28
|
info("Streamer PID=#{$$} starting")
|
|
27
29
|
|
|
28
30
|
hostname=Socket.gethostname
|
|
29
|
-
|
|
31
|
+
|
|
32
|
+
# load plugin history
|
|
30
33
|
load_history
|
|
31
34
|
|
|
32
35
|
# get the array of plugins, AKA the plugin plan
|
|
@@ -39,7 +42,7 @@ module Scout
|
|
|
39
42
|
|
|
40
43
|
# main loop. Continue running until global $continue_streaming is set to false OR we've been running for MAX DURATION
|
|
41
44
|
iteration=1 # use this to log the data at a couple points
|
|
42
|
-
while(streamer_start_time+MAX_DURATION > Time.now &&
|
|
45
|
+
while(streamer_start_time+MAX_DURATION > Time.now && @@continue_streaming) do
|
|
43
46
|
plugins=[]
|
|
44
47
|
selected_plugins.each_with_index do |plugin_hash,i|
|
|
45
48
|
# create an actual instance of the plugin
|
|
@@ -186,5 +189,10 @@ module Scout
|
|
|
186
189
|
end
|
|
187
190
|
end
|
|
188
191
|
|
|
192
|
+
# class method is used to stop the running deamon
|
|
193
|
+
def self.continue_streaming=(v)
|
|
194
|
+
@@continue_streaming=v
|
|
195
|
+
end
|
|
196
|
+
|
|
189
197
|
end
|
|
190
198
|
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Scout
|
|
2
|
+
class StreamerDaemon < DaemonSpawn::Base
|
|
3
|
+
|
|
4
|
+
# this is the public-facing method for starting the streaming daemon
|
|
5
|
+
def self.start_daemon(history_file, streamer_command)
|
|
6
|
+
streamer_log_file=File.join(File.dirname(history_file),"scout_streamer.log")
|
|
7
|
+
streamer_pid_file=File.join(File.dirname(history_file),"scout_streamer.pid")
|
|
8
|
+
|
|
9
|
+
daemon_spawn_options = {:log_file => streamer_log_file,
|
|
10
|
+
:pid_file => streamer_pid_file,
|
|
11
|
+
:sync_log => true,
|
|
12
|
+
:working_dir => File.dirname(history_file)}
|
|
13
|
+
|
|
14
|
+
# streamer command might look like: start,A0000000000123,a,b,c,1,3
|
|
15
|
+
tokens = streamer_command.split(",")
|
|
16
|
+
tokens.shift # gets rid of the "start"
|
|
17
|
+
streaming_key = tokens.shift
|
|
18
|
+
p_app_id = tokens.shift
|
|
19
|
+
p_key = tokens.shift
|
|
20
|
+
p_secret = tokens.shift
|
|
21
|
+
plugin_ids = tokens.map(&:to_i)
|
|
22
|
+
|
|
23
|
+
# we use STDOUT for the logger because daemon_spawn directs STDOUT to a log file
|
|
24
|
+
streamer_args = [history_file,streaming_key,p_app_id,p_key,p_secret,plugin_ids,Logger.new(STDOUT)]
|
|
25
|
+
if File.exists?(streamer_pid_file)
|
|
26
|
+
Scout::StreamerDaemon.restart(daemon_spawn_options, streamer_args)
|
|
27
|
+
else
|
|
28
|
+
Scout::StreamerDaemon.start(daemon_spawn_options, streamer_args)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# this is the public-facing method for stopping the streaming daemon
|
|
33
|
+
def self.stop_daemon(history_file)
|
|
34
|
+
streamer_log_file=File.join(File.dirname(history_file),"scout_streamer.log")
|
|
35
|
+
streamer_pid_file=File.join(File.dirname(history_file),"scout_streamer.pid")
|
|
36
|
+
|
|
37
|
+
daemon_spawn_options = {:log_file => streamer_log_file,
|
|
38
|
+
:pid_file => streamer_pid_file,
|
|
39
|
+
:sync_log => true,
|
|
40
|
+
:working_dir => File.dirname(history_file)}
|
|
41
|
+
|
|
42
|
+
Scout::StreamerDaemon.stop(daemon_spawn_options, [])
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# this method is called by DaemonSpawn's class start method.
|
|
47
|
+
def start(streamer_args)
|
|
48
|
+
history,streaming_key,p_app_id,p_key,p_secret,plugin_ids,log = streamer_args
|
|
49
|
+
@scout = Scout::Streamer.new(history, streaming_key, p_app_id, p_key, p_secret, plugin_ids, log)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# this method is called by DaemonSpawn's class start method.
|
|
53
|
+
def stop
|
|
54
|
+
Scout::Streamer.continue_streaming = false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
end
|
data/lib/scout/version.rb
CHANGED
data/test/scout_test.rb
CHANGED
|
@@ -409,17 +409,21 @@ mybar=100
|
|
|
409
409
|
|
|
410
410
|
scout(@client.key) # to write the initial history file. Sinatra MUST be running
|
|
411
411
|
$continue_streaming = true # so the streamer will run once
|
|
412
|
-
|
|
413
|
-
|
|
412
|
+
# for debugging, make last arg Logger.new(STDOUT)
|
|
413
|
+
Scout::Streamer.new(PATH_TO_DATA_FILE,"bogus_streaming_key","a","b","c",[@client.plugins.first.id]+plugins.map(&:id),nil)
|
|
414
|
+
end
|
|
414
415
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
416
|
+
streams = Pusher::Channel.streamer_data # set by the mock_pusher call
|
|
417
|
+
assert streams.is_a?(Array)
|
|
418
|
+
assert_equal 1, streams.size
|
|
419
|
+
res=streams.first
|
|
420
|
+
assert res.is_a?(Hash)
|
|
421
|
+
assert res[:plugins].is_a?(Array)
|
|
422
|
+
assert_equal 4, res[:plugins].size
|
|
423
|
+
assert_equal 2, res[:plugins][0][:fields][:load]
|
|
424
|
+
assert_equal 1, res[:plugins][1][:fields][:value]
|
|
425
|
+
assert_equal 2, res[:plugins][2][:fields][:value]
|
|
426
|
+
assert_equal 1, res[:plugins][3][:fields][:value]
|
|
423
427
|
end
|
|
424
428
|
|
|
425
429
|
# the local plugin shouldn't report
|
|
@@ -435,26 +439,31 @@ mybar=100
|
|
|
435
439
|
|
|
436
440
|
mock_pusher do
|
|
437
441
|
$continue_streaming = true # so the streamer will run once
|
|
438
|
-
|
|
439
|
-
|
|
442
|
+
# for debugging, make last arg Logger.new(STDOUT)
|
|
443
|
+
Scout::Streamer.new(PATH_TO_DATA_FILE,"bogus_streaming_key","a","b","c",[@client.plugins.first.id],nil)
|
|
444
|
+
end
|
|
445
|
+
streams = Pusher::Channel.streamer_data # set by the mock_pusher call
|
|
446
|
+
assert streams.is_a?(Array)
|
|
447
|
+
assert_equal 1, streams.size
|
|
448
|
+
res=streams.first
|
|
440
449
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
end # end of mock_pusher
|
|
450
|
+
assert res.is_a?(Hash)
|
|
451
|
+
assert res[:plugins].is_a?(Array)
|
|
452
|
+
assert_equal 1, res[:plugins].size # this is NOT the local plugin, it's a regular plugin that's already there
|
|
453
|
+
assert_equal 2, res[:plugins][0][:fields][:load]
|
|
446
454
|
end
|
|
447
455
|
|
|
448
456
|
|
|
449
457
|
# test streamer starting and stopping
|
|
450
458
|
def test_streamer_process_management
|
|
451
459
|
streamer_pid_file = File.join(AGENT_DIR, "scout_streamer.pid")
|
|
460
|
+
File.unlink(streamer_pid_file) if File.exist?(streamer_pid_file)
|
|
452
461
|
|
|
453
462
|
test_should_run_first_time
|
|
454
463
|
|
|
455
464
|
assert !File.exist?(streamer_pid_file)
|
|
456
465
|
|
|
457
|
-
assert @client.update_attribute(:streamer_command, "start,A0000000000123,1,3")
|
|
466
|
+
assert @client.update_attribute(:streamer_command, "start,A0000000000123,a,b,c,1,3")
|
|
458
467
|
scout(@client.key)
|
|
459
468
|
assert File.exist?(streamer_pid_file)
|
|
460
469
|
process_id = File.read(streamer_pid_file).to_i
|
|
@@ -475,15 +484,34 @@ mybar=100
|
|
|
475
484
|
plugin = create_plugin(@client, "memory plugin", PLUGIN_FIXTURES[:memory][:code], PLUGIN_FIXTURES[:memory][:sig])
|
|
476
485
|
scout(@client.key)
|
|
477
486
|
#puts YAML.load(File.read(PATH_TO_DATA_FILE))['memory'].to_yaml
|
|
478
|
-
|
|
479
|
-
$continue_streaming = true # so the streamer will start running
|
|
480
487
|
# for debugging, make last arg Logger.new(STDOUT)
|
|
481
|
-
|
|
482
|
-
res = Pusher::Channel.streamer_data # Pusher::Channel.streamer_data via the mock_pusher call
|
|
483
|
-
assert_equal 3, res[:plugins][0][:fields][:v], "after the two streamer runs, this plugin should report v=3 -- it increments each run"
|
|
488
|
+
Scout::Streamer.new(PATH_TO_DATA_FILE,"bogus_streaming_key","a","b","c",[plugin.id],nil)
|
|
484
489
|
end
|
|
490
|
+
|
|
491
|
+
streams = Pusher::Channel.streamer_data # set by the mock_pusher call
|
|
492
|
+
assert streams.is_a?(Array)
|
|
493
|
+
assert_equal 3, streams.size
|
|
494
|
+
res=streams.last
|
|
495
|
+
assert_equal 3, res[:plugins][0][:fields][:v], "after the two streamer runs, this plugin should report v=3 -- it increments each run"
|
|
485
496
|
end
|
|
486
497
|
|
|
498
|
+
def test_new_plugin_instance_every_streamer_run
|
|
499
|
+
mock_pusher(2) do
|
|
500
|
+
plugin = create_plugin(@client, "caching plugin", PLUGIN_FIXTURES[:caching][:code], PLUGIN_FIXTURES[:caching][:sig])
|
|
501
|
+
scout(@client.key)
|
|
502
|
+
# for debugging, make last arg Logger.new(STDOUT)
|
|
503
|
+
Scout::Streamer.new(PATH_TO_DATA_FILE,"bogus_streaming_key","a","b","c",[plugin.id],nil)
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
streams = Pusher::Channel.streamer_data # set by the mock_pusher call
|
|
507
|
+
assert streams.is_a?(Array)
|
|
508
|
+
assert_equal 2, streams.size
|
|
509
|
+
|
|
510
|
+
# the plugin sets :v to be the current time, and caches it in a class variable. we're checking that they are NOT equal
|
|
511
|
+
assert_in_delta Time.now.to_i, streams.last[:plugins][0][:fields][:v], 5, "should be within a few seconds of now"
|
|
512
|
+
assert_in_delta Time.now.to_i, streams.first[:plugins][0][:fields][:v], 5, "should be within a few seconds of now"
|
|
513
|
+
assert_not_equal streams.first[:plugins][0][:fields][:v], streams.last[:plugins][0][:fields][:v]
|
|
514
|
+
end
|
|
487
515
|
|
|
488
516
|
######################
|
|
489
517
|
### Helper Methods ###
|
|
@@ -612,10 +640,13 @@ mybar=100
|
|
|
612
640
|
def trigger!(event_name, data, socket=nil)
|
|
613
641
|
@num_run_for_tests = @num_run_for_tests ? @num_run_for_tests+1 : 1
|
|
614
642
|
# puts "in mock pusher trigger! This is run #{@num_run_for_tests} of #{$num_runs_for_mock_pusher}"
|
|
615
|
-
@@
|
|
643
|
+
@@streamer_data_temp ||= Array.new
|
|
644
|
+
@@streamer_data_temp << data
|
|
616
645
|
if @num_run_for_tests >= $num_runs_for_mock_pusher
|
|
617
|
-
|
|
646
|
+
Scout::Streamer.continue_streaming=false
|
|
618
647
|
@num_run_for_tests=nil
|
|
648
|
+
@@streamer_data = @@streamer_data_temp.clone
|
|
649
|
+
@@streamer_data_temp = nil
|
|
619
650
|
end
|
|
620
651
|
end
|
|
621
652
|
end
|
|
@@ -656,6 +687,16 @@ HXu5TIQLJ/+IYHIG2E5FWcbfddR8cmJkIl4zGs93IatQNTENksRzphob7Cz8
|
|
|
656
687
|
wBwOHDG78kJ4TWEV5NIa5rLW8y2ltthfEPCTnS8/Zxa6h0qFtNrUWiU2KKtp
|
|
657
688
|
xTbJ3RgWKUnAR3YrEGB/JjjkPN2FrsDRvlClGujaYIWpWGkf+GZcpUn+QYxP
|
|
658
689
|
w7/kFz29Ds4hJRg2E2cWCHPtrD4dI0p/1iwP4XsxOw==
|
|
690
|
+
EOS
|
|
691
|
+
},
|
|
692
|
+
:caching=>{:code=>"class CachingPlugin < Scout::Plugin;def build_report; @v||= Time.now.to_i; report(:v=>@v);end;end",
|
|
693
|
+
:sig=><<EOS
|
|
694
|
+
zcEUdxS9h/iD/xYK1SbvTn2mi0vJzfgIkmrouzXeRbEsbcKTdOhc3nOBwUH5
|
|
695
|
+
SEOvQnPKmTiN7qaRiDZJypB/ldKxG4PL8zI0kL5G3AUZcxJBfqWe82jCKpyY
|
|
696
|
+
I49DWaBW4tZWM3j5T64+60ifPlKVXQMLVIYQtPTpVDMnftzfokDbBYsEhB2e
|
|
697
|
+
gNnsaAL5Nar+JE2GqM7nh79IgfXOrrYLdsv4zUJfex/OrKJS53ZCRnDcvlXu
|
|
698
|
+
pKFiS6IF2dJkIFlnNlYaXK5ZSXGANGY80Ji4ivz077JpuogQzrVkqHk13A1G
|
|
699
|
+
dGvCQOmVn51PKtmDm5DbfZaw4j4w+1pO2+G9Qm1y+A==
|
|
659
700
|
EOS
|
|
660
701
|
}
|
|
661
702
|
} # end of PLUGIN_FIXTURES
|
metadata
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: scout
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 5.5.0
|
|
5
|
+
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- Andre Lewis
|
|
@@ -11,11 +11,11 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date:
|
|
14
|
+
date: 2012-01-09 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: elif
|
|
18
|
-
requirement: &
|
|
18
|
+
requirement: &70362600075880 !ruby/object:Gem::Requirement
|
|
19
19
|
none: false
|
|
20
20
|
requirements:
|
|
21
21
|
- - ! '>='
|
|
@@ -23,7 +23,7 @@ dependencies:
|
|
|
23
23
|
version: '0'
|
|
24
24
|
type: :runtime
|
|
25
25
|
prerelease: false
|
|
26
|
-
version_requirements: *
|
|
26
|
+
version_requirements: *70362600075880
|
|
27
27
|
description: ! 'Scout makes monitoring and reporting on your web applications as flexible
|
|
28
28
|
and simple as possible.
|
|
29
29
|
|
|
@@ -50,7 +50,6 @@ files:
|
|
|
50
50
|
- lib/scout/command/install.rb
|
|
51
51
|
- lib/scout/command/run.rb
|
|
52
52
|
- lib/scout/command/sign.rb
|
|
53
|
-
- lib/scout/command/stream.rb
|
|
54
53
|
- lib/scout/command/test.rb
|
|
55
54
|
- lib/scout/command/troubleshoot.rb
|
|
56
55
|
- lib/scout/daemon_spawn.rb
|
|
@@ -60,7 +59,7 @@ files:
|
|
|
60
59
|
- lib/scout/server.rb
|
|
61
60
|
- lib/scout/server_base.rb
|
|
62
61
|
- lib/scout/streamer.rb
|
|
63
|
-
- lib/scout/
|
|
62
|
+
- lib/scout/streamer_daemon.rb
|
|
64
63
|
- lib/scout/version.rb
|
|
65
64
|
- scout.gemspec
|
|
66
65
|
- test/plugins/disk_usage.rb
|
|
@@ -208,7 +207,6 @@ files:
|
|
|
208
207
|
- vendor/signature/.document
|
|
209
208
|
- vendor/signature/.gitignore
|
|
210
209
|
- vendor/signature/Gemfile
|
|
211
|
-
- vendor/signature/Gemfile.lock
|
|
212
210
|
- vendor/signature/LICENSE
|
|
213
211
|
- vendor/signature/README.md
|
|
214
212
|
- vendor/signature/Rakefile
|
|
@@ -234,9 +232,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
234
232
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
233
|
none: false
|
|
236
234
|
requirements:
|
|
237
|
-
- - ! '
|
|
235
|
+
- - ! '>='
|
|
238
236
|
- !ruby/object:Gem::Version
|
|
239
|
-
version:
|
|
237
|
+
version: '0'
|
|
240
238
|
requirements: []
|
|
241
239
|
rubyforge_project: scout
|
|
242
240
|
rubygems_version: 1.8.10
|
data/lib/scout/command/stream.rb
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby -wKU
|
|
2
|
-
|
|
3
|
-
require "logger"
|
|
4
|
-
|
|
5
|
-
module Scout
|
|
6
|
-
class Command
|
|
7
|
-
class Stream < Command
|
|
8
|
-
PID_FILENAME="streamer.pid"
|
|
9
|
-
|
|
10
|
-
def run
|
|
11
|
-
@key = @args[0]
|
|
12
|
-
daemon_command = @args[1]
|
|
13
|
-
@plugin_ids = @options[:plugin_ids]
|
|
14
|
-
|
|
15
|
-
if !@key
|
|
16
|
-
puts "usage: scout stream [your_scout_key] [start|stop]"
|
|
17
|
-
exit(1)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# server and history methods are inherited from Scout::Command base class
|
|
21
|
-
streamer_log_file=File.join(File.dirname(history),"scout_streamer.log")
|
|
22
|
-
streamer_pid_file=File.join(File.dirname(history),"scout_streamer.pid")
|
|
23
|
-
|
|
24
|
-
streamer_control_options = {:log_file => streamer_log_file,
|
|
25
|
-
:pid_file => streamer_pid_file,
|
|
26
|
-
:sync_log => true,
|
|
27
|
-
:working_dir => File.dirname(history)}
|
|
28
|
-
|
|
29
|
-
# we use STDOUT for the logger because daemon_spawn directs STDOUT to a log file
|
|
30
|
-
streamer_control_args = [server, @key, history, @plugin_ids, @options[:streaming_key],Logger.new(STDOUT)]
|
|
31
|
-
|
|
32
|
-
if daemon_command.include? "start" # can be 'start' or 'restart'
|
|
33
|
-
if File.exists?(streamer_pid_file)
|
|
34
|
-
puts("PID file existed. Restarting ...") if $stdin.tty?
|
|
35
|
-
Scout::StreamerControl.restart(streamer_control_options,streamer_control_args)
|
|
36
|
-
else
|
|
37
|
-
puts("Starting ... ") if $stdin.tty?
|
|
38
|
-
Scout::StreamerControl.start(streamer_control_options,streamer_control_args)
|
|
39
|
-
end
|
|
40
|
-
elsif daemon_command == "stop"
|
|
41
|
-
puts("Stopping ...") if $stdin.tty?
|
|
42
|
-
Scout::StreamerControl.stop(streamer_control_options,[])
|
|
43
|
-
else
|
|
44
|
-
puts "usage: scout stream [your_scout_key] [start|stop]"
|
|
45
|
-
exit(1)
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
module Scout
|
|
2
|
-
class StreamerControl < DaemonSpawn::Base
|
|
3
|
-
|
|
4
|
-
# args are: server, key, history, plugin_ids, streaming_key, log
|
|
5
|
-
def start(args)
|
|
6
|
-
#puts "StreamerControl#start PID=#{pid}"
|
|
7
|
-
server,key,history,plugin_ids,streaming_key,log = args
|
|
8
|
-
$continue_streaming = true #needed for streamer to loop
|
|
9
|
-
|
|
10
|
-
@scout = Scout::Streamer.new(server, key, history, plugin_ids, streaming_key, log)
|
|
11
|
-
# puts "StreamerControl - done. Removing pid_file at #{pid_file} containing PID=#{pid}"
|
|
12
|
-
File.unlink(pid_file) if File.exists?(pid_file) # a better way of doing this?
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def stop
|
|
16
|
-
$continue_streaming = false
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
# This is how to start using this file as a start/stop command processor, and passing arguments in via command line:
|
|
23
|
-
# Since there's no second argument to StreamerControl.spawn!, it uses command-line arguments.
|
|
24
|
-
#Scout::StreamerControl.spawn!({:log_file => File.expand_path('~/.scout/scout_streamer.log'),
|
|
25
|
-
# :pid_file => File.expand_path('~/.scout/scout_streamer.pid'),
|
|
26
|
-
# :sync_log => true,
|
|
27
|
-
# :working_dir => File.dirname(__FILE__)})
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# This is how you start it from anywhere in code:
|
|
31
|
-
# Since there's a second argument to StreamerControl.spawn!, it uses those instead of command-line arguments.
|
|
32
|
-
#Scout::StreamerControl.start({:log_file => File.expand_path('~/.scout/scout_streamer.log'),
|
|
33
|
-
# :pid_file => File.expand_path('~/.scout/scout_streamer.pid'),
|
|
34
|
-
# :sync_log => true,
|
|
35
|
-
# :working_dir => File.dirname(__FILE__)},
|
|
36
|
-
# ["ServerInstance", "abcd-1234-123g2-12321", "~/.scout/history.yml",[1,2,3,4],nil])
|
|
37
|
-
|
|
38
|
-
# This is how you stop in anywhere in code:
|
|
39
|
-
# Since there's a second argument to StreamerControl.spawn!, it uses those instead of command-line arguments.
|
|
40
|
-
#Scout::StreamerControl.stop({:log_file => File.expand_path('~/.scout/scout_streamer.log'),
|
|
41
|
-
# :pid_file => File.expand_path('~/.scout/scout_streamer.pid'),
|
|
42
|
-
# :sync_log => true,
|
|
43
|
-
# :working_dir => File.dirname(__FILE__)},[])
|