stella 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/README.textile +14 -10
  2. data/Rakefile +22 -36
  3. data/lib/daemonize.rb +56 -0
  4. data/lib/stella/adapter/ab.rb +49 -39
  5. data/lib/stella/adapter/base.rb +17 -8
  6. data/lib/stella/adapter/httperf.rb +24 -18
  7. data/lib/stella/adapter/pcap_watcher.rb +1 -1
  8. data/lib/stella/adapter/siege.rb +15 -12
  9. data/lib/stella/cli/localtest.rb +2 -3
  10. data/lib/stella/cli/sysinfo.rb +0 -1
  11. data/lib/stella/cli.rb +10 -55
  12. data/lib/stella/command/base.rb +0 -62
  13. data/lib/stella/command/localtest.rb +35 -36
  14. data/lib/stella/data/domain.rb +18 -11
  15. data/lib/stella/data/http.rb +23 -16
  16. data/lib/stella/logger.rb +29 -19
  17. data/lib/stella/response.rb +5 -2
  18. data/lib/stella/storable.rb +138 -52
  19. data/lib/stella/support.rb +107 -8
  20. data/lib/stella/sysinfo.rb +26 -16
  21. data/lib/stella/test/definition.rb +1 -1
  22. data/lib/stella/test/run/summary.rb +23 -13
  23. data/lib/stella/test/stats.rb +114 -0
  24. data/lib/stella/text/resource.rb +1 -1
  25. data/lib/stella.rb +29 -4
  26. data/lib/utils/mathutil.rb +0 -76
  27. data/lib/utils/stats.rb +88 -0
  28. data/lib/win32/Console/ANSI.rb +305 -305
  29. data/lib/win32/Console.rb +970 -970
  30. data/support/ruby-pcap-takuma-patch.txt +13 -13
  31. data/support/text/en.yaml +11 -8
  32. data/support/text/nl.yaml +7 -1
  33. data/{spec/show-agents_spec.rb → tests/01-util_test.rb} +0 -0
  34. data/tests/02-stella-util_test.rb +42 -0
  35. data/tests/10-stella_test.rb +104 -0
  36. data/tests/11-stella-storable_test.rb +68 -0
  37. data/tests/60-stella-command_test.rb +248 -0
  38. data/tests/80-stella-cli_test.rb +45 -0
  39. data/tests/spec-helper.rb +31 -0
  40. data/vendor/{frylock/README.textile → drydock/LICENSE.txt} +2 -52
  41. data/vendor/drydock/README.textile +57 -0
  42. data/vendor/{frylock → drydock}/bin/example +14 -14
  43. data/vendor/{frylock/frylock.gemspec → drydock/drydock.gemspec} +1 -1
  44. data/vendor/{frylock/lib/frylock → drydock/lib/drydock}/exceptions.rb +1 -1
  45. data/vendor/{frylock/lib/frylock.rb → drydock/lib/drydock.rb} +8 -8
  46. data/vendor/{frylock → drydock}/test/command_test.rb +0 -0
  47. metadata +34 -61
  48. data/lib/stella/test/base.rb +0 -38
  49. data/lib/stella/test/summary.rb +0 -82
  50. data/vendor/hitimes-0.4.0/HISTORY +0 -28
  51. data/vendor/hitimes-0.4.0/LICENSE.txt +0 -19
  52. data/vendor/hitimes-0.4.0/README +0 -80
  53. data/vendor/hitimes-0.4.0/Rakefile +0 -63
  54. data/vendor/hitimes-0.4.0/examples/benchmarks.rb +0 -86
  55. data/vendor/hitimes-0.4.0/examples/stats.rb +0 -29
  56. data/vendor/hitimes-0.4.0/ext/extconf.rb +0 -15
  57. data/vendor/hitimes-0.4.0/ext/hitimes_ext.c +0 -21
  58. data/vendor/hitimes-0.4.0/ext/hitimes_instant_clock_gettime.c +0 -20
  59. data/vendor/hitimes-0.4.0/ext/hitimes_instant_osx.c +0 -16
  60. data/vendor/hitimes-0.4.0/ext/hitimes_instant_windows.c +0 -27
  61. data/vendor/hitimes-0.4.0/ext/hitimes_interval.c +0 -340
  62. data/vendor/hitimes-0.4.0/ext/hitimes_interval.h +0 -73
  63. data/vendor/hitimes-0.4.0/ext/hitimes_stats.c +0 -242
  64. data/vendor/hitimes-0.4.0/ext/hitimes_stats.h +0 -30
  65. data/vendor/hitimes-0.4.0/ext/rbconfig-mingw.rb +0 -178
  66. data/vendor/hitimes-0.4.0/ext/rbconfig.rb +0 -178
  67. data/vendor/hitimes-0.4.0/gemspec.rb +0 -54
  68. data/vendor/hitimes-0.4.0/lib/hitimes/mutexed_stats.rb +0 -23
  69. data/vendor/hitimes-0.4.0/lib/hitimes/paths.rb +0 -54
  70. data/vendor/hitimes-0.4.0/lib/hitimes/stats.rb +0 -29
  71. data/vendor/hitimes-0.4.0/lib/hitimes/timer.rb +0 -223
  72. data/vendor/hitimes-0.4.0/lib/hitimes/version.rb +0 -42
  73. data/vendor/hitimes-0.4.0/lib/hitimes.rb +0 -24
  74. data/vendor/hitimes-0.4.0/spec/interval_spec.rb +0 -115
  75. data/vendor/hitimes-0.4.0/spec/mutex_stats_spec.rb +0 -34
  76. data/vendor/hitimes-0.4.0/spec/paths_spec.rb +0 -14
  77. data/vendor/hitimes-0.4.0/spec/spec_helper.rb +0 -6
  78. data/vendor/hitimes-0.4.0/spec/stats_spec.rb +0 -72
  79. data/vendor/hitimes-0.4.0/spec/timer_spec.rb +0 -105
  80. data/vendor/hitimes-0.4.0/spec/version_spec.rb +0 -27
  81. data/vendor/hitimes-0.4.0/tasks/announce.rake +0 -39
  82. data/vendor/hitimes-0.4.0/tasks/config.rb +0 -107
  83. data/vendor/hitimes-0.4.0/tasks/distribution.rake +0 -53
  84. data/vendor/hitimes-0.4.0/tasks/documentation.rake +0 -33
  85. data/vendor/hitimes-0.4.0/tasks/extension.rake +0 -64
  86. data/vendor/hitimes-0.4.0/tasks/rspec.rake +0 -31
  87. data/vendor/hitimes-0.4.0/tasks/rubyforge.rake +0 -52
  88. data/vendor/hitimes-0.4.0/tasks/utils.rb +0 -80
