autoperf 1.0.4
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/Gemfile +9 -0
- data/README.md +3 -0
- data/bin/autoperf +27 -0
- data/bin/make_replay_log +18 -0
- data/lib/autoperf.rb +54 -0
- data/lib/autoperf/display.rb +40 -0
- data/lib/autoperf/version.rb +3 -0
- data/lib/replay_log.rb +40 -0
- metadata +108 -0
data/Gemfile
ADDED
data/README.md
ADDED
data/bin/autoperf
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'autoperf')
|
4
|
+
|
5
|
+
trap("INT") {
|
6
|
+
puts "Terminating tests."
|
7
|
+
Process.exit
|
8
|
+
}
|
9
|
+
|
10
|
+
conf = ""
|
11
|
+
options = OptionParser.new do |opts|
|
12
|
+
opts.banner = "Usage: autoperf.rb [-c config]"
|
13
|
+
|
14
|
+
opts.on("-c", "--config [STRING]", String, "configuration file") do |c|
|
15
|
+
conf = c
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
options.parse!
|
20
|
+
if conf.empty?
|
21
|
+
puts options
|
22
|
+
exit 1
|
23
|
+
end
|
24
|
+
|
25
|
+
autoperf = Autoperf.new(conf)
|
26
|
+
autoperf.run()
|
27
|
+
autoperf.display.print
|
data/bin/make_replay_log
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'replay_log')
|
3
|
+
progname = File.basename($0)
|
4
|
+
|
5
|
+
if ARGV.size < 3
|
6
|
+
puts "Usage: ruby #{progname} 'match' 'substitute' 'http_server' file1 [file2 [file3]] > output_file"
|
7
|
+
puts "Usage: cat logfile | ruby #{progname} 'match' 'substitute' 'http_server' > output_file"
|
8
|
+
puts
|
9
|
+
puts "Example: cat /var/log/access_log | ruby #{progname} '/app' '/' nginx > replay_log"
|
10
|
+
puts "Example: cat /var/log/access_log | ruby #{progname} '' '' apache > replay_log"
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
|
14
|
+
match = ARGV.shift
|
15
|
+
sub = ARGV.shift
|
16
|
+
type = ARGV.shift
|
17
|
+
|
18
|
+
ARGF.each { |line| ReplayLog.parse(line, match, sub, type) }
|
data/lib/autoperf.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'yaml'
|
3
|
+
require 'httperf'
|
4
|
+
require 'json'
|
5
|
+
require 'autoperf/display'
|
6
|
+
|
7
|
+
class Autoperf
|
8
|
+
def initialize(config_file, opts = {})
|
9
|
+
@conf = parse_config(config_file).merge(opts)
|
10
|
+
@perf = HTTPerf.new(@conf)
|
11
|
+
@perf.parse = true
|
12
|
+
@perf.tee = true if @tee
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse_config(config_file)
|
16
|
+
raise Errno::EACCES, "#{config_file} is not readable" unless File.readable?(config_file)
|
17
|
+
config = YAML::load(File.open(config_file, 'r'))
|
18
|
+
@rates = {
|
19
|
+
:low_rate => config.delete('low_rate'),
|
20
|
+
:high_rate => config.delete('high_rate'),
|
21
|
+
:rate_step => config.delete('rate_step')
|
22
|
+
}
|
23
|
+
@cols = config.delete('display_columns') if config.has_key?('display_columns')
|
24
|
+
@tee = config.delete('tee')||false
|
25
|
+
return config
|
26
|
+
end
|
27
|
+
|
28
|
+
def run report=nil
|
29
|
+
@results = {}
|
30
|
+
(@rates[:low_rate].to_i..@rates[:high_rate].to_i).step(@rates[:rate_step].to_i) do |rate|
|
31
|
+
@perf.update_option("rate", rate.to_s)
|
32
|
+
@results[rate] = @perf.run
|
33
|
+
end
|
34
|
+
return @results
|
35
|
+
end
|
36
|
+
|
37
|
+
def display
|
38
|
+
@results ||= {}
|
39
|
+
if @cols
|
40
|
+
Autoperf::Display.new(@results, @cols)
|
41
|
+
else
|
42
|
+
Autoperf::Display.new(@results)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_s
|
47
|
+
display.to_s
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_json
|
51
|
+
@results ||= {}
|
52
|
+
@results.to_json
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'ruport'
|
2
|
+
class Autoperf
|
3
|
+
class Display
|
4
|
+
def initialize results, report=nil
|
5
|
+
@table = if report.kind_of?(Array)
|
6
|
+
table_from_array(report)
|
7
|
+
elsif report.kind_of?(Ruport::Data::Table)
|
8
|
+
report
|
9
|
+
else
|
10
|
+
# ignore input and use defaults
|
11
|
+
table_from_array([
|
12
|
+
:rate,
|
13
|
+
:connection_rate_per_sec,
|
14
|
+
:request_rate_per_sec,
|
15
|
+
:connection_time_avg,
|
16
|
+
:errors_total,
|
17
|
+
:reply_status_5xx,
|
18
|
+
:net_io_kb_sec
|
19
|
+
])
|
20
|
+
end
|
21
|
+
results.each do |rate, result|
|
22
|
+
result.merge!(:rate => rate) if @table.column_names.include?(:rate)
|
23
|
+
@table << result
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
@table.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
def print
|
32
|
+
puts to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
def table_from_array report
|
36
|
+
Table(:column_names => report)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
data/lib/replay_log.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module ReplayLog
|
2
|
+
def self.parse input, match='', sub='', type=:nginx
|
3
|
+
result = ""
|
4
|
+
if input.respond_to?(:each)
|
5
|
+
input.each do |line|
|
6
|
+
line_result = send("parse_line_#{type}".to_sym, line, match, sub)
|
7
|
+
print line_result
|
8
|
+
result << line_result
|
9
|
+
end
|
10
|
+
else
|
11
|
+
result = send("parse_line_#{type}".to_sym, input, match, sub)
|
12
|
+
print result
|
13
|
+
end
|
14
|
+
return result
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.parse_line_apache line, match='', sub=''
|
18
|
+
parse_line(line, match, sub)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.parse_line_nginx line, match='', sub=''
|
22
|
+
parse_line(line, match, sub)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.parse_line line, match='', sub=''
|
26
|
+
request = line.split('"')[1]
|
27
|
+
return if request.nil?
|
28
|
+
|
29
|
+
uri = request.split[1]
|
30
|
+
return if uri.nil?
|
31
|
+
|
32
|
+
begin
|
33
|
+
uri[match] = sub unless match.empty?
|
34
|
+
rescue IndexError
|
35
|
+
# simply output line that don't contain the 'replace' string
|
36
|
+
ensure
|
37
|
+
return uri.chomp + "\0"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: autoperf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Joshua Mervine
|
9
|
+
- Ilya Grigorik
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-04-15 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rake
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: httperfrb
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 0.3.11
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.3.11
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ruport
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
description: Autoperf is a ruby driver for httperf, designed to help you automate
|
64
|
+
load and performance testing of any web application - for a single end point, or
|
65
|
+
through log replay.
|
66
|
+
email:
|
67
|
+
- joshua@mervine.net
|
68
|
+
- excluded
|
69
|
+
executables:
|
70
|
+
- autoperf
|
71
|
+
- make_replay_log
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- lib/autoperf/display.rb
|
76
|
+
- lib/autoperf/version.rb
|
77
|
+
- lib/replay_log.rb
|
78
|
+
- lib/autoperf.rb
|
79
|
+
- bin/autoperf
|
80
|
+
- bin/make_replay_log
|
81
|
+
- README.md
|
82
|
+
- Gemfile
|
83
|
+
homepage: http://www.rubyops.net/gems/autoperf
|
84
|
+
licenses: []
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 1.8.24
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: Autoperf (w/ HTTPerf.rb)
|
107
|
+
test_files: []
|
108
|
+
has_rdoc:
|