proceso-rails 0.2.1
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 +7 -0
- data/lib/proceso/middleware.rb +92 -0
- data/lib/proceso-rails.rb +29 -0
- metadata +94 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d0932393e7e50f1cf3c47d1b22e1b899f69379c8
|
4
|
+
data.tar.gz: 2a5b660eeb65c1b4de77a9837080ea0433acbc6c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: df5f58f5981ae148771f7761a250a28edb0d1b33c3afb24a0b5ebe2c953dce1b216192de858a2e83425fb89183b5cbfdb4e052875205e31009565a8da6475ee2
|
7
|
+
data.tar.gz: c24c0ff17d03f11e7585fbfc4ad0b14e4108fdb50cf470dbcdf78bff20a6add88462a50eb22f44f002cb5e3c64d5677bd952078bab54339ae717fe8b1c7ecb1a
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'rack'
|
2
|
+
|
3
|
+
module Proceso
|
4
|
+
class Middleware
|
5
|
+
|
6
|
+
SUBSCRIPTION = 'proceso.usage'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def start_instrument!
|
11
|
+
logger.info "[Proceso #{Proceso::VERSION}] Proceso Middleware is activated. (#{Rails.env.to_s} mode)"
|
12
|
+
subscribe do |name, start, finish, id, payload|
|
13
|
+
mem_used = (payload[:mem_used].to_f / 1024.0).round(1)
|
14
|
+
cpu_used = payload[:cpu_used].to_f.round(1)
|
15
|
+
path = payload[:request].path_info
|
16
|
+
resp_time = payload[:resp_time]
|
17
|
+
logger.debug "[PROCESO] MEM: #{mem_used}KB\tCPU: #{cpu_used}\tRESP: #{resp_time}ms\tPATH: #{path}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def subscribe(&blk)
|
22
|
+
ActiveSupport::Notifications.subscribe(SUBSCRIPTION, &blk)
|
23
|
+
end
|
24
|
+
|
25
|
+
def logger
|
26
|
+
@@logger ||= begin
|
27
|
+
Rails.configuration.logger || ActiveSupport::Logger.new(STDOUT)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_reader :app, :pid, :notifier, :config
|
34
|
+
|
35
|
+
def initialize(app, options = {})
|
36
|
+
@app = app
|
37
|
+
@notifier = ActiveSupport::Notifications
|
38
|
+
@pid = Process.pid
|
39
|
+
@config = ActiveSupport::InheritableOptions.new(options[:config])
|
40
|
+
end
|
41
|
+
|
42
|
+
def call(env)
|
43
|
+
return @app.call(env) if path_excluded?(env["PATH_INFO"])
|
44
|
+
capture_process_usage(env) do
|
45
|
+
@app.call(env)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def capture_process_usage(env)
|
50
|
+
mem_1, cpu_1, resp_1 = build_process_payload
|
51
|
+
response = yield
|
52
|
+
mem_2, cpu_2, resp_2 = build_process_payload
|
53
|
+
process_payload = calculate_process_times(env, mem_1, mem_2, cpu_1, cpu_2, resp_1, resp_2)
|
54
|
+
notifier.instrument(SUBSCRIPTION, process_payload)
|
55
|
+
response
|
56
|
+
end
|
57
|
+
|
58
|
+
def build_process_payload
|
59
|
+
mem = process.mem_size
|
60
|
+
cpu = process.user_cpu_times
|
61
|
+
resp = Time.now.to_i
|
62
|
+
[mem, cpu, resp]
|
63
|
+
end
|
64
|
+
|
65
|
+
def calculate_process_times(env, m1, m2, c1, c2, r1, r2)
|
66
|
+
mem_used = m2 - m1
|
67
|
+
cpu_used = c2 - c2
|
68
|
+
resp_time = r2 - r1
|
69
|
+
req = Rack::Request.new(env)
|
70
|
+
{
|
71
|
+
pid: process.pid,
|
72
|
+
mem_used: mem_used,
|
73
|
+
cpu_used: cpu_used,
|
74
|
+
resp_time: resp_time,
|
75
|
+
request: req
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
def process
|
80
|
+
@process ||= Proceso::PID.new(pid)
|
81
|
+
end
|
82
|
+
|
83
|
+
def exclusions
|
84
|
+
config.exclusions || []
|
85
|
+
end
|
86
|
+
|
87
|
+
def path_excluded?(path)
|
88
|
+
exclusions.any? {|e| path =~ e }
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'proceso'
|
3
|
+
require 'proceso/middleware'
|
4
|
+
|
5
|
+
module Proceso
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
|
8
|
+
config.proceso = ActiveSupport::OrderedOptions.new
|
9
|
+
|
10
|
+
config.proceso.environments = ['development']
|
11
|
+
config.proceso.exclusions = [/\.(js|wot|jpg|jpeg|gif|png|css)$/]
|
12
|
+
|
13
|
+
initializer 'proceso.initializer' do |app|
|
14
|
+
if environment_enabled?
|
15
|
+
app.middleware.insert 0, Proceso::Middleware, config: config.proceso
|
16
|
+
Proceso::Middleware.start_instrument!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def environments
|
21
|
+
config.proceso.environments.uniq.map(&:to_s).compact
|
22
|
+
end
|
23
|
+
|
24
|
+
def environment_enabled?
|
25
|
+
environments.include?(Rails.env.to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: proceso-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bryan Goines
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-05-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: proceso
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.2'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.2.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.2'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.2.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
description: Proceso Middleware for Rails
|
62
|
+
email:
|
63
|
+
- bryann83@gmail.com
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- lib/proceso-rails.rb
|
69
|
+
- lib/proceso/middleware.rb
|
70
|
+
homepage: https://github.com/bry4n/proceso
|
71
|
+
licenses:
|
72
|
+
- MIT
|
73
|
+
metadata: {}
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 2.2.0
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: Proceso Middleware for Rails 4
|
94
|
+
test_files: []
|