data/README.textile CHANGED
@@ -1,9 +1,13 @@
1
1
  h1. Stella - Your Performance Testing Friend
2
2
 
3
- Release: 0.5.4-alpha (2009-01-07)
3
+ Release: 0.5.5 (2009-01-14)
4
4
 
5
5
  This is a BETA release. Proceed in double verify mode!
6
6
 
7
+ h2. Overview
8
+
9
+ Stella is a command-line tool for running, reporting, and analyzing performance tests.
10
+
7
11
 
8
12
  h2. Prerequisites
9
13
 
@@ -17,9 +21,10 @@ h2. Prerequisites
17
21
  ** Ruby-Pcap (optional, for packet sniffing)
18
22
 
19
23
  * One of:
20
- ** "Apache Bench":http://httpd.apache.org/docs/2.0/programs/ab.html
24
+ ** "Apache Bench":http://httpd.apache.org/docs/2.2/programs/ab.html
21
25
  ** "Siege":http://www.joedog.org/index/siege-home
22
26
  ** "Httperf":http://www.hpl.hp.com/research/linux/httperf/
27
+ *** _Note: Argument handling for Httperf is incomplete_
23
28
 
24
29
 
25
30
  h2. Installation
@@ -59,14 +64,14 @@ On Ruby, 1.8.6, Ruby-Pcap produces the following warnings at runtime: "pcap.bund
59
64
 
60
65
  h2. Usage Examples
61
66
 
62
- Run Apache Bench with a warmup and rampup from 100 to 300 virtual users in increments of 25
63
- $ stella --warmup=0.5 --rampup=25,300 ab -c 100 -n 10000 http://stellaaahhhh.com/search?term=trooper
67
+ Run Apache Bench with a warmup and rampup from 10 to 20 virtual users in increments of 5
68
+ $ stella --warmup=0.5 --rampup=5,20 ab -c 10 -n 50 http://stellaaahhhh.com/search?term=trooper
64
69
 
