httperfrb 0.2.1 → 0.3.0pre1

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 CHANGED
@@ -1,5 +1,7 @@
1
1
  source :rubygems
2
2
  gem 'open4'
3
+ gem 'gruff'
4
+ gem 'rmagick'
3
5
 
4
6
  group :development do
5
7
  gem 'rspec'
data/README.md CHANGED
@@ -68,6 +68,19 @@ Some basic usage examples.
68
68
 
69
69
  # or verbose output
70
70
  puts HTTPerf.parse( File.open("httperf_verbose.out", "r").read, true )
71
+
72
+ #### From the command line:
73
+
74
+ Something I've been playing around with, it's more of hack really. But it works well for seralizing output to YAML or JSON:
75
+
76
+ ##### To JSON file:
77
+
78
+ httperf --num-conns=10 --verbose | ruby -e 'require "httperf/parser"; require "json"; puts HTTPerf::Parser.parse(ARGF.read).to_json' > httperf.json
79
+
80
+ ##### To YAML file:
81
+
82
+ httperf --num-conns=10 --verbose | ruby -e 'require "httperf/parser"; require "yaml"; puts HTTPerf::Parser.parse(ARGF.read).to_yaml' > httperf.yml
83
+
71
84
 
72
85
 
73
86
  ##### Parser Keys:
@@ -0,0 +1,58 @@
1
+ class HTTPerf
2
+ class Grapher
3
+ attr_accessor :output_file
4
+ attr_reader :graph_settings
5
+
6
+ def initialize gs={}
7
+ begin
8
+ require 'gruff'
9
+ @output_file = "httperf_graph.png"
10
+ @graph_settings = default_graph_settings.merge(gs)
11
+ rescue LoadError
12
+ puts "WARNING: HTTPerf::Grapher not available -- please install 'gruff'."
13
+ end
14
+ end
15
+
16
+ def graph_settings=(s)
17
+ @graph_settings = graph_settings.merge(s)
18
+ end
19
+
20
+ def graph results
21
+ raise "missing connection times" unless results.has_key?(:connection_times)
22
+ graph = Gruff::Line.new
23
+
24
+ conn_times = results[:connection_times].map { |i| i.to_f }
25
+
26
+ graph_settings.each do |key,val|
27
+ graph.send("#{key}=".to_sym, val)
28
+ end
29
+
30
+ graph.data("Connection Times", conn_times)
31
+ graph.data("Average [#{results[:connection_time_avg].to_f}]", draw_line(results[:connection_time_avg].to_f, conn_times.count))
32
+ graph.data("85th [#{results[:connection_time_85_pct].to_f}]", draw_line(results[:connection_time_85_pct].to_f, conn_times.count))
33
+ graph.data("95th [#{results[:connection_time_95_pct].to_f}]", draw_line(results[:connection_time_95_pct].to_f, conn_times.count))
34
+ graph.data("99th [#{results[:connection_time_99_pct].to_f}]", draw_line(results[:connection_time_99_pct].to_f, conn_times.count))
35
+
36
+ graph.labels = {}
37
+ (1..(conn_times.count/10)).each do |i|
38
+ graph.labels[i*10] = (i*10).to_s
39
+ end
40
+
41
+ graph.write(output_file)
42
+ end
43
+
44
+ private
45
+ def default_graph_settings
46
+ {
47
+ hide_dots: true,
48
+ legend_font_size: 14,
49
+ marker_font_size: 14,
50
+ title: "HTTPerf Results"
51
+ }
52
+ end
53
+ def draw_line value, length
54
+ (1..length).collect { value }
55
+ end
56
+ end
57
+ end
58
+
@@ -1,4 +1,3 @@
1
- #require 'parser/verbose'
2
1
  class HTTPerf
3
2
 
4
3
  # Parse httperf output to a [Hash]
@@ -6,22 +5,20 @@ class HTTPerf
6
5
  # This can be used standalone or with HTTPerf results.
7
6
  class Parser
8
7
 
9
- attr_accessor :verbose
10
-
11
8
  # @return [Hash] returns hash of parsed httperf output
12
9
  # @param [String] raw httperf output
13
- def self.parse raw, verbose=false
10
+ def self.parse raw, verbose=false, grapher=false
14
11
 
