rails_api_benchmark 0.2.1 → 0.2.2
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.
- checksums.yaml +4 -4
- data/README.md +73 -55
- data/lib/generators/rails_api_benchmark/config_generator.rb +22 -0
- data/lib/generators/rails_api_benchmark/templates/rails_api_benchmark_config.rb +41 -0
- data/lib/rails_api_benchmark/benchmark_tasks.rb +9 -0
- data/lib/rails_api_benchmark/version.rb +1 -1
- data/lib/rails_api_benchmark.rb +34 -2
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc553c272bb5f42a3b765748336af37be9503e74
|
4
|
+
data.tar.gz: 6cff65ef9d213d09b809fdc7d3b237a53707e824
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 144655c6afb4d8711864152918a5f78e6bbbdc0f2a5d56e61cd59fa62e205eb36c8b8453794a024903d0baf0df9a06acda0a5cd5fb05ffdae260951eec6f7f20
|
7
|
+
data.tar.gz: faeda2140659f2f4d7a509c447ddde94813b770013b997963f1d91ef0651cfb90043f42fd301bc5c30d0960c3888450cb666e3c2cd5d260e8c48b7b2e46ee290
|
data/README.md
CHANGED
@@ -1,10 +1,59 @@
|
|
1
1
|
# RailsApiBenchmark
|
2
2
|
|
3
|
-
Work in progress,
|
3
|
+
Work in progress, you can use it like this, see [Important](#important)
|
4
4
|
|
5
5
|
## Usage
|
6
6
|
|
7
|
-
Run it with
|
7
|
+
Run it with:
|
8
|
+
```bash
|
9
|
+
rails api:benchmark
|
10
|
+
```
|
11
|
+
|
12
|
+
Display your configuration with:
|
13
|
+
```bash
|
14
|
+
rails api:benchmark:config
|
15
|
+
```
|
16
|
+
|
17
|
+
Example output:
|
18
|
+
|
19
|
+
```json
|
20
|
+
{
|
21
|
+
"concurrency": 2,
|
22
|
+
"host": "localhost:5000",
|
23
|
+
"nb_requests": 1000,
|
24
|
+
"results_folder": "benchmark",
|
25
|
+
"auth_header": "Authorization: Token token=benchToken",
|
26
|
+
"curl_cmd": "curl -H \"%{auth_header}\" http://%{host}%{route}",
|
27
|
+
"bench_cmd": "ab -n %{nb_requests} -c %{concurrency} -g plot.tsv -H \"%{auth_header}\" http://%{host}%{route}",
|
28
|
+
"server_cmd": "bundle exec puma",
|
29
|
+
"env_vars": {
|
30
|
+
"RAILS_MAX_THREADS": "2"
|
31
|
+
},
|
32
|
+
"regexps": [
|
33
|
+
{
|
34
|
+
"key": "response_time",
|
35
|
+
"name": "Average time per request (ms)",
|
36
|
+
"regexp": "(?-mix:Time\\s+per\\s+request:\\s+([0-9.]*).*\\(mean\\))"
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"key": "req_per_sec",
|
40
|
+
"name": "Requests per second (#)",
|
41
|
+
"regexp": "(?-mix:Requests\\s+per\\s+second:\\s+([0-9.]*).*\\(mean\\))"
|
42
|
+
}
|
43
|
+
],
|
44
|
+
"routes": [
|
45
|
+
{
|
46
|
+
"name": "candidates_per_25",
|
47
|
+
"route": "/candidates",
|
48
|
+
"method": "get",
|
49
|
+
"title": "GET /candidates",
|
50
|
+
"description": "Get first page of candidates (default 25 per page)"
|
51
|
+
}
|
52
|
+
]
|
53
|
+
}
|
54
|
+
|
55
|
+
```
|
56
|
+
|
8
57
|
|
9
58
|
## Important
|
10
59
|
|
@@ -14,73 +63,42 @@ Run it with rake api:benchmark
|
|
14
63
|
|
15
64
|
## Installation
|
16
65
|
|
17
|
-
Install gnuplot
|
66
|
+
* Install gnuplot
|
67
|
+
* Install ApacheBench
|
18
68
|
|
19
|
-
|
69
|
+
For ubuntu:
|
70
|
+
```bash
|
71
|
+
sudo apt-get install gnuplot
|
72
|
+
sudo apt-get install apache2-utils
|
73
|
+
```
|
74
|
+
* Add this line to your application's Gemfile:
|
20
75
|
|
21
76
|
```ruby
|
22
77
|
gem 'rails_api_benchmark'
|
23
78
|
```
|
24
79
|
|
25
|
-
And then execute:
|
80
|
+
* And then execute:
|
26
81
|
```bash
|
27
|
-
|
82
|
+
bundle
|
28
83
|
```
|
29
84
|
|
30
|
-
Provide necessary configuration in initializer,
|
85
|
+
* Provide necessary configuration in initializer, generate it with:
|
31
86
|
|
32
|
-
```
|
33
|
-
|
34
|
-
RailsApiBenchmark.configure do |config|
|
35
|
-
# Try different configs. You may need to run the
|
36
|
-
# benchmark in a production ready environment to get reliable results
|
37
|
-
config.concurrency = 2
|
38
|
-
config.host = 'localhost:5000' # example.com
|
39
|
-
config.nb_requests = 3000
|
40
|
-
config.results_folder = 'benchmark'
|
41
|
-
config.auth_header = 'Authorization: Token token=benchToken'
|
42
|
-
# Use only if you want to log the responses
|
43
|
-
config.curl_cmd = 'curl -H "%{auth_header}" http://%{host}%{route}'
|
44
|
-
# Use Apache Bench
|
45
|
-
config.bench_cmd = 'ab -n %{nb_requests} -c %{concurrency} -g plot.tsv -e plot.csv -H "%{auth_header}" http://%{host}%{route}'
|
46
|
-
config.server_cmd = 'bundle exec puma'
|
47
|
-
config.env_vars = {
|
48
|
-
'RAILS_MAX_THREADS' => '2',
|
49
|
-
'SECRET_KEY_BASE' => 'bench',
|
50
|
-
'RAILS_ENV' => 'production',
|
51
|
-
'SSL_DISABLE' => 'yup',
|
52
|
-
'PORT' => '5000'
|
53
|
-
}
|
54
|
-
config.regexps = [ # Used to get results from the output of benchmark tools
|
55
|
-
{
|
56
|
-
key: :response_time,
|
57
|
-
name: 'Average time per request (ms)',
|
58
|
-
regexp: /Time\s+per\s+request:\s+([0-9.]*).*\(mean\)/
|
59
|
-
}, {
|
60
|
-
key: :req_per_sec,
|
61
|
-
name: 'Requests per second (#)',
|
62
|
-
regexp: /Requests\s+per\s+second:\s+([0-9.]*).*\(mean\)/
|
63
|
-
}
|
64
|
-
]
|
65
|
-
config.routes = [
|
66
|
-
{
|
67
|
-
name: 'candidates_per_25',
|
68
|
-
route: '/candidates',
|
69
|
-
method: :get,
|
70
|
-
title: 'GET /candidates'
|
71
|
-
}
|
72
|
-
].freeze
|
73
|
-
end
|
74
|
-
end
|
87
|
+
```bash
|
88
|
+
rails g rails_api_benchmark:config
|
75
89
|
```
|
76
90
|
|
77
|
-
Next, add this to your Rakefile:
|
91
|
+
* Next, add this to your Rakefile:
|
78
92
|
|
79
93
|
```ruby
|
80
94
|
require 'rails_api_benchmark/benchmark_tasks'
|
81
95
|
```
|
82
96
|
|
83
|
-
You can now run
|
97
|
+
You can now run:
|
98
|
+
|
99
|
+
```bash
|
100
|
+
rails api:benchmark
|
101
|
+
```
|
84
102
|
|
85
103
|
## Contributing
|
86
104
|
Contributions are welcome
|
@@ -89,7 +107,7 @@ Contributions are welcome
|
|
89
107
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
90
108
|
|
91
109
|
### TODO
|
92
|
-
*
|
93
|
-
*
|
110
|
+
* Summary file (.md), to show response time for each endpoint and compare with others to track the slowest
|
111
|
+
* POST requests handling
|
94
112
|
* Add simplecov to permit controller coverage for example
|
95
|
-
*
|
113
|
+
* Document configuration template file
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module RailsApiBenchmark
|
2
|
+
module Generators
|
3
|
+
# rails g kaminari:config
|
4
|
+
class ConfigGenerator < Rails::Generators::Base # :nodoc:
|
5
|
+
source_root File.expand_path(
|
6
|
+
File.join(
|
7
|
+
File.dirname(__FILE__),
|
8
|
+
'templates'
|
9
|
+
)
|
10
|
+
)
|
11
|
+
|
12
|
+
desc <<-DESC.strip_heredoc
|
13
|
+
Description:
|
14
|
+
Copies RailsApiBenchmark configuration to your app initializers folder
|
15
|
+
DESC
|
16
|
+
def copy_config_file
|
17
|
+
template 'rails_api_benchmark_config.rb',
|
18
|
+
'config/initializers/rails_api_benchmark_config.rb'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# unless Rails.env.production?
|
2
|
+
RailsApiBenchmark.configure do |config|
|
3
|
+
# config.concurrency = 2
|
4
|
+
# config.host = 'localhost:5000'
|
5
|
+
# config.nb_requests = 1000
|
6
|
+
# config.results_folder = 'benchmark'
|
7
|
+
# config.auth_header = 'Authorization: Token token=benchToken'
|
8
|
+
# Use only if you want to log the responses
|
9
|
+
# config.curl_cmd = 'curl -H "%{auth_header}" http://%{host}%{route}'
|
10
|
+
# Keep plot.tsv to render graph
|
11
|
+
# config.bench_cmd = 'ab -n %{nb_requests} -c %{concurrency} -g plot.tsv' \
|
12
|
+
# ' -H "%{auth_header}" http://%{host}%{route}'
|
13
|
+
# config.server_cmd = 'bundle exec puma'
|
14
|
+
# config.env_vars = {
|
15
|
+
# 'RAILS_MAX_THREADS' => '2',
|
16
|
+
# 'SECRET_KEY_BASE' => 'bench',
|
17
|
+
# 'RAILS_ENV' => 'production',
|
18
|
+
# 'PORT' => '5000'
|
19
|
+
# }
|
20
|
+
# config.regexps = [
|
21
|
+
# {
|
22
|
+
# key: :response_time,
|
23
|
+
# name: 'Average time per request (ms)',
|
24
|
+
# regexp: /Time\s+per\s+request:\s+([0-9.]*).*\(mean\)/
|
25
|
+
# }, {
|
26
|
+
# key: :req_per_sec,
|
27
|
+
# name: 'Requests per second (#)',
|
28
|
+
# regexp: /Requests\s+per\s+second:\s+([0-9.]*).*\(mean\)/
|
29
|
+
# }
|
30
|
+
# ]
|
31
|
+
config.routes = [
|
32
|
+
{
|
33
|
+
name: 'todo_list',
|
34
|
+
route: '/todos',
|
35
|
+
method: :get,
|
36
|
+
title: 'GET /todos',
|
37
|
+
description: 'Get first page of todos (default 25 per page)'
|
38
|
+
}
|
39
|
+
].freeze
|
40
|
+
end
|
41
|
+
# end
|
@@ -13,6 +13,15 @@ module RailsApiBenchmark
|
|
13
13
|
|
14
14
|
at_exit { RailsApiBenchmark::Subprocess.kill_all }
|
15
15
|
end
|
16
|
+
|
17
|
+
namespace :benchmark do
|
18
|
+
desc 'Prints RailsApiBenchmark config'
|
19
|
+
task config: :environment do
|
20
|
+
require 'json'
|
21
|
+
|
22
|
+
puts JSON.pretty_generate(RailsApiBenchmark.config.all)
|
23
|
+
end
|
24
|
+
end
|
16
25
|
end
|
17
26
|
end
|
18
27
|
end
|
data/lib/rails_api_benchmark.rb
CHANGED
@@ -8,10 +8,42 @@ require 'rails_api_benchmark/endpoint'
|
|
8
8
|
require 'rails_api_benchmark/views/view' # Requires all the views
|
9
9
|
|
10
10
|
module RailsApiBenchmark
|
11
|
-
class
|
11
|
+
class Configuration
|
12
12
|
attr_accessor :concurrency, :nb_requests, :auth_header,
|
13
13
|
:server_cmd, :bench_cmd, :curl_cmd, :results_folder,
|
14
14
|
:regexps, :env_vars, :routes, :host
|
15
|
+
|
16
|
+
# Default values, INSANE. Must be refactored
|
17
|
+
# Maybe create a yaml or json file to import for default values
|
18
|
+
def initialize
|
19
|
+
self.concurrency = 2
|
20
|
+
self.nb_requests = 1000
|
21
|
+
self.server_cmd = 'bundle exec puma'
|
22
|
+
self.bench_cmd = 'ab -n %{nb_requests} -c %{concurrency} -g plot.tsv' \
|
23
|
+
' -H "%{auth_header}" http://%{host}%{route}'
|
24
|
+
self.curl_cmd = 'curl -H "%{auth_header}" http://%{host}%{route}'
|
25
|
+
self.results_folder = 'benchmark'
|
26
|
+
self.regexps = [
|
27
|
+
{
|
28
|
+
key: :response_time,
|
29
|
+
name: 'Average time per request (ms)',
|
30
|
+
regexp: /Time\s+per\s+request:\s+([0-9.]*).*\(mean\)/
|
31
|
+
}, {
|
32
|
+
key: :req_per_sec,
|
33
|
+
name: 'Requests per second (#)',
|
34
|
+
regexp: /Requests\s+per\s+second:\s+([0-9.]*).*\(mean\)/
|
35
|
+
}
|
36
|
+
]
|
37
|
+
self.env_vars = {
|
38
|
+
'RAILS_MAX_THREADS' => 2,
|
39
|
+
'SSL_DISABLE' => true,
|
40
|
+
'SECRET_KEY_BASE' => '123',
|
41
|
+
'PORT' => 5000
|
42
|
+
}
|
43
|
+
self.routes = []
|
44
|
+
self.host = 'localhost:5000'
|
45
|
+
end
|
46
|
+
|
15
47
|
def all
|
16
48
|
instance_variables.inject({}) do |h, v|
|
17
49
|
var = v.to_s.sub('@', '')
|
@@ -24,7 +56,7 @@ module RailsApiBenchmark
|
|
24
56
|
attr_writer :config
|
25
57
|
|
26
58
|
def config
|
27
|
-
@config ||=
|
59
|
+
@config ||= Configuration.new
|
28
60
|
end
|
29
61
|
|
30
62
|
def configure
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_api_benchmark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Terry Raimondo
|
@@ -56,6 +56,8 @@ files:
|
|
56
56
|
- README.md
|
57
57
|
- Rakefile
|
58
58
|
- gnuplotscript
|
59
|
+
- lib/generators/rails_api_benchmark/config_generator.rb
|
60
|
+
- lib/generators/rails_api_benchmark/templates/rails_api_benchmark_config.rb
|
59
61
|
- lib/rails_api_benchmark.rb
|
60
62
|
- lib/rails_api_benchmark/benchmark_tasks.rb
|
61
63
|
- lib/rails_api_benchmark/core.rb
|