65
70
  Run Siege, repeat the test 5 times. Automatically creates a summary averages and standard deviations.
66
- $ stella --agent=ff-3-osx --testruns=5 siege -c 100 -r 100 -b http://stellaaahhhh.com/search?term=flock+of+seagulls
71
+ $ stella --agent=ff-3-osx --testruns=5 siege -c 10 -r 5 -b http://stellaaahhhh.com/search?term=flock+of+seagulls
67
72
 
68
73
  Run Httperf like you normally would (but all the test data will be collected for you)
69
- $ stella httperf --hog --client=0/1 --server=127.0.0.1 --port=5600 --uri=/ --rate=50 --num-conns=3000 --timeout=5
74
+ $ stella httperf --hog --client=0/1 --server=127.0.0.1 --port=5600 --uri=/ --rate=50 --num-conns=100 --timeout=5
70
75
 
71
76
  Monitor DNS traffic using Pcap
72
77
  $ stella watch -C dns
@@ -81,7 +86,7 @@ h2. Usage Examples
81
86
  h3. Sample Output
82
87
 
83
88
  <pre><code>
84
- $ stella -f csv -x 5 -w 0.75 -r 25,125 -m "httpd 2.2.9-prefork" siege -c 75 -r 10 -b http://stella:5600/
89
+ $ stella -f csv -x 5 -w 0.75 -r 25,125 -m "httpd 2.2.9-prefork" siege -c 75 -r 10 -b http://testapp:5600/
85
90
  Writing test data to: stella/testruns/2008-12-23/test-054
86
91
 
87
92
  Warmup: 3750@37/1 100% 264.29/s 0.140s 0.024MB/s 0.340MB 14.000s .
@@ -137,10 +142,9 @@ h2. Known Issues
137
142
 
138
143
  * The output for the REQ@VU/s columns is a work in progress. It's not aligned across tools and it will likely change in the next release.
139
144
  * The summary data has not been audited. Don't trust and double verify!
140
- * httperf is functional but needs a lot more testing (most dev was done with ab and siege).
145
+ * httperf is functional but not all parameters are supported.
141
146
  * The Ruby API has not been finalized. It's functional but there's no example because it is subject to change.
142
- * There are no specs.
143
- * There is an issue with parsing ipv6 ip addresses with Ruby-Pcap or Net-DNS. This affects only dns sniffing with pcap. Reproduce by running "stella watch -P dns" and requesting "apple.com"
147
+ * There is an issue with parsing ipv6 ip addresses with Ruby-Pcap or Net-DNS. This affects only dns sniffing with pcap. Reproduce by running "stella watch -C dns" and requesting "apple.com"
144
148
 
145
149
 
146
150
  h2. Report an issue
data/Rakefile CHANGED
@@ -1,42 +1,29 @@
1
- require 'rake'
2
- require 'spec/rake/spectask'
3
1
 
4
- desc "Run all specs"
5
- Spec::Rake::SpecTask.new('spec') do |t|
6
- t.spec_files = FileList['spec/*_spec.rb']
7
- end
8
-
9
- desc "Print specdocs"
10
- Spec::Rake::SpecTask.new(:doc) do |t|
11
- t.spec_opts = ["--format", "specdoc", "--dry-run"]
12
- t.spec_files = FileList['spec/*_spec.rb']
13
- end
14
-
15
- desc "Run all examples with RCov"
16
- Spec::Rake::SpecTask.new('rcov') do |t|
17
- t.spec_files = FileList['spec/*_spec.rb']
18
- t.rcov = true
19
- t.rcov_opts = ['--exclude', 'examples']
20
- end
21
-
22
- task :default => :spec
23
-
24
- ######################################################
25
-
26
- require 'rake'
27
- require 'rake/testtask'
2
+ require 'rubygems'
28
3
  require 'rake/clean'
29
4
  require 'rake/gempackagetask'
30
5
  require 'rake/rdoctask'
31
6
  require 'fileutils'
32
7
  include FileUtils
8
+
9
+ task :default => :test
10
+
11
+ # SPECS ===============================================================
12
+
13
+ desc 'Run specs with unit test style output'
14
+ task :test do |t|
15
+ # sh "specrb -s tests/*_test.rb"
16
+ sh "specrb -s tests/*_test.rb"
17
+ end
18
+
19
+ # PACKAGE =============================================================
20
+
33
21
 
