stella 0.8.4.001 → 0.8.5.001
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +14 -1
- data/VERSION.yml +1 -1
- data/bin/stella +1 -1
- data/examples/essentials/plan.rb +2 -2
- data/lib/stella.rb +9 -3
- data/lib/stella/cli.rb +2 -2
- data/lib/stella/client.rb +4 -3
- data/lib/stella/engine.rb +93 -47
- data/lib/stella/engine/load.rb +16 -14
- data/stella.gemspec +2 -2
- data/vendor/httpclient-2.1.5.2/httpclient/session.rb +1 -1
- metadata +2 -2
data/CHANGES.txt
CHANGED
@@ -11,7 +11,20 @@ STELLA, CHANGES
|
|
11
11
|
* TODO: process templates for calls to set in get blocks
|
12
12
|
|
13
13
|
|
14
|
-
#### 0.8.
|
14
|
+
#### 0.8.5 (2010-03-27) ###############################
|
15
|
+
|
16
|
+
* FIXED: Add User-Agent header if Stella.agent is not null and one is not already provided
|
17
|
+
* FIXED: Client wait (undefined method '>' for Range error)
|
18
|
+
* CHANGE: Testrun#samples contains all data samples for each event in a given batch
|
19
|
+
* CHANGE: Renamed Testrun#events -> Testrun#event_probes
|
20
|
+
* ADDED: Testrun#logsize
|
21
|
+
* ADDED: Store HTTP status codes in Testrun#stats
|
22
|
+
* ADDED: Store error messages in Sample#errors
|
23
|
+
* ADDED: Stella.get now takes a block
|
24
|
+
* ADDED: Stella.agent
|
25
|
+
|
26
|
+
|
27
|
+
#### 0.8.4 (2010-03-19) ###############################
|
15
28
|
|
16
29
|
* FIXED: Misc issues getting and setting headers, params, and resources
|
17
30
|
* FIXED: There was no response body in Stella::Engine::Log objects
|
data/VERSION.yml
CHANGED
data/bin/stella
CHANGED
data/examples/essentials/plan.rb
CHANGED
@@ -221,7 +221,7 @@ usecase 25, "YAML API" do
|
|
221
221
|
# user should repeat this request 7 times.
|
222
222
|
#
|
223
223
|
response 200 do
|
224
|
-
repeat
|
224
|
+
repeat 3
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
@@ -238,7 +238,7 @@ usecase 10, "Self-serve API" do
|
|
238
238
|
param :city => random(['Toronto', 'Vancouver', 'Montreal'])
|
239
239
|
param :logo => file('logo.png')
|
240
240
|
response 302 do
|
241
|
-
repeat
|
241
|
+
repeat 2
|
242
242
|
end
|
243
243
|
end
|
244
244
|
|
data/lib/stella.rb
CHANGED
@@ -74,11 +74,12 @@ module Stella
|
|
74
74
|
@debug = false
|
75
75
|
@abort = false
|
76
76
|
@quiet = false
|
77
|
+
@agent = "Stella/#{Stella::VERSION}"
|
77
78
|
@log = Stella::SyncLogger.new
|
78
79
|
@stdout = Stella::Logger.new STDOUT
|
79
80
|
|
80
81
|
class << self
|
81
|
-
attr_accessor :log, :stdout
|
82
|
+
attr_accessor :log, :stdout, :agent
|
82
83
|
end
|
83
84
|
|
84
85
|
def le(*msg); stdout.info " " << msg.join("#{$/} ").colour(:red); end
|
@@ -127,10 +128,15 @@ module Stella
|
|
127
128
|
autoload :Client, 'stella/client'
|
128
129
|
autoload :Service, 'stella/service'
|
129
130
|
|
130
|
-
def get(uri, query={})
|
131
|
+
def get(uri, query={}, &blk)
|
131
132
|
require 'stella/client'
|
132
133
|
http_client = HTTPClient.new :agent_name => "Opera/9.51 (Windows NT 5.1; U; en)"
|
133
|
-
http_client.get(uri, query)
|
134
|
+
res = http_client.get(uri, query)
|
135
|
+
if blk.nil?
|
136
|
+
res.body.content
|
137
|
+
else
|
138
|
+
blk.call res
|
139
|
+
end
|
134
140
|
rescue => ex
|
135
141
|
STDERR.puts ex.message
|
136
142
|
STDERR.puts ex.backtrace if Stella.debug?
|
data/lib/stella/cli.rb
CHANGED
@@ -35,11 +35,11 @@ class Stella::CLI < Drydock::Command
|
|
35
35
|
|
36
36
|
def generate
|
37
37
|
testrun = run :generate
|
38
|
-
@exit_code = (testrun.
|
38
|
+
@exit_code = (testrun.has_errors? == 0 ? 0 : 1)
|
39
39
|
end
|
40
40
|
def verify
|
41
41
|
testrun = run :verify
|
42
|
-
@exit_code = (testrun.
|
42
|
+
@exit_code = (testrun.has_errors? == 0 ? 0 : 1)
|
43
43
|
end
|
44
44
|
|
45
45
|
def example
|
data/lib/stella/client.rb
CHANGED
@@ -154,8 +154,8 @@ module Stella
|
|
154
154
|
next
|
155
155
|
end
|
156
156
|
|
157
|
-
wait = (req.wait
|
158
|
-
run_sleeper(wait, asset_duration)
|
157
|
+
wait = (req.wait != 0) ? req.wait : @opts[:wait]
|
158
|
+
run_sleeper(wait, asset_duration) unless nowait?
|
159
159
|
|
160
160
|
# TODO: consider throw/catch
|
161
161
|
case ret.class.to_s
|
@@ -212,6 +212,7 @@ module Stella
|
|
212
212
|
end
|
213
213
|
|
214
214
|
def run_sleeper(wait, already_waited=0)
|
215
|
+
return if wait == 0
|
215
216
|
# The time it took to download the assets can
|
216
217
|
# be removed from the specified wait time.
|
217
218
|
if wait.is_a?(::Range)
|
@@ -228,7 +229,7 @@ module Stella
|
|
228
229
|
def create_http_client
|
229
230
|
opts = {
|
230
231
|
:proxy => @proxy.uri || nil, # a tautology for clarity
|
231
|
-
:agent_name =>
|
232
|
+
:agent_name => Stella.agent,
|
232
233
|
:from => nil
|
233
234
|
}
|
234
235
|
http_client = HTTPClient.new opts
|
data/lib/stella/engine.rb
CHANGED
@@ -97,6 +97,7 @@ class Stella::Testrun < Storable
|
|
97
97
|
field :repetitions => Integer
|
98
98
|
field :wait => Float
|
99
99
|
field :nowait => TrueClass
|
100
|
+
field :logsize => Integer
|
100
101
|
field :granularity => Integer
|
101
102
|
field :withparam => TrueClass
|
102
103
|
field :withheader => TrueClass
|
@@ -104,15 +105,18 @@ class Stella::Testrun < Storable
|
|
104
105
|
field :nostats => TrueClass
|
105
106
|
field :stats => Hash
|
106
107
|
field :samples => Array
|
108
|
+
field :event_probes => Array
|
109
|
+
field :agent => String
|
107
110
|
field :mode # verify or generate
|
108
111
|
field :plan
|
109
112
|
field :hosts
|
110
|
-
field :events
|
111
113
|
field :log
|
112
114
|
gibbler :plan, :hosts, :mode, :clients, :duration, :repetitions, :wait, :start_time, :userid
|
113
115
|
def initialize(plan=nil, opts={})
|
114
116
|
@plan = plan
|
115
117
|
@granularity = GRANULARITY
|
118
|
+
@logsize = 1
|
119
|
+
@log = []
|
116
120
|
process_options! opts if !plan.nil? && !opts.empty?
|
117
121
|
reset_stats
|
118
122
|
end
|
@@ -137,33 +141,7 @@ class Stella::Testrun < Storable
|
|
137
141
|
return Time.now.utc.to_i - @start_time if @end_time.nil? || @end_time <= 0
|
138
142
|
@end_time - @start_time
|
139
143
|
end
|
140
|
-
|
141
|
-
def self.from_hash(hash={})
|
142
|
-
me = super(hash)
|
143
|
-
me.plan = Stella::Testplan.from_hash(me.plan)
|
144
|
-
me.process_options! unless me.plan.nil?
|
145
|
-
|
146
|
-
me.samples.collect! do |sample|
|
147
|
-
Stella::Testrun::Sample.from_hash(sample)
|
148
|
-
end
|
149
|
-
|
150
|
-
me.plan.usecases.uniq.each_with_index do |uc,i|
|
151
|
-
uc.requests.each do |req|
|
152
|
-
me.events.each_with_index do |event,idx| # do_request, etc...
|
153
|
-
event &&= event.to_s
|
154
|
-
me.stats[uc.id][req.id][event] =
|
155
|
-
Benelux::Stats::Calculator.from_hash(me.stats[uc.id][req.id][event])
|
156
|
-
me.stats[uc.id]['summary'][event] =
|
157
|
-
Benelux::Stats::Calculator.from_hash(me.stats[uc.id]['summary'][event])
|
158
|
-
me.stats['summary'][event] =
|
159
|
-
Benelux::Stats::Calculator.from_hash(me.stats['summary'][event])
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
me
|
165
|
-
end
|
166
|
-
|
144
|
+
|
167
145
|
def client_options
|
168
146
|
opts = {
|
169
147
|
:nowait => self.nowait || false,
|
@@ -201,11 +179,13 @@ class Stella::Testrun < Storable
|
|
201
179
|
@stats ||= { :summary => {} }
|
202
180
|
|
203
181
|
@status ||= "new"
|
204
|
-
@
|
182
|
+
if @event_probes.nil? || @event_probes.empty?
|
183
|
+
@event_probes = ['response_time', 'response_content_size']
|
184
|
+
end
|
205
185
|
|
206
186
|
@start_time ||= Time.now.to_i
|
207
187
|
|
208
|
-
@
|
188
|
+
@event_probes.collect! { |event| event.to_s }
|
209
189
|
|
210
190
|
@duration ||= 0
|
211
191
|
@repetitions ||= 0
|
@@ -278,6 +258,7 @@ class Stella::Testrun < Storable
|
|
278
258
|
|
279
259
|
|
280
260
|
def run(opts={})
|
261
|
+
Stella.agent = @agent unless @agent.nil? || @agent.empty?
|
281
262
|
engine = case self.mode
|
282
263
|
when :verify
|
283
264
|
Stella::Engine::Functional.new(opts)
|
@@ -304,20 +285,60 @@ class Stella::Testrun < Storable
|
|
304
285
|
@stats = { 'summary' => {} }
|
305
286
|
unless @plan.nil?
|
306
287
|
@plan.usecases.each do |uc|
|
307
|
-
@
|
288
|
+
@event_probes.each do |event|
|
308
289
|
event &&= event.to_s
|
309
290
|
@stats['summary'][event] = Benelux::Stats::Calculator.new
|
310
291
|
@stats[uc.id] ||= { 'summary' => {} }
|
311
292
|
@stats[uc.id]['summary'][event] = Benelux::Stats::Calculator.new
|
293
|
+
@stats[uc.id]['summary']['status'] ||= {}
|
294
|
+
@stats['summary']['status'] ||= {}
|
312
295
|
uc.requests.each do |req|
|
313
296
|
@stats[uc.id][req.id] ||= {}
|
314
297
|
@stats[uc.id][req.id][event] = Benelux::Stats::Calculator.new
|
298
|
+
@stats[uc.id][req.id]['status'] ||= {}
|
315
299
|
end
|
316
300
|
end
|
317
301
|
end
|
318
302
|
end
|
319
303
|
end
|
320
304
|
|
305
|
+
|
306
|
+
def self.from_hash(hash={})
|
307
|
+
me = super(hash)
|
308
|
+
me.plan = Stella::Testplan.from_hash(me.plan)
|
309
|
+
me.process_options! unless me.plan.nil?
|
310
|
+
|
311
|
+
me.samples.collect! do |sample|
|
312
|
+
Stella::Testrun::Sample.from_hash(sample)
|
313
|
+
end
|
314
|
+
|
315
|
+
me.plan.usecases.uniq.each_with_index do |uc,i|
|
316
|
+
uc.requests.each do |req|
|
317
|
+
me.event_probes.each_with_index do |event,idx| # do_request, etc...
|
318
|
+
event &&= event.to_s
|
319
|
+
next unless me.stats[uc.id][req.id].has_key?(event)
|
320
|
+
next if Benelux::Stats::Calculator === me.stats[uc.id][req.id][event]
|
321
|
+
me.stats[uc.id][req.id][event] =
|
322
|
+
Benelux::Stats::Calculator.from_hash(me.stats[uc.id][req.id][event])
|
323
|
+
me.stats[uc.id]['summary'][event] =
|
324
|
+
Benelux::Stats::Calculator.from_hash(me.stats[uc.id]['summary'][event])
|
325
|
+
me.stats['summary'][event] =
|
326
|
+
Benelux::Stats::Calculator.from_hash(me.stats['summary'][event])
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
me
|
332
|
+
end
|
333
|
+
|
334
|
+
def has_errors?
|
335
|
+
return false if @samples.nil? || @samples.empty?
|
336
|
+
@samples.each { |sam|
|
337
|
+
return true if sam.has_errors?
|
338
|
+
}
|
339
|
+
false
|
340
|
+
end
|
341
|
+
|
321
342
|
def add_sample batch, concurrency, tl
|
322
343
|
|
323
344
|
opts = {
|
@@ -334,14 +355,35 @@ class Stella::Testrun < Storable
|
|
334
355
|
uc.requests.each do |req|
|
335
356
|
sam.stats[uc.id][req.id] ||= {}
|
336
357
|
filter = [uc.id, req.id]
|
337
|
-
@
|
358
|
+
@event_probes.each_with_index do |event,idx| # do_request, etc...
|
338
359
|
event &&= event.to_s
|
339
|
-
stats = tl.stats.group(event.to_sym)[filter]
|
340
|
-
sam.stats[uc.id][req.id]
|
360
|
+
stats = tl.stats.group(event.to_sym)[filter]
|
361
|
+
unless sam.stats[uc.id][req.id].has_key?(event)
|
362
|
+
stats[uc.id][req.id][event] ||= {}
|
363
|
+
@stats[uc.id][req.id][event] ||= Benelux::Stats::Calculator.new
|
364
|
+
@stats[uc.id]['summary'][event] ||= Benelux::Stats::Calculator.new
|
365
|
+
@stats['summary'][event] ||= Benelux::Stats::Calculator.new
|
366
|
+
end
|
367
|
+
# When we don't merge the stats from benelux,
|
368
|
+
# the each calculator contains just one sample.
|
369
|
+
# So when we grab the sum, it's just one event sample.
|
370
|
+
sam.stats[uc.id][req.id][event] = stats.collect {|c| c.sum }
|
341
371
|
# Tally request, usecase and total summaries at the same time.
|
342
|
-
@stats[uc.id][req.id][event] += stats
|
343
|
-
@stats[uc.id]['summary'][event] += stats
|
344
|
-
@stats['summary'][event] += stats
|
372
|
+
@stats[uc.id][req.id][event] += stats.merge
|
373
|
+
@stats[uc.id]['summary'][event] += stats.merge
|
374
|
+
@stats['summary'][event] += stats.merge
|
375
|
+
end
|
376
|
+
resp = tl.stats.group(:execute_response_handler)[filter]
|
377
|
+
resp.tag_values(:status).each do |status|
|
378
|
+
sam.stats[uc.id][req.id]['status'] ||= {}
|
379
|
+
count = resp[:status => status].size
|
380
|
+
sam.stats[uc.id][req.id]['status'][status.to_i] = count
|
381
|
+
end
|
382
|
+
tmp = tl.messages.filter([filter, :exception].flatten)
|
383
|
+
unless tmp.empty?
|
384
|
+
sam.errors[uc.id] ||= {}
|
385
|
+
sam.errors[uc.id][req.id] ||= []
|
386
|
+
sam.errors[uc.id][req.id].push *tmp
|
345
387
|
end
|
346
388
|
end
|
347
389
|
end
|
@@ -358,27 +400,31 @@ class Stella::Testrun < Storable
|
|
358
400
|
field :stamp
|
359
401
|
field :duration
|
360
402
|
field :stats => Hash
|
403
|
+
field :errors => Hash
|
361
404
|
#gibbler :batch, :concurrency, :stamp, :duration
|
362
405
|
def initialize(opts={})
|
363
406
|
opts.each_pair do |n,v|
|
364
407
|
self.send("#{n}=", v) if has_field? n
|
365
408
|
end
|
366
|
-
@stats = { }
|
409
|
+
@stats, @errors = {}, {}
|
410
|
+
end
|
411
|
+
def has_errors?
|
412
|
+
!@errors.nil? && !@errors.empty?
|
367
413
|
end
|
368
414
|
def self.from_hash(hash={})
|
369
415
|
me = super(hash)
|
370
|
-
stats = {}
|
416
|
+
#stats = {}
|
371
417
|
me.stats.each_pair { |ucid,uchash|
|
372
|
-
stats[ucid] = {}
|
373
418
|
uchash.each_pair { |reqid,reqhash|
|
374
|
-
stats[ucid][reqid]
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
419
|
+
if me.stats[ucid][reqid].has_key? 'status'
|
420
|
+
me.stats[ucid][reqid]['status'].each_pair do |status,value|
|
421
|
+
me.stats[ucid][reqid]['status'].delete status
|
422
|
+
me.stats[ucid][reqid]['status'][status.to_i] = value.to_i
|
423
|
+
end
|
424
|
+
end
|
425
|
+
}
|
380
426
|
}
|
381
|
-
me.stats = stats
|
427
|
+
#me.stats = stats
|
382
428
|
me
|
383
429
|
end
|
384
430
|
end
|
data/lib/stella/engine/load.rb
CHANGED
@@ -31,8 +31,6 @@ module Stella::Engine
|
|
31
31
|
Load.counts = [:request_header_size, :request_content_size]
|
32
32
|
Load.counts += [:response_headers_size, :response_content_size]
|
33
33
|
end
|
34
|
-
|
35
|
-
events = [Load.timers, Load.counts, :failed].flatten
|
36
34
|
|
37
35
|
testrun.save
|
38
36
|
|
@@ -196,8 +194,13 @@ module Stella::Engine
|
|
196
194
|
concurrency = @threads.select { |t| !t.status.nil? }.size
|
197
195
|
batch, timeline = Benelux.timeline_updates, Benelux.timeline_chunk
|
198
196
|
testrun.add_sample batch, concurrency, timeline
|
199
|
-
|
200
|
-
|
197
|
+
testrun.log = [] unless testrun.has_log?
|
198
|
+
if testrun.log.size < testrun.logsize
|
199
|
+
tmp = Benelux.timeline.messages.filter(:kind => :log)
|
200
|
+
unless tmp.nil? || tmp.empty?
|
201
|
+
# grab only as many elements from the log as configured
|
202
|
+
testrun.log.push *tmp.first(testrun.logsize-testrun.log.size)
|
203
|
+
end
|
201
204
|
end
|
202
205
|
testrun.save
|
203
206
|
@failog.info Benelux.timeline.messages.filter(:kind => :exception)
|
@@ -426,6 +429,8 @@ module Stella::Engine
|
|
426
429
|
end
|
427
430
|
|
428
431
|
def update_error_execute_response_handler(client_id, ex, req, container)
|
432
|
+
Benelux.thread_timeline.add_message ex.message, :kind => :exception
|
433
|
+
Benelux.thread_timeline.add_count :exception, 1
|
429
434
|
desc = "#{container.usecase.desc} > #{req.desc}"
|
430
435
|
if Stella.stdout.lev == 2
|
431
436
|
Stella.stdout.print 2, '.'.color(:red)
|
@@ -436,6 +441,8 @@ module Stella::Engine
|
|
436
441
|
end
|
437
442
|
|
438
443
|
def update_request_unhandled_exception(client_id, usecase, uri, req, params, ex)
|
444
|
+
Benelux.thread_timeline.add_message ex.message, :kind => :exception
|
445
|
+
Benelux.thread_timeline.add_count :error, 1
|
439
446
|
desc = "#{usecase.desc} > #{req.desc}"
|
440
447
|
if Stella.stdout.lev == 2
|
441
448
|
Stella.stdout.print 2, '.'.color(:red)
|
@@ -446,28 +453,23 @@ module Stella::Engine
|
|
446
453
|
end
|
447
454
|
|
448
455
|
def update_usecase_quit client_id, msg, req, container
|
449
|
-
args = [Time.now.to_f, Stella.sysinfo.hostname, client_id.short]
|
450
456
|
Benelux.thread_timeline.add_count :quit, 1
|
451
|
-
|
452
|
-
Benelux.thread_timeline.add_message args.join('; '), :kind => :exception
|
457
|
+
Benelux.thread_timeline.add_message msg, :kind => :quit
|
453
458
|
Stella.stdout.info3 " Client-%s QUIT %s" % [client_id.shorter, msg]
|
454
459
|
end
|
455
460
|
|
456
461
|
def update_request_fail client_id, msg, req, container
|
457
|
-
args = [Time.now.to_f, Stella.sysinfo.hostname, client_id.short]
|
458
462
|
Benelux.thread_timeline.add_count :failed, 1
|
459
|
-
|
460
|
-
Benelux.thread_timeline.add_message args.join('; '), :kind => :exception
|
463
|
+
Benelux.thread_timeline.add_message msg, :kind => :fail
|
461
464
|
Stella.stdout.info3 " Client-%s FAILED %s" % [client_id.shorter, msg]
|
462
465
|
end
|
463
466
|
|
464
467
|
def update_request_error client_id, msg, req, container
|
465
468
|
args = [Time.now.to_f, Stella.sysinfo.hostname, client_id.short]
|
466
|
-
Benelux.thread_timeline.add_count :
|
467
|
-
|
468
|
-
Benelux.thread_timeline.add_message args.join('; '), :kind => :exception
|
469
|
+
Benelux.thread_timeline.add_count :exception, 1
|
470
|
+
Benelux.thread_timeline.add_message msg, :kind => :exception
|
469
471
|
if Stella.stdout.lev >= 3
|
470
|
-
Stella.le ' Client-%s
|
472
|
+
Stella.le ' Client-%s %s' % [client_id.shorter, ex.message]
|
471
473
|
end
|
472
474
|
end
|
473
475
|
|
data/stella.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{stella}
|
8
|
-
s.version = "0.8.
|
8
|
+
s.version = "0.8.5.001"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Delano Mandelbaum"]
|
12
|
-
s.date = %q{2010-03-
|
12
|
+
s.date = %q{2010-03-29}
|
13
13
|
s.default_executable = %q{stella}
|
14
14
|
s.description = %q{Blame Stella for breaking your web application!}
|
15
15
|
s.email = %q{delano@solutious.com}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stella
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5.001
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-29 00:00:00 -04:00
|
13
13
|
default_executable: stella
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|