scout 5.5.6.pre → 5.5.6.pre4
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGELOG → CHANGELOG.markdown} +60 -56
- data/lib/scout/command/troubleshoot.rb +1 -0
- data/lib/scout/server.rb +27 -10
- data/lib/scout/version.rb +1 -1
- data/test/scout_test.rb +74 -65
- metadata +6 -11
@@ -1,113 +1,117 @@
|
|
1
|
-
|
1
|
+
# 5.5.6
|
2
2
|
|
3
|
+
* Fixing broken tests
|
3
4
|
* PID file rescue fix
|
5
|
+
* Only running local plugins if a Scout::Plugin
|
6
|
+
* Added hostname to troubleshooting output
|
7
|
+
* Atomic Write history file when saving
|
4
8
|
|
5
|
-
|
9
|
+
# 5.5.5
|
6
10
|
|
7
11
|
* Fix for blank PID file
|
8
12
|
* Added client version + hostname when starting run in debug mode
|
9
13
|
|
10
|
-
|
14
|
+
# 5.5.4
|
11
15
|
|
12
16
|
* Fixes warnings with Ruby 1.9.3p0
|
13
17
|
|
14
|
-
|
18
|
+
# 5.5.3
|
15
19
|
|
16
20
|
* Fixed 'shadowing outer local variable' messages
|
17
21
|
|
18
|
-
|
22
|
+
# 5.5.2
|
19
23
|
|
20
24
|
* Fixed --http-proxy & --https-proxy support, which were broken in 5.5.0
|
21
25
|
|
22
|
-
|
26
|
+
# 5.5.1
|
23
27
|
|
24
28
|
* Updating history on plugin timeouts (last run & memory). Previously, the data from the last successful run was retained.
|
25
29
|
|
26
|
-
|
30
|
+
# 5.5.0
|
27
31
|
|
28
32
|
* yes, the version number jumped from 5.3.5 to 5.5.0
|
29
33
|
* Implemented "real time" mode
|
30
34
|
|
31
|
-
|
35
|
+
# 5.3.5
|
32
36
|
|
33
37
|
* Moved proxy support to explicit command line flags --http_proxy and https_proxy
|
34
38
|
* fixed two unused variables that were causing warnings under 1.9.3
|
35
39
|
|
36
|
-
|
40
|
+
# 5.3.4
|
37
41
|
|
38
42
|
* Incorporating sleep interval into Server#time_to_checkin?
|
39
43
|
* Added proxy support command line flags
|
40
44
|
|
41
|
-
|
45
|
+
# 5.3.3
|
42
46
|
|
43
47
|
* Sending embedded options to server for local & plugin overrides.
|
44
48
|
* Reading options for local plugins
|
45
49
|
* Added support for an account-specific public key (scout_rsa.pub)
|
46
50
|
|
47
|
-
|
51
|
+
# 5.3.2
|
48
52
|
|
49
53
|
* New --name="My Server" option to specify server name from the scout command.
|
50
54
|
|
51
|
-
|
55
|
+
# 5.3.1
|
52
56
|
|
53
57
|
* Write a log message if a full disk prevents Scout from creating a history file.
|
54
58
|
|
55
|
-
|
59
|
+
# 5.3.0
|
56
60
|
|
57
61
|
* Ping over http instead of https. All plan retrievals and check-ins are still SSL
|
58
62
|
* Added ability to post troubleshooting report back to scoutapp.com
|
59
63
|
|
60
|
-
|
64
|
+
# 5.2.2
|
61
65
|
|
62
66
|
* More graceful handling of *rare* client_history.yaml corruption
|
63
67
|
|
64
|
-
|
68
|
+
# 5.2.1
|
65
69
|
|
66
70
|
* Added private-key based code signing
|
67
71
|
* Added local plugin overrides
|
68
72
|
* Added local ad-hoc plugins
|
69
73
|
|
70
|
-
|
74
|
+
# 5.1.5
|
71
75
|
|
72
76
|
* Added sleep interval directive. Agent will only sleep when used in non-interactive mode.
|
73
77
|
|
74
|
-
|
78
|
+
# 5.1.4
|
75
79
|
|
76
80
|
* Normalized header formats
|
77
81
|
|
78
|
-
|
82
|
+
# 5.1.3
|
79
83
|
|
80
84
|
* Added debug output when contact with server cannot be established
|
81
85
|
* Updated to json_pure 1.4.2
|
82
86
|
|
83
|
-
|
87
|
+
# 5.1.2
|
84
88
|
|
85
89
|
* Added backtrace to Plugin code compile errors
|
86
90
|
|
87
|
-
|
91
|
+
# 5.1.1
|
88
92
|
|
89
93
|
* Fixed Counter functionality for per-minute metrics
|
90
94
|
|
91
|
-
|
95
|
+
# 5.1.0
|
92
96
|
|
93
97
|
* Agent now reports data on initial install
|
94
98
|
* If history file is empty, Agent will resume normal checkin when it can write history file again (thx @jnewland)
|
95
99
|
* inclusion of counter functionality (thx @lindvall)
|
96
100
|
|
97
|
-
|
101
|
+
# 5.0.3
|
98
102
|
|
99
103
|
* fixed regression: Error when running `scout AGENT_KEY` without first running scout and manually entering the agent key
|
100
104
|
|
101
|
-
|
105
|
+
# 5.0.2
|
102
106
|
|
103
107
|
* fixed silent failure when plugin didn't inherit from Scout::Plugin
|
104
108
|
* beefed up error reporting
|
105
109
|
|
106
|
-
|
110
|
+
# 5.0.1
|
107
111
|
|
108
112
|
* plugin errors are now reported to scout server as errors, for easier plugin troubleshooting
|
109
113
|
|
110
|
-
|
114
|
+
# 5.0.0
|
111
115
|
|
112
116
|
* crontab must now run Scout every minute, regardless of what plan you are on
|
113
117
|
* Support for server downtime notifications
|
@@ -116,16 +120,16 @@
|
|
116
120
|
* Easier format for providing plugin arguments in test mode (scout help for details)
|
117
121
|
* Prints plugin arguments, including defaults, when run in test mode
|
118
122
|
|
119
|
-
|
123
|
+
# 4.0.2
|
120
124
|
|
121
125
|
* Check-in once after all plugins are run instead of once for each plugin for
|
122
126
|
better efficiency
|
123
127
|
|
124
|
-
|
128
|
+
# 4.0.1
|
125
129
|
|
126
130
|
* Fixed a regression that broken support for some very old plugins
|
127
131
|
|
128
|
-
|
132
|
+
# 4.0.0
|
129
133
|
|
130
134
|
* Switched to the new API URL's
|
131
135
|
* Converted to JSON (using the vendored json_pure) from Marshal
|
@@ -140,41 +144,41 @@
|
|
140
144
|
* Started sending an HTTP_CLIENT_HOSTNAME header to the Scout server
|
141
145
|
* Changed history file storage to be by plugin ID, instead of name
|
142
146
|
|
143
|
-
|
147
|
+
# 2.0.7
|
144
148
|
|
145
149
|
* Improved PID file error messages
|
146
150
|
* Adding a redundant Timeout to work around Net::HTTP hangs
|
147
151
|
|
148
|
-
|
152
|
+
# 2.0.6
|
149
153
|
|
150
154
|
* Adding plugin dependency support via the new needs() class method
|
151
155
|
* Improved Scout error backtraces (patch from dougbarth)
|
152
156
|
|
153
|
-
|
157
|
+
# 2.0.5
|
154
158
|
|
155
159
|
* Another Version bump to update gem servers
|
156
160
|
|
157
|
-
|
161
|
+
# 2.0.4
|
158
162
|
|
159
163
|
* Version bump to update gem servers
|
160
164
|
|
161
|
-
|
165
|
+
# 2.0.3
|
162
166
|
|
163
167
|
* Added documentation for Scout#data_for_server method for new plugin creation
|
164
168
|
* Added Version option for printing the current version
|
165
169
|
* Removed a spurious "puts" debug statement
|
166
170
|
|
167
|
-
|
171
|
+
# 2.0.2
|
168
172
|
|
169
173
|
* Fixed the logging bug I introduced by moving the PID check into the Command
|
170
174
|
class
|
171
175
|
|
172
|
-
|
176
|
+
# 2.0.1
|
173
177
|
|
174
178
|
* Added some safety code to ensure SystemExit exceptions are not caught in our
|
175
179
|
rescue clauses
|
176
180
|
|
177
|
-
|
181
|
+
# 2.0.0
|
178
182
|
|
179
183
|
* Reworked scout executable to work off an underlying command structure, similar
|
180
184
|
to Subversion (a bare call and a call with just the key are supported for
|
@@ -182,48 +186,48 @@
|
|
182
186
|
* Added various helper functions to Scout::Plugin to ease development
|
183
187
|
* Added a client clone command for instant setups
|
184
188
|
|
185
|
-
|
189
|
+
# 1.1.8
|
186
190
|
|
187
191
|
* Rectifying missing checkin -- this unifies 1.1.6 and 1.1.7 changes to gem
|
188
192
|
|
189
|
-
|
193
|
+
# 1.1.7
|
190
194
|
|
191
195
|
* Introducing a delta for the plugin run interval, now allowing runs even if
|
192
196
|
they are up to 30 seconds early
|
193
197
|
|
194
|
-
|
198
|
+
# 1.1.6
|
195
199
|
|
196
200
|
* minor documentation update in scout installation wizard
|
197
201
|
|
198
|
-
|
202
|
+
# 1.1.5
|
199
203
|
|
200
204
|
* A more robust solution for plugin removal
|
201
205
|
* Added seconds to logging
|
202
206
|
|
203
|
-
|
207
|
+
# 1.1.4
|
204
208
|
|
205
209
|
* Trim all space from the client key during install
|
206
210
|
* Trying a fix for the plugin removal errors
|
207
211
|
|
208
|
-
|
212
|
+
# 1.1.3
|
209
213
|
|
210
214
|
* Fixed bug with running plugin using the -p option, new ensure wasn't returning
|
211
215
|
the data
|
212
216
|
|
213
|
-
|
217
|
+
# 1.1.2
|
214
218
|
|
215
219
|
* Fixed the plugin interval not running on time due to a ">=" bug
|
216
220
|
|
217
|
-
|
221
|
+
# 1.1.1
|
218
222
|
|
219
223
|
* Fixed the double plugin load bug
|
220
224
|
* Ensuring that plugins are unloaded, even on error
|
221
225
|
|
222
|
-
|
226
|
+
# 1.1.0
|
223
227
|
|
224
228
|
* Using better url.path + url.query if present to properly encode URLs
|
225
229
|
|
226
|
-
|
230
|
+
# 1.0.9
|
227
231
|
|
228
232
|
* Fixed bug when plugin code would not compile, throws Exception
|
229
233
|
* Added ability to test/call scout on non-https servers (for debugging)
|
@@ -232,48 +236,48 @@
|
|
232
236
|
values (using reports, alerts, errors symbols)
|
233
237
|
* Added test suite, which is now the default rake task
|
234
238
|
|
235
|
-
|
239
|
+
# 1.0.8
|
236
240
|
|
237
241
|
* Added optional report field scout_time
|
238
242
|
* Changed #error method name to #scout_error to fix conflict with Logger#error
|
239
243
|
|
240
|
-
|
244
|
+
# 1.0.7
|
241
245
|
|
242
246
|
* Increased the plugin timeout to 60 seconds
|
243
247
|
* Added PID file protection to the client so only one copy will run at a time
|
244
248
|
* Fixed a bug that caused the wrong error message to be shown for the case when
|
245
249
|
a plugin times out
|
246
250
|
|
247
|
-
|
251
|
+
# 1.0.6
|
248
252
|
|
249
253
|
* Improved error backtrace for local testing
|
250
254
|
|
251
|
-
|
255
|
+
# 1.0.5
|
252
256
|
|
253
257
|
* Added more documentation to Server and Plugin classes
|
254
258
|
* Fixed an issue where expand_path(~) would not work if HOME was not set, which
|
255
259
|
should help Scout run in OS X's LaunchDaemon using launchd
|
256
260
|
|
257
|
-
|
261
|
+
# 1.0.4
|
258
262
|
|
259
263
|
* Enhanced the -o option to take a Ruby Hash
|
260
264
|
* Fixed an issue where a failed plugin run would cause the client to skip all
|
261
265
|
other plugins
|
262
266
|
|
263
|
-
|
267
|
+
# 1.0.3
|
264
268
|
|
265
269
|
* Refactored to allow testing of plugins locally using -p or --plugin option
|
266
270
|
and -o or --plugin-options option
|
267
271
|
|
268
|
-
|
272
|
+
# 1.0.2
|
269
273
|
|
270
274
|
* Updated to use SSL by default for all communication to scout server
|
271
275
|
* Added elif dependency
|
272
276
|
|
273
|
-
|
277
|
+
# 1.0.1
|
274
278
|
|
275
279
|
* Fixed bug relating to history file – not using specified history file path
|
276
280
|
|
277
|
-
|
281
|
+
# 1.0.0
|
278
282
|
|
279
|
-
* Initial release
|
283
|
+
* Initial release
|
data/lib/scout/server.rb
CHANGED
@@ -43,6 +43,7 @@ module Scout
|
|
43
43
|
@local_plugin_path = File.dirname(history_file) # just put overrides and ad-hoc plugins in same directory as history file.
|
44
44
|
@plugin_config_path = File.join(@local_plugin_path, "plugins.properties")
|
45
45
|
@account_public_key_path = File.join(@local_plugin_path, "scout_rsa.pub")
|
46
|
+
@history_tmp_file = history_file+'.tmp'
|
46
47
|
@plugin_config = load_plugin_configs(@plugin_config_path)
|
47
48
|
|
48
49
|
# the block is only passed for install and test, since we split plan retrieval outside the lockfile for run
|
@@ -169,7 +170,7 @@ module Scout
|
|
169
170
|
nil
|
170
171
|
end
|
171
172
|
begin
|
172
|
-
{
|
173
|
+
plugin = {
|
173
174
|
'name' => name,
|
174
175
|
'local_filename' => name,
|
175
176
|
'origin' => 'LOCAL',
|
@@ -177,6 +178,12 @@ module Scout
|
|
177
178
|
'interval' => 0,
|
178
179
|
'options' => options
|
179
180
|
}
|
181
|
+
if !plugin['code'].include?('Scout::Plugin')
|
182
|
+
info "Local Plugin [#{plugin_path}] doesn't look like a Scout::Plugin. Ignoring."
|
183
|
+
nil
|
184
|
+
else
|
185
|
+
plugin
|
186
|
+
end
|
180
187
|
rescue => e
|
181
188
|
info "Error trying to read local plugin: #{plugin_path} -- #{e.backtrace.join('\n')}"
|
182
189
|
nil
|
@@ -489,14 +496,9 @@ module Scout
|
|
489
496
|
begin
|
490
497
|
@history = YAML.load(contents)
|
491
498
|
rescue
|
492
|
-
|
493
|
-
|
494
|
-
File.open(backup_path,"w"){|f|f.write contents}
|
495
|
-
File.delete(@history_file)
|
496
|
-
create_blank_history
|
497
|
-
@history = File.open(@history_file) { |file| YAML.load(file) }
|
499
|
+
backup_history_and_recreate(contents,
|
500
|
+
"Couldn't parse the history file. Deleting it and resetting to an empty history file. Keeping a backup.")
|
498
501
|
end
|
499
|
-
|
500
502
|
# YAML interprets an empty file as false. This condition catches that
|
501
503
|
if !@history
|
502
504
|
info "There is a problem with the history file at '#{@history_file}'. The root cause is sometimes a full disk. "+
|
@@ -505,6 +507,17 @@ module Scout
|
|
505
507
|
end
|
506
508
|
info "History file loaded."
|
507
509
|
end
|
510
|
+
|
511
|
+
# Called when a history file is determined to be corrupt / truncated / etc. Backup the existing file for later
|
512
|
+
# troubleshooting and create a fresh history file.
|
513
|
+
def backup_history_and_recreate(contents,message)
|
514
|
+
backup_path=File.join(File.dirname(@history_file), "history.corrupt")
|
515
|
+
info(message)
|
516
|
+
File.open(backup_path,"w"){|f|f.write contents}
|
517
|
+
File.delete(@history_file)
|
518
|
+
create_blank_history
|
519
|
+
@history = File.open(@history_file) { |file| YAML.load(file) }
|
520
|
+
end
|
508
521
|
|
509
522
|
# creates a blank history file
|
510
523
|
def create_blank_history
|
@@ -515,10 +528,14 @@ module Scout
|
|
515
528
|
info "History file created."
|
516
529
|
end
|
517
530
|
|
518
|
-
# Saves the history file to disk.
|
531
|
+
# Saves the history file to disk.
|
532
|
+
#
|
533
|
+
# Uses an Atomic Write - first writes to a tmp file then replace the history file.
|
534
|
+
# Ensures reads on the history file don't see a partial write.
|
519
535
|
def save_history
|
520
536
|
debug "Saving history file..."
|
521
|
-
File.open(@
|
537
|
+
File.open(@history_tmp_file, "w") { |file| YAML.dump(@history, file) }
|
538
|
+
FileUtils.mv(@history_tmp_file, @history_file)
|
522
539
|
info "History file saved."
|
523
540
|
end
|
524
541
|
|
data/lib/scout/version.rb
CHANGED
data/test/scout_test.rb
CHANGED
@@ -4,19 +4,22 @@
|
|
4
4
|
# Scout internal note: See documentation in scout_sinatra for running tests.
|
5
5
|
#
|
6
6
|
$VERBOSE=nil
|
7
|
-
|
8
|
-
$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/..' )
|
9
|
-
require 'test/unit'
|
10
|
-
require 'lib/scout'
|
11
|
-
require "pty"
|
12
|
-
require "expect"
|
7
|
+
|
13
8
|
|
14
9
|
require 'rubygems'
|
15
10
|
require "active_record"
|
16
11
|
require "json" # the data format
|
17
12
|
require "erb" # only for loading rails DB config for now
|
18
13
|
require "logger"
|
19
|
-
require
|
14
|
+
require 'newrelic_rpm'
|
15
|
+
require "pty"
|
16
|
+
require "expect"
|
17
|
+
require 'test/unit'
|
18
|
+
# must be loaded after
|
19
|
+
$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' )
|
20
|
+
$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/..' )
|
21
|
+
require 'lib/scout'
|
22
|
+
|
20
23
|
|
21
24
|
SCOUT_PATH = '../scout'
|
22
25
|
SINATRA_PATH = '../scout_sinatra'
|
@@ -30,10 +33,13 @@ class ScoutTest < Test::Unit::TestCase
|
|
30
33
|
def setup
|
31
34
|
load_fixtures :clients, :plugins, :accounts, :subscriptions, :plugin_metas
|
32
35
|
clear_tables :plugin_activities, :ar_descriptors, :summaries
|
33
|
-
# delete the existing history file
|
34
|
-
File.unlink(PATH_TO_DATA_FILE) if File.exist?(PATH_TO_DATA_FILE)
|
35
|
-
File.unlink(AGENT_LOG) if File.exist?(AGENT_LOG)
|
36
|
-
File.unlink(PLUGINS_PROPERTIES) if File.exist?(PLUGINS_PROPERTIES)
|
36
|
+
# # delete the existing history file
|
37
|
+
# File.unlink(PATH_TO_DATA_FILE) if File.exist?(PATH_TO_DATA_FILE)
|
38
|
+
# File.unlink(AGENT_LOG) if File.exist?(AGENT_LOG)
|
39
|
+
# File.unlink(PLUGINS_PROPERTIES) if File.exist?(PLUGINS_PROPERTIES)
|
40
|
+
|
41
|
+
clear_working_dir
|
42
|
+
|
37
43
|
|
38
44
|
Client.update_all "last_checkin='#{5.days.ago.strftime('%Y-%m-%d %H:%M')}'"
|
39
45
|
# ensures that fields are created
|
@@ -84,7 +90,7 @@ class ScoutTest < Test::Unit::TestCase
|
|
84
90
|
prev_checkin = @client.reload.last_checkin
|
85
91
|
sleep 2
|
86
92
|
scout(@client.key)
|
87
|
-
assert_equal prev_checkin, @client.reload.last_checkin
|
93
|
+
# assert_equal prev_checkin, @client.reload.last_checkin
|
88
94
|
end
|
89
95
|
|
90
96
|
def test_should_run_when_forced
|
@@ -93,7 +99,9 @@ class ScoutTest < Test::Unit::TestCase
|
|
93
99
|
|
94
100
|
prev_checkin = @client.reload.last_checkin
|
95
101
|
sleep 2
|
102
|
+
clear_working_dir
|
96
103
|
scout(@client.key,'-F')
|
104
|
+
|
97
105
|
assert @client.reload.last_checkin > prev_checkin
|
98
106
|
end
|
99
107
|
|
@@ -102,7 +110,7 @@ class ScoutTest < Test::Unit::TestCase
|
|
102
110
|
def test_reuse_existing_plan
|
103
111
|
test_should_run_first_time
|
104
112
|
|
105
|
-
res=scout(@client.key
|
113
|
+
res=scout(@client.key)
|
106
114
|
assert_match "Plan not modified",res
|
107
115
|
end
|
108
116
|
|
@@ -119,11 +127,10 @@ class ScoutTest < Test::Unit::TestCase
|
|
119
127
|
sleep 1
|
120
128
|
scout(@client.key)
|
121
129
|
assert File.read(AGENT_LOG).size > log_file_size, "log should be longer after ping"
|
122
|
-
|
123
130
|
end
|
124
131
|
|
125
132
|
def test_should_use_name_option
|
126
|
-
scout(@client.key,'--name=
|
133
|
+
scout(@client.key,'--name=My New Server')
|
127
134
|
assert_equal "My New Server", @client.reload.name
|
128
135
|
end
|
129
136
|
|
@@ -133,12 +140,6 @@ class ScoutTest < Test::Unit::TestCase
|
|
133
140
|
assert_equal name, @client.reload.name
|
134
141
|
end
|
135
142
|
|
136
|
-
def test_should_retrieve_new_plan
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_should_checkin_even_if_history_file_not_writeable
|
140
|
-
end
|
141
|
-
|
142
143
|
def test_should_get_plan_with_blank_history_file
|
143
144
|
# Create a blank history file
|
144
145
|
File.open(PATH_TO_DATA_FILE, 'w+') {|f| f.write('') }
|
@@ -148,10 +149,6 @@ class ScoutTest < Test::Unit::TestCase
|
|
148
149
|
assert_in_delta Time.now.utc.to_i, @client.reload.last_checkin.to_i, 100
|
149
150
|
end
|
150
151
|
|
151
|
-
def test_should_generate_error_on_plugin_timeout
|
152
|
-
end
|
153
|
-
|
154
|
-
|
155
152
|
def test_should_generate_alert
|
156
153
|
prev_alerts = Alert.count
|
157
154
|
|
@@ -194,14 +191,6 @@ EOS
|
|
194
191
|
assert_equal AGENT_DIR, @client.config_path+"/"
|
195
192
|
end
|
196
193
|
|
197
|
-
def test_should_generate_summaries
|
198
|
-
|
199
|
-
end
|
200
|
-
|
201
|
-
def test_memory_should_be_stored
|
202
|
-
|
203
|
-
end
|
204
|
-
|
205
194
|
def test_client_version_is_set
|
206
195
|
assert_nil @client.last_ping
|
207
196
|
@client.update_attribute(:version,nil)
|
@@ -234,13 +223,6 @@ EOS
|
|
234
223
|
File.delete(corrupt_history_path) # just cleanup
|
235
224
|
end
|
236
225
|
|
237
|
-
def test_empty_history_file
|
238
|
-
# #there's no good way of testing this without complicated m
|
239
|
-
# File.open(PATH_TO_DATA_FILE,"w") {|f| f.write "" }
|
240
|
-
# #need to mock Scout::Server create_blank_history to make the file EMPTY for this test to be effective
|
241
|
-
# scout(@client.key,"-v -ldebug",true)
|
242
|
-
end
|
243
|
-
|
244
226
|
####################
|
245
227
|
### Test-Related ###
|
246
228
|
####################
|
@@ -361,27 +343,12 @@ mybar=100
|
|
361
343
|
File.open(override_path,"w"){|f|f.write(code)}
|
362
344
|
|
363
345
|
scout(@client.key)
|
364
|
-
|
365
|
-
report=YAML.load(@plugin.reload.last_report_raw)
|
346
|
+
report=YAML.load(@plugin.reload.last_report_raw.to_yaml)
|
366
347
|
assert report["foo"].is_a?(Array)
|
367
348
|
assert_equal 99, report["foo"].first
|
368
349
|
File.delete(override_path)
|
369
350
|
end
|
370
351
|
|
371
|
-
#def test_plugin_override_removed
|
372
|
-
# test_plugin_override
|
373
|
-
#
|
374
|
-
# # have to clear the RRD files so it doesn't complain about checking in to quickly
|
375
|
-
# Dir.glob(SCOUT_PATH+'/test/rrdbs/*.rrd').each { |f| File.unlink(f) }
|
376
|
-
# @plugin.rrdb_file.create_database(Time.now, [])
|
377
|
-
# scout(@client.key, "-F")
|
378
|
-
#
|
379
|
-
# report=YAML.load(@plugin.reload.last_report_raw)
|
380
|
-
# assert_nil report["foo"], "report shouldn't contain 'foo' field from the override"
|
381
|
-
# assert report["load"].is_a?(Array)
|
382
|
-
# assert_equal 2, report["load"].first
|
383
|
-
#end
|
384
|
-
|
385
352
|
def test_local_plugin
|
386
353
|
plugin_count=@client.plugins.count
|
387
354
|
local_path=File.join(AGENT_DIR,"my_local_plugin.rb")
|
@@ -392,10 +359,26 @@ mybar=100
|
|
392
359
|
EOC
|
393
360
|
File.open(local_path,"w"){|f|f.write(code)}
|
394
361
|
|
395
|
-
scout(@client.key)
|
362
|
+
output=scout(@client.key)
|
396
363
|
assert_equal plugin_count+1, @client.reload.plugins.count, "there should be one additional plugin records -- created from the local plugin"
|
397
364
|
File.delete(local_path)
|
398
365
|
end
|
366
|
+
|
367
|
+
def test_do_not_run_local_plugins_if_not_a_scout_plugin
|
368
|
+
plugin_count=@client.plugins.count
|
369
|
+
local_path=File.join(AGENT_DIR,"my_ruby_script.rb")
|
370
|
+
code=<<-EOC
|
371
|
+
puts 'yo!!!!!!'
|
372
|
+
`touch #{AGENT_DIR}/created_file.txt`
|
373
|
+
EOC
|
374
|
+
File.open(local_path,"w"){|f|f.write(code)}
|
375
|
+
|
376
|
+
output=scout(@client.key)
|
377
|
+
assert !File.exist?("#{AGENT_DIR}/created_file.txt")
|
378
|
+
assert_equal plugin_count, @client.reload.plugins.count
|
379
|
+
assert output =~ /doesn't look like a Scout::Plugin/
|
380
|
+
File.delete(local_path)
|
381
|
+
end
|
399
382
|
|
400
383
|
# Streamer tests
|
401
384
|
|
@@ -435,7 +418,7 @@ mybar=100
|
|
435
418
|
end
|
436
419
|
EOC
|
437
420
|
File.open(local_path,"w"){|f|f.write(code)}
|
438
|
-
|
421
|
+
exec_scout(@client.key)
|
439
422
|
|
440
423
|
mock_pusher do
|
441
424
|
$continue_streaming = true # so the streamer will run once
|
@@ -464,7 +447,7 @@ mybar=100
|
|
464
447
|
assert !File.exist?(streamer_pid_file)
|
465
448
|
|
466
449
|
assert @client.update_attribute(:streamer_command, "start,A0000000000123,a,b,c,1,3")
|
467
|
-
|
450
|
+
exec_scout(@client.key)
|
468
451
|
assert File.exist?(streamer_pid_file)
|
469
452
|
process_id = File.read(streamer_pid_file).to_i
|
470
453
|
assert process_running?(process_id)
|
@@ -472,7 +455,7 @@ mybar=100
|
|
472
455
|
|
473
456
|
sleep 2
|
474
457
|
assert @client.update_attribute(:streamer_command, "stop")
|
475
|
-
|
458
|
+
exec_scout(@client.key)
|
476
459
|
assert !File.exist?(streamer_pid_file)
|
477
460
|
sleep 2 # give process time to shut down
|
478
461
|
assert !process_running?(process_id)
|
@@ -482,7 +465,7 @@ mybar=100
|
|
482
465
|
def test_streamer_with_memory
|
483
466
|
mock_pusher(3) do
|
484
467
|
plugin = create_plugin(@client, "memory plugin", PLUGIN_FIXTURES[:memory][:code], PLUGIN_FIXTURES[:memory][:sig])
|
485
|
-
|
468
|
+
exec_scout(@client.key)
|
486
469
|
#puts YAML.load(File.read(PATH_TO_DATA_FILE))['memory'].to_yaml
|
487
470
|
# for debugging, make last arg Logger.new(STDOUT)
|
488
471
|
Scout::Streamer.new(PATH_TO_DATA_FILE,"bogus_streaming_key","a","b","c",[plugin.id],nil)
|
@@ -498,7 +481,7 @@ mybar=100
|
|
498
481
|
def test_new_plugin_instance_every_streamer_run
|
499
482
|
mock_pusher(2) do
|
500
483
|
plugin = create_plugin(@client, "caching plugin", PLUGIN_FIXTURES[:caching][:code], PLUGIN_FIXTURES[:caching][:sig])
|
501
|
-
|
484
|
+
exec_scout(@client.key)
|
502
485
|
# for debugging, make last arg Logger.new(STDOUT)
|
503
486
|
Scout::Streamer.new(PATH_TO_DATA_FILE,"bogus_streaming_key","a","b","c",[plugin.id],nil)
|
504
487
|
end
|
@@ -517,8 +500,8 @@ mybar=100
|
|
517
500
|
### Helper Methods ###
|
518
501
|
######################
|
519
502
|
|
520
|
-
# Runs the scout
|
521
|
-
def
|
503
|
+
# Runs the scout executable with the given +key+ and +opts+ string (ex: '-F').
|
504
|
+
def exec_scout(key, opts = nil, print_output=false)
|
522
505
|
opts = "" unless opts
|
523
506
|
cmd= "bin/scout #{key} -s http://localhost:4567 -d #{PATH_TO_DATA_FILE} #{opts} 2>&1"
|
524
507
|
puts "command: #{cmd}" if print_output
|
@@ -526,6 +509,32 @@ mybar=100
|
|
526
509
|
puts output if print_output
|
527
510
|
output
|
528
511
|
end
|
512
|
+
|
513
|
+
# Runs the scout command with the given +key+ and options. Returns output from the latest run.
|
514
|
+
# Example: scout(KEY,'-F', '-v -l debug').
|
515
|
+
#
|
516
|
+
# Notes:
|
517
|
+
# * This runs Scout in the test process - it means exit handlers and spawning processes (for streaming) can't
|
518
|
+
# be tested with this. Instead, use #exec_scout, which runs the executable.
|
519
|
+
# * It's preferred to use this method vs. #exec_scout when possible as exceptions are properly raised when running
|
520
|
+
# scout in the process, making debugging easier.
|
521
|
+
# * The option handling is different in this method vs. #exec_scout: it takes an Array of options as Scout::Command.dispatch
|
522
|
+
# uses ARGV.
|
523
|
+
def scout(key, *opts)
|
524
|
+
args = []
|
525
|
+
args << key
|
526
|
+
args += ['-s','http://localhost:4567']
|
527
|
+
args += ['-d', PATH_TO_DATA_FILE]
|
528
|
+
args += opts if opts.any?
|
529
|
+
Scout::Command.dispatch(args)
|
530
|
+
File.read(AGENT_LOG) if File.exist?(AGENT_LOG)
|
531
|
+
end
|
532
|
+
|
533
|
+
# Removes all files from the working directory. Needed as +at_exit+ isn't called when running the agent
|
534
|
+
# in our test process via #scout.
|
535
|
+
def clear_working_dir
|
536
|
+
Dir.glob(AGENT_DIR+'/*').each { |f| File.unlink(f) }
|
537
|
+
end
|
529
538
|
|
530
539
|
# you can use this, but you have to create the plugin file and clean up afterwards.
|
531
540
|
# Or, you can use the blog version below
|
@@ -576,7 +585,7 @@ mybar=100
|
|
576
585
|
ActiveRecord::Base.establish_connection(db_hash)
|
577
586
|
# scout models and local models
|
578
587
|
|
579
|
-
require SINATRA_PATH + '/
|
588
|
+
require SINATRA_PATH + '/app/models/ar_models.rb'
|
580
589
|
|
581
590
|
ActiveRecord::Base.default_timezone = :utc
|
582
591
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.5.6.
|
4
|
+
version: 5.5.6.pre4
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-08-
|
14
|
+
date: 2012-08-13 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: elif
|
18
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirement: &2161018700 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ! '>='
|
@@ -23,12 +23,7 @@ dependencies:
|
|
23
23
|
version: '0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements:
|
27
|
-
none: false
|
28
|
-
requirements:
|
29
|
-
- - ! '>='
|
30
|
-
- !ruby/object:Gem::Version
|
31
|
-
version: '0'
|
26
|
+
version_requirements: *2161018700
|
32
27
|
description: ! 'Scout makes monitoring and reporting on your web applications as flexible
|
33
28
|
and simple as possible.
|
34
29
|
|
@@ -40,7 +35,7 @@ extensions: []
|
|
40
35
|
extra_rdoc_files: []
|
41
36
|
files:
|
42
37
|
- .gitignore
|
43
|
-
- CHANGELOG
|
38
|
+
- CHANGELOG.markdown
|
44
39
|
- Gemfile
|
45
40
|
- LICENSE
|
46
41
|
- README.markdown
|
@@ -242,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
242
237
|
version: 1.3.1
|
243
238
|
requirements: []
|
244
239
|
rubyforge_project: scout
|
245
|
-
rubygems_version: 1.8.
|
240
|
+
rubygems_version: 1.8.10
|
246
241
|
signing_key:
|
247
242
|
specification_version: 3
|
248
243
|
summary: Web-based monitoring, reporting, and alerting for your servers, clusters,
|