34
22
  STELLA_HOME = File.expand_path(File.join(File.dirname(__FILE__)))
35
23
  $: << File.join(STELLA_HOME, 'lib')
36
24
 
37
25
  require 'stella'
38
26
  version = Stella::VERSION.to_s
39
-
40
27
  name = "stella"
41
28
 
42
29
  spec = Gem::Specification.new do |s|
@@ -52,15 +39,14 @@ spec = Gem::Specification.new do |s|
52
39
  s.extra_rdoc_files = ['README.textile']
53
40
 
54
41
  # NOTE: how to make optional dependencies?
55
- #s.add_dependency 'mongrel'
42
+ s.add_dependency 'mongrel'
56
43
  s.add_dependency 'rspec'
57
44
  s.add_dependency 'net-dns'
58
- #s.add_dependency 'session'
59
45
 
60
46
  s.platform = Gem::Platform::RUBY
61
47
  s.has_rdoc = true
62
48
 
63
- s.files = %w(Rakefile) + Dir.glob("{bin,doc,lib,spec,support,vendor}/**/**/*")
49
+ s.files = %w(Rakefile) + Dir.glob("{bin,doc,lib,tests,support,vendor}/**/**/*")
64
50
 
65
51
  s.require_path = "lib"
66
52
  s.bindir = "bin"
@@ -71,6 +57,7 @@ Rake::GemPackageTask.new(spec) do |p|
71
57
  end
72
58
 
73
59
 
60
+
74
61
  task :install => [ :rdoc, :package ] do
