stella 0.7.0.015 → 0.7.0.017
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/CHANGES.txt +3 -3
- data/README.rdoc +2 -6
- data/Rudyfile +3 -3
- data/bin/stella +38 -26
- data/examples/cookies/plan.rb +9 -1
- data/examples/csvdata/plan.rb +27 -0
- data/examples/csvdata/search_terms.csv +14 -0
- data/examples/essentials/plan.rb +6 -6
- data/examples/essentials/{search_terms.csv → search_terms.txt} +0 -0
- data/examples/exceptions/plan.rb +9 -2
- data/lib/stella.rb +73 -48
- data/lib/stella/cli.rb +9 -23
- data/lib/stella/client.rb +10 -9
- data/lib/stella/client/container.rb +11 -1
- data/lib/stella/data.rb +114 -61
- data/lib/stella/data/http.rb +1 -1
- data/lib/stella/data/http/request.rb +7 -7
- data/lib/stella/engine.rb +36 -11
- data/lib/stella/engine/functional.rb +9 -8
- data/lib/stella/engine/load.rb +311 -14
- data/lib/stella/exceptions.rb +7 -2
- data/lib/stella/mixins.rb +4 -1
- data/lib/stella/mixins/numeric.rb +11 -10
- data/lib/stella/mixins/string.rb +12 -0
- data/lib/stella/mixins/time.rb +75 -0
- data/lib/stella/testplan.rb +15 -18
- data/lib/stella/testplan/usecase.rb +16 -5
- data/lib/stella/utils.rb +7 -5
- data/lib/stella/version.rb +1 -1
- data/stella.gemspec +11 -7
- data/tryouts/01_numeric_mixins_tryouts.rb +40 -0
- data/tryouts/12_digest_tryouts.rb +42 -0
- metadata +12 -17
- data/lib/stella/engine/stress.rb +0 -293
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.7.0.
|
4
|
+
version: 0.7.0.017
|
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: 2009-10-
|
12
|
+
date: 2009-10-09 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.4.
|
23
|
+
version: 0.4.3
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: drydock
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.
|
43
|
+
version: 0.7.0
|
44
44
|
version:
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: sysinfo
|
@@ -60,17 +60,7 @@ dependencies:
|
|
60
60
|
requirements:
|
61
61
|
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 0.5.
|
64
|
-
version:
|
65
|
-
- !ruby/object:Gem::Dependency
|
66
|
-
name: httpclient
|
67
|
-
type: :runtime
|
68
|
-
version_requirement:
|
69
|
-
version_requirements: !ruby/object:Gem::Requirement
|
70
|
-
requirements:
|
71
|
-
- - ">="
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version: 2.1.5
|
63
|
+
version: 0.5.8
|
74
64
|
version:
|
75
65
|
- !ruby/object:Gem::Dependency
|
76
66
|
name: nokogiri
|
@@ -100,9 +90,11 @@ files:
|
|
100
90
|
- Rudyfile
|
101
91
|
- bin/stella
|
102
92
|
- examples/cookies/plan.rb
|
93
|
+
- examples/csvdata/plan.rb
|
94
|
+
- examples/csvdata/search_terms.csv
|
103
95
|
- examples/essentials/logo.png
|
104
96
|
- examples/essentials/plan.rb
|
105
|
-
- examples/essentials/search_terms.
|
97
|
+
- examples/essentials/search_terms.txt
|
106
98
|
- examples/exceptions/plan.rb
|
107
99
|
- lib/stella.rb
|
108
100
|
- lib/stella/cli.rb
|
@@ -118,12 +110,13 @@ files:
|
|
118
110
|
- lib/stella/engine.rb
|
119
111
|
- lib/stella/engine/functional.rb
|
120
112
|
- lib/stella/engine/load.rb
|
121
|
-
- lib/stella/engine/stress.rb
|
122
113
|
- lib/stella/exceptions.rb
|
123
114
|
- lib/stella/guidelines.rb
|
124
115
|
- lib/stella/mixins.rb
|
125
116
|
- lib/stella/mixins/numeric.rb
|
117
|
+
- lib/stella/mixins/string.rb
|
126
118
|
- lib/stella/mixins/thread.rb
|
119
|
+
- lib/stella/mixins/time.rb
|
127
120
|
- lib/stella/stats.rb
|
128
121
|
- lib/stella/testplan.rb
|
129
122
|
- lib/stella/testplan/stats.rb
|
@@ -136,6 +129,8 @@ files:
|
|
136
129
|
- support/sample_webapp/app.rb
|
137
130
|
- support/sample_webapp/config.ru
|
138
131
|
- support/useragents.txt
|
132
|
+
- tryouts/01_numeric_mixins_tryouts.rb
|
133
|
+
- tryouts/12_digest_tryouts.rb
|
139
134
|
- vendor/httpclient-2.1.5.2/httpclient.rb
|
140
135
|
- vendor/httpclient-2.1.5.2/httpclient/auth.rb
|
141
136
|
- vendor/httpclient-2.1.5.2/httpclient/cacert.p7s
|
data/lib/stella/engine/stress.rb
DELETED
@@ -1,293 +0,0 @@
|
|
1
|
-
|
2
|
-
module Stella::Engine
|
3
|
-
module Stress
|
4
|
-
extend Stella::Engine::Base
|
5
|
-
extend self
|
6
|
-
|
7
|
-
@timers = [:do_request]
|
8
|
-
@counts = [:response_content_size]
|
9
|
-
|
10
|
-
class << self
|
11
|
-
attr_accessor :timers, :counts
|
12
|
-
end
|
13
|
-
|
14
|
-
def run(plan, opts={})
|
15
|
-
opts = {
|
16
|
-
:hosts => [],
|
17
|
-
:clients => 1,
|
18
|
-
:duration => nil,
|
19
|
-
:repetitions => 1
|
20
|
-
}.merge! opts
|
21
|
-
opts[:clients] = plan.usecases.size if opts[:clients] < plan.usecases.size
|
22
|
-
opts[:clients] = 1000 if opts[:clients] > 1000
|
23
|
-
|
24
|
-
if Stella.loglev > 1
|
25
|
-
Stress.timers += [:connect, :create_socket, :query, :socket_gets_first_byte, :get_body]
|
26
|
-
Stress.counts = [:request_header_size, :request_content_size]
|
27
|
-
Stress.counts += [:response_headers_size, :response_content_size]
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
Stella.ld "OPTIONS: #{opts.inspect}"
|
32
|
-
Stella.li3 "Hosts: " << opts[:hosts].join(', ')
|
33
|
-
|
34
|
-
counts = calculate_usecase_clients plan, opts
|
35
|
-
|
36
|
-
Stella.li $/, "Preparing #{counts[:total]} virtual clients...", $/
|
37
|
-
Stella.lflush
|
38
|
-
packages = build_thread_package plan, opts, counts
|
39
|
-
|
40
|
-
Stella.li "Generating load...", $/
|
41
|
-
Stella.lflush
|
42
|
-
|
43
|
-
begin
|
44
|
-
execute_test_plan packages, opts[:repetitions]
|
45
|
-
rescue Interrupt
|
46
|
-
Stella.li "Stopping test...", $/
|
47
|
-
Stella.abort!
|
48
|
-
ensure
|
49
|
-
Stella.li "Processing statistics...", $/
|
50
|
-
Stella.lflush
|
51
|
-
|
52
|
-
|
53
|
-
wait_for_reporter
|
54
|
-
|
55
|
-
tt = Benelux.thread_timeline
|
56
|
-
test_time = tt.ranges(:execute_test_plan).first.duration
|
57
|
-
|
58
|
-
generate_report plan, test_time
|
59
|
-
|
60
|
-
# No need to add the main thread
|
61
|
-
# stats to the global timeline.
|
62
|
-
# Benelux.reporter.force_update
|
63
|
-
|
64
|
-
Stella.li "Overall time: "
|
65
|
-
Stella.li " prep: %10.2fs" % tt.ranges(:build_thread_package).first.duration
|
66
|
-
Stella.li " test: %10.2fs" % test_time
|
67
|
-
Stella.li " wait: %10.2fs" % tt.ranges(:wait_for_reporter).first.duration
|
68
|
-
Stella.li " post: %10.2fs" % tt.ranges(:generate_report).first.duration
|
69
|
-
Stella.li $/
|
70
|
-
end
|
71
|
-
|
72
|
-
# errors?
|
73
|
-
end
|
74
|
-
|
75
|
-
def wait_for_reporter
|
76
|
-
Benelux.reporter.wait
|
77
|
-
end
|
78
|
-
|
79
|
-
protected
|
80
|
-
class ThreadPackage
|
81
|
-
attr_accessor :index
|
82
|
-
attr_accessor :client
|
83
|
-
attr_accessor :usecase
|
84
|
-
def initialize(i, c, u)
|
85
|
-
@index, @client, @usecase = i, c, u
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def calculate_usecase_clients(plan, opts)
|
90
|
-
counts = { :total => 0 }
|
91
|
-
plan.usecases.each_with_index do |usecase,i|
|
92
|
-
count = case opts[:clients]
|
93
|
-
when 0..9
|
94
|
-
if (opts[:clients] % plan.usecases.size > 0)
|
95
|
-
msg = "Client count does not evenly match usecase count"
|
96
|
-
raise Stella::Testplan::WackyRatio, msg
|
97
|
-
else
|
98
|
-
(opts[:clients] / plan.usecases.size)
|
99
|
-
end
|
100
|
-
else
|
101
|
-
(opts[:clients] * usecase.ratio).to_i
|
102
|
-
end
|
103
|
-
counts[usecase.gibbler_cache] = count
|
104
|
-
counts[:total] += count
|
105
|
-
end
|
106
|
-
counts
|
107
|
-
end
|
108
|
-
|
109
|
-
def build_thread_package(plan, opts, counts)
|
110
|
-
packages, pointer = Array.new(counts[:total]), 0
|
111
|
-
plan.usecases.each do |usecase|
|
112
|
-
count = counts[usecase.gibbler_cache]
|
113
|
-
Stella.ld "THREAD PACKAGE: #{usecase.desc} (#{pointer} + #{count})"
|
114
|
-
# Fill the thread_package with the contents of the block
|
115
|
-
packages.fill(pointer, count) do |index|
|
116
|
-
Stella.li3 "Creating client ##{index+1} "
|
117
|
-
client = Stella::Client.new opts[:hosts].first, index+1
|
118
|
-
client.add_observer(self)
|
119
|
-
client.enable_nowait_mode
|
120
|
-
ThreadPackage.new(index+1, client, usecase)
|
121
|
-
end
|
122
|
-
pointer += count
|
123
|
-
end
|
124
|
-
packages.compact # TODO: Why one nil element sometimes?
|
125
|
-
end
|
126
|
-
|
127
|
-
def execute_test_plan(packages, reps=1)
|
128
|
-
Thread.ify packages, :threads => packages.size do |package|
|
129
|
-
|
130
|
-
# This thread will stay on this one track.
|
131
|
-
Benelux.current_track package.client.gibbler
|
132
|
-
Benelux.add_thread_tags :usecase => package.usecase.gibbler_cache
|
133
|
-
|
134
|
-
(1..reps).to_a.each do |rep|
|
135
|
-
Benelux.add_thread_tags :rep => rep
|
136
|
-
Stella::Engine::Stress.rescue(package.client.gibbler_cache) {
|
137
|
-
break if Stella.abort?
|
138
|
-
print '.' if Stella.loglev == 2
|
139
|
-
stats = package.client.execute package.usecase
|
140
|
-
}
|
141
|
-
Benelux.remove_thread_tags :rep
|
142
|
-
end
|
143
|
-
|
144
|
-
Benelux.remove_thread_tags :usecase
|
145
|
-
|
146
|
-
end
|
147
|
-
Stella.li2 $/, $/
|
148
|
-
end
|
149
|
-
|
150
|
-
def generate_report(plan,test_time)
|
151
|
-
#Benelux.update_all_track_timelines
|
152
|
-
global_timeline = Benelux.timeline
|
153
|
-
|
154
|
-
Stella.li $/, " %-72s ".att(:reverse) % ["#{plan.desc} (#{plan.gibbler_cache.shorter})"]
|
155
|
-
plan.usecases.uniq.each_with_index do |uc,i|
|
156
|
-
|
157
|
-
# TODO: Create Ranges object, like Stats object
|
158
|
-
# global_timeline.ranges(:do_request)[:usecase => '1111']
|
159
|
-
# The following returns globl do_request ranges.
|
160
|
-
requests = 0 #global_timeline.ranges(:do_request).size
|
161
|
-
|
162
|
-
desc = uc.desc || "Usecase ##{i+1} "
|
163
|
-
desc << " (#{uc.gibbler_cache.shorter}) "
|
164
|
-
str = ' ' << " %-66s %s %d%% ".bright.att(:reverse)
|
165
|
-
Stella.li str % [desc, '', uc.ratio_pretty]
|
166
|
-
|
167
|
-
uc.requests.each do |req|
|
168
|
-
filter = [uc.gibbler_cache, req.gibbler_cache]
|
169
|
-
desc = req.desc
|
170
|
-
Stella.li " %-72s ".bright % ["#{req.desc} (#{req.gibbler_cache.shorter})"]
|
171
|
-
Stella.li " %s" % [req.to_s]
|
172
|
-
Stress.timers.each do |sname|
|
173
|
-
stats = global_timeline.stats.group(sname)[filter]
|
174
|
-
str = ' %-30s %.3f <= ' << '%.3fs' << ' >= %.3f; %.3f(SD) %d(N)'
|
175
|
-
Stella.li str % [sname, stats.min, stats.mean, stats.max, stats.sd, stats.n]
|
176
|
-
Stella.lflush
|
177
|
-
end
|
178
|
-
Stella.li $/
|
179
|
-
end
|
180
|
-
|
181
|
-
Stella.li " Sub Total:".bright
|
182
|
-
|
183
|
-
stats = global_timeline.stats.group(:do_request)[uc.gibbler_cache]
|
184
|
-
failed = global_timeline.stats.group(:failed)[uc.gibbler_cache]
|
185
|
-
respgrp = global_timeline.stats.group(:execute_response_handler)[uc.gibbler_cache]
|
186
|
-
resst = respgrp.tag_values(:status)
|
187
|
-
statusi = []
|
188
|
-
resst.each do |status|
|
189
|
-
size = respgrp[:status => status].size
|
190
|
-
statusi << "#{status}: #{size}"
|
191
|
-
end
|
192
|
-
Stella.li ' %-30s %d (%s)' % ['Total requests', stats.n, statusi.join(', ')]
|
193
|
-
Stella.li ' %-29s %d' % [:success, stats.n - failed.n]
|
194
|
-
Stella.li ' %-29s %d' % [:failed, failed.n]
|
195
|
-
|
196
|
-
Stress.timers.each do |sname|
|
197
|
-
stats = global_timeline.stats.group(sname)[uc.gibbler_cache]
|
198
|
-
Stella.li ' %-30s %.3fs %.3f(SD)' % [sname, stats.mean, stats.sd]
|
199
|
-
Stella.lflush
|
200
|
-
end
|
201
|
-
|
202
|
-
Stress.counts.each do |sname|
|
203
|
-
stats = global_timeline.stats.group(sname)[uc.gibbler_cache]
|
204
|
-
Stella.li ' %-30s %-12s (avg:%s)' % [sname, stats.sum.to_bytes, stats.mean.to_bytes]
|
205
|
-
Stella.lflush
|
206
|
-
end
|
207
|
-
Stella.li $/
|
208
|
-
end
|
209
|
-
|
210
|
-
Stella.li ' ' << " %-66s ".att(:reverse) % 'Total:'
|
211
|
-
stats = global_timeline.stats.group(:do_request)
|
212
|
-
failed = global_timeline.stats.group(:failed)
|
213
|
-
respgrp = global_timeline.stats.group(:execute_response_handler)
|
214
|
-
resst = respgrp.tag_values(:status)
|
215
|
-
statusi = []
|
216
|
-
resst.each do |status|
|
217
|
-
size = respgrp[:status => status].size
|
218
|
-
statusi << [status, size]
|
219
|
-
end
|
220
|
-
Stella.li ' %-30s %d' % ['Total requests', stats.n]
|
221
|
-
success = stats.n - failed.n
|
222
|
-
Stella.li ' %-29s %d (req/s: %.2f)' % [:success, success, success/test_time]
|
223
|
-
statusi.each do |pair|
|
224
|
-
Stella.li2 ' %-28s %s: %d' % ['', *pair]
|
225
|
-
end
|
226
|
-
Stella.li ' %-29s %d' % [:failed, failed.n]
|
227
|
-
|
228
|
-
Stress.timers.each do |sname|
|
229
|
-
stats = global_timeline.stats.group(sname)
|
230
|
-
Stella.li ' %-30s %-.3fs %-.3f(SD)' % [sname, stats.mean, stats.sd]
|
231
|
-
Stella.lflush
|
232
|
-
end
|
233
|
-
|
234
|
-
Stress.counts.each do |sname|
|
235
|
-
stats = global_timeline.stats.group(sname)
|
236
|
-
Stella.li ' %-30s %-12s (avg:%s)' % [sname, stats.sum.to_bytes, stats.mean.to_bytes]
|
237
|
-
Stella.lflush
|
238
|
-
end
|
239
|
-
Stella.li $/
|
240
|
-
end
|
241
|
-
|
242
|
-
|
243
|
-
def update_prepare_request(client_id, usecase, req, counter)
|
244
|
-
|
245
|
-
end
|
246
|
-
|
247
|
-
def update_receive_response(client_id, usecase, uri, req, counter, container)
|
248
|
-
desc = "#{usecase.desc} > #{req.desc}"
|
249
|
-
Stella.li3 ' Client-%s %3d %-6s %-45s' % [client_id.shorter, container.status, req.http_method, uri]
|
250
|
-
end
|
251
|
-
|
252
|
-
def update_execute_response_handler(client_id, req, container)
|
253
|
-
end
|
254
|
-
|
255
|
-
def update_error_execute_response_handler(client_id, ex, req, container)
|
256
|
-
desc = "#{container.usecase.desc} > #{req.desc}"
|
257
|
-
Stella.li $/ if Stella.loglev == 1
|
258
|
-
Stella.le ' Client-%s %-45s %s' % [client_id.shorter, desc, ex.message]
|
259
|
-
Stella.li3 ex.backtrace
|
260
|
-
end
|
261
|
-
|
262
|
-
def update_request_error(client_id, usecase, uri, req, params, ex)
|
263
|
-
desc = "#{usecase.desc} > #{req.desc}"
|
264
|
-
Stella.li $/ if Stella.loglev == 1
|
265
|
-
Stella.le ' Client-%s %-45s %s' % [client_id.shorter, desc, ex.message]
|
266
|
-
Stella.li3 ex.backtrace
|
267
|
-
end
|
268
|
-
|
269
|
-
def update_quit_usecase client_id, msg
|
270
|
-
Stella.li3 " Client-%s QUIT %s" % [client_id.shorter, msg]
|
271
|
-
end
|
272
|
-
|
273
|
-
|
274
|
-
def update_repeat_request client_id, counter, total
|
275
|
-
Stella.li3 " Client-%s REPEAT %d of %d" % [client_id.shorter, counter, total]
|
276
|
-
end
|
277
|
-
|
278
|
-
def self.rescue(client_id, &blk)
|
279
|
-
blk.call
|
280
|
-
rescue => ex
|
281
|
-
Stella.le ' Error in Client-%s: %s' % [client_id.shorter, ex.message]
|
282
|
-
Stella.li3 ex.backtrace
|
283
|
-
end
|
284
|
-
|
285
|
-
|
286
|
-
Benelux.add_timer Stella::Engine::Stress, :build_thread_package
|
287
|
-
Benelux.add_timer Stella::Engine::Stress, :execute_test_plan
|
288
|
-
Benelux.add_timer Stella::Engine::Stress, :generate_report
|
289
|
-
Benelux.add_timer Stella::Engine::Stress, :wait_for_reporter
|
290
|
-
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|