stella 0.5.4 → 0.5.5

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.
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
@@ -0,0 +1,114 @@
1
+
2
+
3
+ module Stella::Test
4
+
5
+ # Stella::Test::Stats
6
+ class Stats < Stella::Storable
7
+
8
+ field :elapsed_time_avg => Float
9
+ field :transaction_rate_avg => Float
10
+ field :vusers_avg => Float
11
+ field :response_time_avg => Float
12
+
13
+ field :elapsed_time_sdev => Float
14
+ field :transaction_rate_sdev => Float
15
+ field :vusers_sdev => Float
16
+ field :response_time_sdev => Float
17
+
18
+
19
+ field :transactions_total => Float
20
+ field :successful_total => Float
21
+ field :failed_total => Float
22
+
23
+ field :data_transferred_total => Float
24
+ field :headers_transferred_total => Float
25
+
26
+
27
+ field :elapsed_time_total => Float
28
+ field :availability => Float
29
+ field :throughput_avg => Float
30
+ field :throughput_sdev => Float
31
+
32
+ def availability
33
+ return 0 if @successful_total == 0
34
+ begin
35
+ (@transactions_total / @successful_total).to_f * 100
36
+ rescue => ex
37
+ 0.0
38
+ end
39
+ end
40
+
41
+
42
+ attr_reader :runs
43
+
44
+ def initialize(msg="")
45
+ @message = msg
46
+ @runs = []
47
+ end
48
+
49
+ # Add a TestRun object to the list
50
+ def add_run(run)
51
+ raise "I got a #{run.class} but I wanted a Run::Summary" unless run.is_a?(Run::Summary)
52
+ @runs << run
53
+ calculate
54
+ end
55
+
56
+ private
57
+ def calculate
58
+ # We simply keep a running tally of these
59
+ @transactions_total = 0
60
+ @headers_transferred_total = 0
61
+ @data_transferred_total = 0
62
+ @elapsed_time_total = 0
63
+ @successful_total = 0
64
+ @failed_total = 0
65
+
66
+ # We keep a list of the values for averaging and std dev
67
+ elapsed_times = ::Stats.new
68
+ transaction_rates = ::Stats.new
69
+ vusers_list = ::Stats.new
70
+ response_times = ::Stats.new
71
+ response_time = ::Stats.new
72
+ transaction_rate = ::Stats.new
73
+ throughput = ::Stats.new
74
+ vusers = ::Stats.new
75
+
76
+ # Each run is the summary of a single run (i.e. run01/SUMMARY.csv)
77
+ runs.each do |run|
78
+ # These are totaled
79
+ @transactions_total += run.transactions || 0
80
+ @headers_transferred_total += run.headers_transferred || 0
81
+ @data_transferred_total += run.data_transferred || 0
82
+ @successful_total += run.successful || 0
83
+ @failed_total += run.failed || 0
84
+ @elapsed_time_total += run.elapsed_time || 0
85
+
86
+ # These are used for standard deviation
87
+ elapsed_times.sample(run.elapsed_time)
88
+ transaction_rates.sample(run.transaction_rate)
89
+ vusers_list.sample(run.vusers)
90
+ response_times.sample(run.response_time)
91
+ throughput.sample(run.throughput)
92
+ response_time.sample(run.response_time)
93
+ transaction_rate.sample(run.transaction_rate)
94
+ vusers.sample(run.vusers)
95
+ end
96
+
97
+ # Calculate Averages
98
+ @elapsed_time_avg = elapsed_times.mean
99
+ @throughput_avg = throughput.mean
100
+ @response_time_avg = response_time.mean
101
+ @transaction_rate_avg = transaction_rate.mean
102
+ @vusers_avg = vusers.mean
103
+
104
+ # Calculate Standard Deviations
105
+ @elapsed_time_sdev = elapsed_times.sd
106
+ @throughput_sdev= throughput.sd
107
+ @transaction_rate_sdev = transaction_rates.sd
108
+ @vusers_sdev = vusers_list.sd
109
+ @response_time_sdev = response_times.sd
110
+
111
+ end
112
+ end
113
+
114
+ end
@@ -21,7 +21,7 @@ module Stella
21
21
 
22
22
  def load_resource
23
23
  return @messages unless @messages.empty?
24
- Stella::LOGGER.debug("LOADING #{path}")
24
+ #Stella::LOGGER.debug("LOADING #{path}")
25
25
  raise UnsupportedLanguage unless File.exists?(path)
26
26
  @messages = YAML.load_file(path)
27
27
  end
data/lib/stella.rb CHANGED
@@ -4,6 +4,10 @@ require 'date'
4
4
  require 'time'
5
5
  require 'tempfile'
6
6
  require 'socket'
7
+ require 'ostruct'
8
+ require 'optparse'
9
+ require 'rubygems'
10
+
7
11
 
8
12
  # Common utilities
9
13
  require 'utils/domainutil'
@@ -11,6 +15,7 @@ require 'utils/httputil'
11
15
  require 'utils/fileutil'
12
16
  require 'utils/mathutil'
13
17
  require 'utils/escape'
18
+ require 'utils/stats'
14
19
 
15
20
  # Common dependencies
16
21
  $: << File.join(STELLA_HOME, 'vendor', 'useragent', 'lib')
@@ -32,7 +37,7 @@ require 'stella/response'
32
37
  require 'stella/sysinfo'
33
38
  require 'stella/test/definition'
34
39
  require 'stella/test/run/summary'
35
- require 'stella/test/summary'
40
+ require 'stella/test/stats'
36
41
 
37
42
  # Commands
38
43
  require 'stella/command/base'
@@ -56,14 +61,14 @@ module Stella
56
61
  # including OS (unix), implementation (freebsd), and architecture (x64)
57
62
  SYSINFO = Stella::SystemInfo.new unless defined? SYSINFO
58
63
  # A global logger for info, error, and debug messages.
59
- LOGGER = Stella::Logger.new(:debug=>true) unless defined? LOGGER
64
+ LOGGER = Stella::Logger.new(:debug=>false) unless defined? LOGGER
60
65
  # A global resource for all interface text.
61
66
  TEXT = Stella::Text.new('en') unless defined? TEXT
62
67
 
63
68
  module VERSION #:nodoc:
64
69
  MAJOR = 0.freeze unless defined? MAJOR
65
70
  MINOR = 5.freeze unless defined? MINOR
66
- TINY = 4.freeze unless defined? TINY
71
+ TINY = 5.freeze unless defined? TINY
67
72
  def self.to_s
68
73
  [MAJOR, MINOR, TINY].join('.')
69
74
  end
@@ -71,6 +76,26 @@ module Stella
71
76
  self.to_s.to_f
72
77
  end
73
78
  end
74
-
79
+
80
+ def self.debug=(enable=false)
81
+ Stella::LOGGER.debug_level = enable
82
+ end
83
+
84
+ def self.text(*args)
85
+ TEXT.msg(*args)
86
+ end
87
+
88
+ def self.sysinfo
89
+ SYSINFO
90
+ end
91
+
92
+ def self.info(*args)
93
+ LOGGER.info(*args)
94
+ end
95
+
96
+ def self.error(*args)
97
+ LOGGER.error(*args)
98
+ end
99
+
75
100
  end
76
101
 
@@ -2,30 +2,6 @@
2
2
 
3
3
  module MathUtil
4
4
 
5
- def self.variance(population)
6
- n = 0
7
- mean = 0.0
8
- s = 0.0
9
-
10
- population.each { |x|
11
- n = n + 1
12
- delta = (x - mean).to_f
13
- mean = (mean + (delta / n)).to_f
14
- s = (s + delta * (x - mean)).to_f
15
- }
16
-
17
- s / n
18
- rescue => ex
19
- 0.0
20
- end
21
-
22
- # calculate the standard deviation of a population
23
- # accepts: an array, the population
24
- # returns: the standard deviation
25
- def self.standard_deviation(population)
26
- Math.sqrt(variance(population))
27
- end
28
-
29
5
  # enforce_limit
30
6
  #
31
7
  # Enforce a minimum and maximum value
@@ -37,55 +13,3 @@ module MathUtil
37
13
 
38
14
  end
39
15
 
40
-
41
-
42
-
43
- module Enumerable
44
-
45
- ##
46
- # Sum of all the elements of the Enumerable
47
-
48
- def sum
49
- return 0 if !self || self.empty?
50
- self.inject(0) { |acc, i| acc.to_f + i.to_f }
51
- end
52
-
53
- ##
54
- # Average of all the elements of the Enumerable
55
- #
56
- # The Enumerable must respond to #length
57
-
58
- def average
59
- return 0 unless self
60
- self.sum / self.length.to_f
61
- rescue => ex
62
- 0.0
63
- end
64
-
65
- ##
66
- # Sample variance of all the elements of the Enumerable
67
- #
68
- # The Enumerable must respond to #length
69
-
70
- def sample_variance
71
- return 0 unless self
72
- avg = self.average
73
- sum = self.sum
74
- (1 / self.length.to_f * sum)
75
- rescue => ex
76
- 0.0
77
- end
78
-
79
- ##
80
- # Standard deviation of all the elements of the Enumerable
81
- #
82
- # The Enumerable must respond to #length
83
-
84
- def standard_deviation
85
- return 0 unless self
86
- Math.sqrt(self.sample_variance)
87
- rescue => ex
88
- 0.0
89
- end
90
-
91
- end
@@ -0,0 +1,88 @@
1
+ # Copyright (c) 2005 Zed A. Shaw
2
+ # You can redistribute it and/or modify it under the same terms as Ruby.
3
+ #
4
+ # Additional work donated by contributors. See http://mongrel.rubyforge.org/attributions.html
5
+ # for more information.
6
+
7
+ # A very simple little class for doing some basic fast statistics sampling.
8
+ # You feed it either samples of numeric data you want measured or you call
9
+ # Stats.tick to get it to add a time delta between the last time you called it.
10
+ # When you're done either call sum, sumsq, n, min, max, mean or sd to get
11
+ # the information. The other option is to just call dump and see everything.
12
+ #
13
+ # It does all of this very fast and doesn't take up any memory since the samples
14
+ # are not stored but instead all the values are calculated on the fly.
15
+
16
+ class Stats
17
+ attr_reader :sum, :sumsq, :n, :min, :max
18
+
19
+ def initialize(name=:unknown)
20
+ @name = name
21
+ reset
22
+ end
23
+
24
+ # Resets the internal counters so you can start sampling again.
25
+ def reset
26
+ @sum = 0.0
27
+ @sumsq = 0.0
28
+ @last_time = Time.new
29
+ @n = 0.0
30
+ @min = 0.0
31
+ @max = 0.0
32
+ end
33
+
34
+ # Adds a sampling to the calculations.
35
+ def sample(s)
36
+ @sum += s
37
+ @sumsq += s * s
38
+ if @n == 0
39
+ @min = @max = s
40
+ else
41
+ @min = s if @min > s
42
+ @max = s if @max < s
43
+ end
44
+ (@n+=1).to_f
45
+ end
46
+
47
+ # Dump this Stats object with an optional additional message.
48
+ def dump(msg = "", out=STDERR)
49
+ out.puts "#{msg}: #{self.to_s}"
50
+ end
51
+
52
+ # Returns a common display (used by dump)
53
+ def to_s
54
+ "[#{@name}]: SUM=%0.4f, SUMSQ=%0.4f, N=%0.4f, MEAN=%0.4f, SD=%0.4f, MIN=%0.4f, MAX=%0.4f" % [@sum, @sumsq, @n, mean, sd, @min, @max]
55
+ end
56
+
57
+
58
+ # Calculates and returns the mean for the data passed so far.
59
+ def mean
60
+ @sum / @n
61
+ end
62
+
63
+ # Calculates the standard deviation of the data so far.
64
+ def sd
65
+ # (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) ))
66
+ begin
67
+ return Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) ).to_f
68
+ rescue Errno::EDOM
69
+ return 0.0
70
+ end
71
+ end
72
+
73
+
74
+ # Adds a time delta between now and the last time you called this. This
75
+ # will give you the average time between two activities.
76
+ #
77
+ # An example is:
78
+ #
79
+ # t = Stats.new("do_stuff")
80
+ # 10000.times { do_stuff(); t.tick }
81
+ # t.dump("time")
82
+ #
83
+ def tick
84
+ now = Time.now
85
+ sample(now - @last_time)
86
+ @last_time = now
87
+ end
88
+ end