75
62
  sh %{sudo gem install pkg/#{name}-#{version}.gem}
76
63
  end
@@ -79,11 +66,7 @@ task :uninstall => [ :clean ] do
79
66
  sh %{sudo gem uninstall #{name}}
80
67
  end
81
68
 
82
- Rake::TestTask.new do |t|
83
- t.libs << "spec"
84
- t.test_files = FileList['spec/*_spec.rb']
85
- t.verbose = true
86
- end
69
+
87
70
 
88
71
  Rake::RDocTask.new do |t|
89
72
  t.rdoc_dir = 'doc'
@@ -91,7 +74,8 @@ Rake::RDocTask.new do |t|
91
74
  t.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
92
75
  t.options << '--charset' << 'utf-8'
93
76
  t.rdoc_files.include('LICENSE.txt')
94
- t.rdoc_files.include('README.txt')
77
+ t.rdoc_files.include('README.textile')
78
+ t.rdoc_files.include('CHANGES.txt')
95
79
  t.rdoc_files.include('lib/utils/*.rb')
96
80
  t.rdoc_files.include('lib/stella.rb')
97
81
  t.rdoc_files.include('lib/stella/*.rb')
@@ -100,3 +84,5 @@ end
100
84
 
101
85
  CLEAN.include [ 'pkg', '*.gem', '.config', 'doc' ]
102
86
 
87
+
88
+
data/lib/daemonize.rb ADDED
@@ -0,0 +1,56 @@
1
+ module Daemonize
2
+ VERSION = "0.1.2"
3
+
4
+ # Try to fork if at all possible retrying every 5 sec if the
5
+ # maximum process limit for the system has been reached
6
+ def safefork
7
+ tryagain = true
8
+
9
+ while tryagain
10
+ tryagain = false
11
+ begin
12
+ if pid = fork
13
+ return pid
14
+ end
15
+ rescue Errno::EWOULDBLOCK
16
+ sleep 5
17
+ tryagain = true
18
+ end
19
+ end
20
+ end
21
+
22
+ # This method causes the current running process to become a daemon
23
+ # If closefd is true, all existing file descriptors are closed
24
+ def daemonize(oldmode=0, closefd=false)
25
+ srand # Split rand streams between spawning and daemonized process
26
+ safefork and exit # Fork and exit from the parent
27
+
28
+ # Detach from the controlling terminal
29
+ unless sess_id = Process.setsid
30
+ raise 'Cannot detach from controlled terminal'
31
+ end
32
+
33
+ # Prevent the possibility of acquiring a controlling terminal
34
+ if oldmode.zero?
35
+ trap 'SIGHUP', 'IGNORE'
36
+ exit if pid = safefork
37
+ end
38
+
39
+ Dir.chdir "/" # Release old working directory
40
+ File.umask 0000 # Insure sensible umask
41
+
42
+ if closefd
43
+ # Make sure all file descriptors are closed
44
+ ObjectSpace.each_object(IO) do |io|
45
+ unless [STDIN, STDOUT, STDERR].include?(io)
46
+ io.close rescue nil
47
+ end
48
+ end
49
+ end
50
+
51
+ STDIN.reopen "/dev/null" # Free file descriptors and
52
+ STDOUT.reopen "/dev/null", "a" # point them somewhere sensible
53
+ STDERR.reopen STDOUT # STDOUT/STDERR should go to a logfile
54
+ return oldmode ? sess_id : 0 # Return value is mostly irrelevant
55
+ end
56
+ end
@@ -1,5 +1,5 @@
1
1
 
2
-
2
+ require 'fileutils'
3
3
 
4
4
  module Stella
5
5
  module Adapter
@@ -45,12 +45,14 @@ module Stella
45
45
  attr_accessor :C, :H, :A, :P, :X, :V, :k, :d, :S, :e, :g, :r, :h, :Z, :f
46
46
 
47
47
  def initialize(options={}, arguments=[])
48
- super(options, arguments)
49
48
  @private_variables = ['private_variables', 'name', 'arguments', 'load_factor', 'working_directory']
50
49
  @c = 1
51
50
  @n = 1
52
51
  @name = 'ab'
53
52
  @load_factor = 1
53
+
54
+ super(options, arguments)
55
+
54
56
  end
55
57
 
56
58
  def error
@@ -65,14 +67,17 @@ module Stella
65
67
  vsn
66
68
  end
67
69
 
70
+ def percentiles_file
71
+ @working_directory + "/ab-percentiles.log"
72
+ end
73
+
74
+ def requests_file
75
+ @working_directory + "/ab-requests.log"
76
+ end
77
+
68
78
  def before
69
-
70
- @e = @working_directory + "/ab-percentiles.log"
71
- @e = File.expand_path(@e)
72
-
73
- @g = @working_directory + "/ab-requests.log"
74
- @g = File.expand_path(@g)
75
-
79
+ @e = percentiles_file if @e.nil?
80
+ @g = requests_file if @g.nil?
76
81
  end
77
82
 
78
83
  def command
@@ -83,12 +88,12 @@ module Stella
83
88
  instance_variables.each do |name|
84
89
  canon = name.to_s.tr('@', '') # instance_variables returns '@name'
85
90
  next if @private_variables.member?(canon)
86
-
91
+
87
92
  # It's important that we take the value from the getter method
88
93
  # because it applies the load factor.
89
94
  value = self.send(canon)
90
95
  if (value.is_a? Array)
91
- value.each { |el| command << "-#{canon} #{EscapeUtil.shell_single_word(el.to_s)} " }
96
+ value.each { |el| command << "-#{canon} #{EscapeUtil.shell_single_word(value.to_s)} " }
92
97
  else
93
98
  command << "-#{canon} #{EscapeUtil.shell_single_word(value.to_s)} "
94
99
  end
@@ -96,6 +101,7 @@ module Stella
96
101
  end
97
102
 
98
103
  command << (@arguments.map { |uri| "#{uri}" }).join(' ') unless @arguments.empty?
104
+
99
105
  command
100
106
  end
101
107
  # loadtest
@@ -111,32 +117,34 @@ module Stella
111
117
  end
112
118
 
113
119
 
114
- def process_options(arguments)
115
- options = OpenStruct.new
120
+ def process_arguments(arguments)
116
121
  opts = OptionParser.new
117
122
 
123
+ # TODO: there's no need to use an OpenStruct here. It's confusing b/c we can
124
+ # use the instance var methods here instead of in Base::options=.
125
+
118
126
  # TODO: Print a note for w that we don't parse the HTML results
119
127
  %w{v w i V k d S r h}.each do |n|
120
- opts.on("-#{n}") do |v| options.send("#{n}=", true) end
128
+ opts.on("-#{n}") do |v| instance_variable_set("@#{n}", true) end
121
129
  end
122
130
 
123
131
  %w{e g p T x y z P Z f A}.each do |n|
124
- opts.on("-#{n} S", String) do |v| options.send("#{n}=", v) end
132
+ opts.on("-#{n} S", String) do |v| instance_variable_set("@#{n}", v) end
125
133
  end
126
134
 
127
135
  %w{c n t b}.each do |n|
128
- opts.on("-#{n} S", Integer) do |v| options.send("#{n}=", v) end
136
+ opts.on("-#{n} S", Integer) do |v| instance_variable_set("@#{n}", v) end
129
137
  end
130
138
 
131
- opts.on('-H S', String) do |v| options.H ||= []; options.H << v; end
132
- opts.on('-C S', String) do |v| options.C ||= []; options.C << v; end
139
+ opts.on('-H S', String) do |v| @H ||= []; @H << v; end
140
+ opts.on('-C S', String) do |v| @C ||= []; @C << v; end
133
141
 
134
142
  opts.on('-b') do |v|
135
- Stella::LOGGER.warn("-b is not an ab option. I'll pretend it's not there.")
143
+ Stella.warn("-b is not an ab option. I'll pretend it's not there.")
136
144
  end
137
145
 
138
146
  opts.on('-r N',Integer) do |v|
139
- Stella::LOGGER.error("-r is not an ab parameter. You probably want -n.")
147
+ Stella.error("-r is not an ab parameter. You probably want -n.")
140
148
  exit 1
141
149
  end
142
150
 
@@ -145,10 +153,10 @@ module Stella
145
153
  opts.parse!(arguments)
146
154
 
147
155
  if arguments.empty?
148
- Stella::LOGGER.error("You need to provide a URI")
156
+ Stella.error("You need to provide a URI")
149
157
  exit 1
150
158
  elsif arguments.size > 1
151
- Stella::LOGGER.warn("ab can handle only one URI. The others will be ignored.")
159
+ Stella.warn("ab can handle only one URI. The others will be ignored.")
152
160
  arguments = arguments.first
153
161
  else
154
162
  # Let's make sure the URI has a path (at least a trailing slash). Otherwise
@@ -156,17 +164,17 @@ module Stella
156
164
  begin
157
165
  uri = URI.parse(arguments.first)
158
166
  if !uri || uri.path.empty?
159
- Stella::LOGGER.error("ab requires a trailing slash for #{uri.to_s}")
167
+ Stella.error("ab requires a trailing slash for #{uri.to_s}")
160
168
  exit 1
161
169
  end
162
170
  rescue => ex
163
- Stella::LOGGER.error("Bad URI: #{arguments.first}")
171
+ Stella.error("Bad URI: #{arguments.first}")
164
172
  exit 1
165
173
  end
166
174
  end
167
175
 
176
+ self.arguments = arguments
168
177
 
169
- options
170
178
  rescue OptionParser::InvalidOption => ex
171
179
  # We want to replace this text so we grab just the name of the argument
172
180
  badarg = ex.message.gsub('invalid option: ', '')
@@ -176,17 +184,19 @@ module Stella
176
184
  def after
177
185
  # We want to maintain copies of all test output, even when the user has
178
186
  # supplied other path names so we'll copy the files from the testrun directory
179
- # to the location specified by the user
180
- [[@options.e, 'csv'], [@options.g, 'tsv']].each do |tuple|
181
- if File.expand_path(File.dirname(tuple[0])) != File.expand_path(@runpath)
187
+ # to the location specified by the user.
188
+ # NOTE: For tests with more than one test run, the specified files will be
189
+ # overwritten after each run. Should we force append the run number?
190
+ [[@e, 'percentiles'], [@g, 'requests']].each do |tuple|
191
+ if File.expand_path(File.dirname(tuple[0])) != File.expand_path(@working_directory)
182
192
  from = tuple[0]
183
- to = @runpath + "/ab-#{tuple[1]}.log"
193
+ to = @working_directory + "/ab-#{tuple[1]}.log"
184
194
  next unless File.exists?(from)
185
- File.copy(from, to)
195
+ FileUtils.cp(from, to)
186
196
  end
187
197
  end
188
198
 
189
- save_stats
199
+
190
200
  end
191
201
 
192
202
 
@@ -257,14 +267,14 @@ module Stella
257
267
 
258
268
 
259
269
  # Apache bench writes the summary to STDOUT
260
- def stats_file
270
+ def summary_file
261
271
  File.new(stdout_path) if File.exists?(stdout_path)
262
272
  end
263
273
 
264
- def stats
265
- return unless stats_file
274
+ def summary
275
+ return unless summary_file
266
276
  raw = {}
267
- stats_file.each_line { |l|
277
+ summary_file.each_line { |l|
268
278
  l.chomp!
269
279
  nvpair = l.split(':')
270
280
  next unless nvpair && nvpair.size == 2
@@ -292,8 +302,8 @@ module Stella
292
302
  # Transfer rate: 84.90 [Kbytes/sec] received
293
303
 
294
304
  stats = Stella::Test::Run::Summary.new
295
-
296
- unless raw.empty? || !raw.has_key?(:time_taken_for_tests)
305
+
306
+ if !raw.empty? && raw.has_key?(:time_taken_for_tests)
297
307
 
298
308
  stats.elapsed_time = raw[:time_taken_for_tests]
299
309
 
@@ -312,10 +322,10 @@ module Stella
312
322
  stats.failed = raw[:failed_requests].to_i
313
323
 
314
324
  stats.transactions = stats.successful + stats.failed
315
-
325
+
316
326
  #stats.raw = raw if @global_options.debug
317
327
  end
318
-
328
+
319
329
  stats
320
330
  end
321
331
 
@@ -10,12 +10,16 @@ module Stella::Adapter
10
10
  class Base
11
11
 
12
12
 
13
- attr_accessor :working_directory, :stats
13
+ attr_accessor :working_directory
14
14
  attr_reader :load_factor, :arguments
15
15
 
16
16
  def initialize(options={}, arguments=[])
17
- self.arguments = arguments
18
- self.options = options
17
+ if options.is_a? Array
18
+ self.process_arguments(options)
19
+ else
20
+ self.options = options
21
+ self.arguments = arguments
22
+ end
19
23
  end
20
24
 
21
25
  def load_factor=(load_factor)
@@ -33,22 +37,23 @@ module Stella::Adapter
33
37
  File.join(@working_directory, "SUMMARY.#{ext}")
34
38
  end
35
39
 
36
- # process_options
40
+ # process_arguments
37
41
  #
38
42
  # This method must be overridden by the implementing class. This is intended
39
43
  # for processing the command-specific command-line arguments
40
- # TODO: Rename to process_arguments
41
- def process_options
44
+ def process_arguments
42
45
  raise Stella::TEXT.msg(:error_class_must_override, 'process_options')
43
46
  end
44
47
 
45
48
  # options=
46
49
  #
47
- # Takes a hash or OpenStruct and applies the values to the instance variables.
50
+ # Takes a hash, OpenStruct and applies the values to the instance variables.
48
51
  # The keys should conincide with with the command line argument names.
52
+ # by process_options first and
49
53
  # i.e. The key for --help should be :help
50
54
  def options=(options={})
51
55
  options = options.marshal_dump if options.is_a? OpenStruct
56
+
52
57
  unless options.nil? || options.empty?
53
58
  options.each_pair do |name,value|
54
59
  next if @private_variables.member?(name)
@@ -71,7 +76,7 @@ module Stella::Adapter
71
76
  end
72
77
 
73
78
  def rate
74
- 1
79
+ @rate || 0
75
80
  end
76
81
  def vuser_rate
77
82
  "#{vusers}/#{rate}"
@@ -81,6 +86,10 @@ module Stella::Adapter
81
86
  raise Stella::TEXT.msg(:error_class_must_override, 'command')
82
87
  end
83
88
 
89
+ def summary
90
+ raise Stella::TEXT.msg(:error_class_must_override, 'summary')
91
+ end
92
+
84
93
  def add_header
85
94
  raise Stella::TEXT.msg(:error_class_must_override, 'add_header')
86
95
  end
@@ -29,11 +29,12 @@ module Stella
29
29
  attr_writer :version, :add_header, :wlog, :wsess, :wsesslog, :wset
30
30
 
31
31
  def initialize(options={}, arguments=[])
32
- super(options, arguments)
33
- @name = 'httperf'
34
32
 
33
+ @name = 'httperf'
35
34
  @private_variables = ['private_variables', 'name', 'arguments', 'load_factor', 'working_directory']
36
35
  @load_factor = 1
36
+
37
+ super(options, arguments)
37
38
  end
38
39
 
39
40
 
@@ -75,13 +76,10 @@ module Stella
75
76
  def after
76
77
 
77
78
 
78
- save_stats
79
79
  end
80
80
 
81
- #httperf --hog --server=queen --uri=/0k.html --num-conns=10000 --rate=0 --timeout=30 --think-timeout=0
82
- def process_options(arguments)
81
+ def process_arguments(arguments)
83
82
 
84
- options = OpenStruct.new
85
83
  opts = OptionParser.new
86
84
  opts.on('--hog') do @hog = true end
87
85
  opts.on('--server=S', String) do |v| @server = v end
@@ -126,17 +124,21 @@ module Stella
126
124
 
127
125
 
128
126
  opts.on('--wlog=S', String) do |v| @wlog = Stella::Util::expand_str(v) end
129
- opts.on('--wsess=S', String) do |v| @wsess = Stella::Util::expand_str(v) end
127
+ opts.on('--wsess=S', String) do |v| @wsess = Stella::Util::expand_str(v, Integer) end
130
128
  opts.on('--wsesslog=S', String) do |v| @wsesslog = Stella::Util::expand_str(v) end
131
129
  opts.on('--wset=S', String) do |v| @wset = Stella::Util::expand_str(v) end
130
+
131
+ if @wsess
132
132
 
133
+ end
134
+
133
135
  # parse! removes the options it finds.
134
136
  # It also fails when it finds unknown switches (i.e. -X)
135
137
  # Which should leave only the remaining arguments (URIs in this case)
136
138
  opts.parse!(arguments)
137
-
138
139
 
139
- options
140
+ self.arguments = arguments
141
+
140
142
  rescue OptionParser::InvalidOption => ex
141
143
  # We want to replace this text so we grab just the name of the argument
142
144
  badarg = ex.message.gsub('invalid option: ', '')
@@ -181,13 +183,17 @@ module Stella
181
183
  end
182
184
  end
183
185
  def vusers
184
- @rate
186
+ @wsess[1]
185
187
  end
188
+ def vuser_rate
189
+ "#{vusers}/#{rate}"
190
+ end
191
+
186
192
  def vusers=(v)
187
193
  0
188
194
  end
189
195
  def requests
190
- @num_conns # TODO: also check wsess and wlog params
196
+ @num_conns || (@wsess[0] * @wsess[1])
191
197
  end
192
198
  def requests=(v)
193
199
  0
@@ -224,7 +230,7 @@ module Stella
224
230
 
225
231
 
226
232
  # Siege writes the summary to STDERR
227
- def stats_file
233
+ def summary_file
228
234
  File.new(stdout_path) if File.exists?(stdout_path)
229
235
  end
230
236
 
@@ -265,10 +271,10 @@ module Stella
265
271
  # Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
266
272
  # Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
267
273
 
268
- def stats
269
- return unless stats_file
274
+ def summary
275
+ return unless summary_file
270
276
 
271
- raw = stats_file.readlines.join
277
+ raw = summary_file.readlines.join
272
278
  stats = Stella::Test::Run::Summary.new
273
279
 
274
280
  raw.scan(/Request rate: (\d+?\.\d+?) req.s .(\d+?\.\d+?) ms.req./) do |rate,time|
@@ -283,12 +289,12 @@ module Stella
283
289
  stats.transactions = conn.to_i
284
290
  end
285
291
 
286
- raw.scan(/Reply size [B]: header (\d+\.\d+?) content (\d+\.\d+?) footer (\d+\.\d+?) .total (\d+\.\d+?)./) do |h,c,f,t|
287
- stats.data_transferred = ((t.to_f || 0 ) / 1_048_576).to_f # TODO: convert from bytes to MB
292
+ raw.scan(/header (\d+\.\d+?)\s+.+?\s+.total (\d+\.\d+?)./) do |h,t|
293
+ stats.data_transferred = ((t.to_f || 0 ) / 1_048_576).to_f
294
+ stats.headers_transferred = ((h.to_f || 0 ) / 1_048_576).to_f
288
295
  end
289
296
  stats.vusers = self.vusers
290
297
 
291
-
292
298
  stats
293
299
  end
294
300
 
@@ -61,7 +61,7 @@ module Stella
61
61
  @sport = options[:port] || @dport
62
62
 
63
63
  @device = options[:device] || guess_device
64
- @snaplen = options[:snaplen] || 1500 # 10KB
64
+ @snaplen = options[:snaplen] || 10000 # 10KB
65
65
  @maxpacks = options[:maxpacks] || 100_000
66
66
 
67
67
  Stella::LOGGER.info("Watching interface #{@device} for #{@service} activity on #{@protocol} port #{@dport}")