15
12
  lines = raw.split("\n")
16
13
  matches = {}
17
14
 
18
15
  # for verbose matching
19
- verbose_connection_lifetime = []
16
+ verbose_connection_times = []
20
17
 
21
18
  lines.each do |line|
22
19
 
23
20
  if verbose and verbose_expression.match(line)
24
- verbose_connection_lifetime.push($1)
21
+ verbose_connection_times.push($1)
25
22
  next
26
23
  end
27
24
 
@@ -37,9 +34,9 @@ class HTTPerf
37
34
  end
38
35
  end
39
36
 
40
- unless verbose_connection_lifetime.empty?
37
+ unless verbose_connection_times.empty?
41
38
  percentiles.each do |percentile|
42
- matches["connection_time_#{percentile}_pct".to_sym] = calculate_percentile(percentile, verbose_connection_lifetime)
39
+ matches["connection_time_#{percentile}_pct".to_sym] = calculate_percentile(percentile, verbose_connection_times)
43
40
  end
44
41
  end
45
42
 
@@ -48,6 +45,11 @@ class HTTPerf
48
45
  else
49
46
  raise "mismatch error occurred" unless expressions.keys.count == matches.keys.count
50
47
  end
48
+
49
+ if grapher
50
+ matches[:connection_times] = verbose_connection_times
51
+ end
52
+
51
53
  return matches
52
54
  end
53
55
 
@@ -147,8 +149,8 @@ class HTTPerf
147
149
 
148
150
  private
149
151
  def self.calculate_percentile percentile, values
150
- values.sort!
151
- values[percentile_index(percentile, values.count)]
152
+ v = values.sort
153
+ v[percentile_index(percentile, values.count)]
152
154
  end
153
155
 
154
156
  def self.percentile_index percentile, count
@@ -1,3 +1,4 @@
1
1
  class HTTPerf
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0pre1"
3
3
  end
4
+
data/lib/httperf.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # @author Joshua Mervine <joshua@mervine.net>
2
2
  require 'open4'
3
3
  require 'httperf/parser'
4
+ require 'httperf/grapher'
4
5
  require 'httperf/version'
5
6
  class HTTPerf
6
7
 
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httperfrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
5
- prerelease:
4
+ version: 0.3.0pre1
5
+ prerelease: 5
6
6
  platform: ruby
7
7
  authors:
8
8
  - Joshua Mervine
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-11 00:00:00.000000000Z
12
+ date: 2012-08-13 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &13320100 !ruby/object:Gem::Requirement
16
+ requirement: &13531760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *13320100
24
+ version_requirements: *13531760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: simplecov
27
- requirement: &13317140 !ruby/object:Gem::Requirement
27
+ requirement: &13530720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *13317140
35
+ version_requirements: *13530720
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yard
38
- requirement: &13316620 !ruby/object:Gem::Requirement
38
+ requirement: &13529960 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *13316620
46
+ version_requirements: *13529960
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: open4
49
- requirement: &13316040 !ruby/object:Gem::Requirement
49
+ requirement: &13528560 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *13316040
57
+ version_requirements: *13528560
58
58
  description: Simple interface for calling httperf via ruby.
59
59
  email:
60
60
  - joshua@mervine.net
@@ -64,6 +64,7 @@ extra_rdoc_files: []
64
64
  files:
65
65
  - lib/httperf/version.rb
66
66
  - lib/httperf/parser.rb
67
+ - lib/httperf/grapher.rb
67
68
  - lib/httperf.rb
68
69
  - README.md
69
70
  - HISTORY.md
@@ -82,14 +83,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
82
83
  version: '0'
83
84
  segments:
84
85
  - 0
85
- hash: 4261295427007759208
86
+ hash: 3299317405384709120
86
87
  required_rubygems_version: !ruby/object:Gem::Requirement
87
88
  none: false
88
89
  requirements:
89
90
  - - ! '>='
90
91
  - !ruby/object:Gem::Version
91
92
  version: 1.3.6
92
- requirements: []
93
+ requirements:
94
+ - rmagick version ~>2.13.1
95
+ - gruff version ~>0.3.6
93
96
  rubyforge_project:
94
97
  rubygems_version: 1.7.2
95
98
  signing_key: