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.
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.015
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-06 00:00:00 -04:00
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.2
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.6.3
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.7
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.csv
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
@@ -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
-