benji_node 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in benji_node.gemspec
4
+ gemspec
data/README.textile ADDED
@@ -0,0 +1,8 @@
1
+ h2. Installing the node to collect data for the app
2
+
3
+ Just add gem **'benji_node'** to your Rails 3 Gemfile and run bundle install as usual.
4
+
5
+ h2. Changing the connection settings for the redis server
6
+
7
+ You need to have a running redis server and the redis gem installed. **In the vendors/plugin/benji_node.rb** you can
8
+ change the port and host for the redis server you want to use.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "benji_node/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "benji_node"
7
+ s.version = BenjiNode::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Thomas Fankhauser"]
10
+ s.email = ["tommylefunk@googlemail.com"]
11
+ s.homepage = "http://www.southdesign.de"
12
+ s.summary = %q{A node that collects data for the benji profiler for rails}
13
+ s.description = %q{This node collects the data for the benji profiler for rails that you can clone from https://southdesign@github.com/southdesign/benji.git}
14
+
15
+ s.rubyforge_project = "benji_node"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency 'rails', '>= 3.0.0'
23
+ s.add_dependency 'redis'
24
+ end
@@ -0,0 +1,22 @@
1
+ module BenjiNode
2
+ class Middleware
3
+
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ response = notifications.instrument "rack.request",
10
+ :path => env["PATH_INFO"],
11
+ :method => env["REQUEST_METHOD"],
12
+ :instrumenter_id => notifications.instrumenter.id do
13
+ @app.call(env)
14
+ end
15
+ end
16
+
17
+ protected
18
+ def notifications
19
+ ActiveSupport::Notifications
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,90 @@
1
+ module BenjiNode
2
+ module Parser
3
+
4
+ CATEGORIES = {
5
+ :none => "none",
6
+ :request => "request",
7
+ :view => "view",
8
+ :view_partial => "view_partial",
9
+ :controller => "controller",
10
+ :database => "database"
11
+ }
12
+
13
+ def self.parse event
14
+ mapping = self.select_mapping event
15
+ self.send mapping, event
16
+ end
17
+
18
+ private
19
+ def self.select_mapping event
20
+ method = case event.name
21
+ when "rack.request" then return "parse_request"
22
+ when "sql.active_record" then return "parse_sql"
23
+ when "process_action.action_controller" then return "parse_controller"
24
+ when "render_template.action_view" then return "parse_view_template"
25
+ when "render_partial.action_view" then return "parse_view_partial"
26
+ else "parse_unknown"
27
+ end
28
+ method.to_sym
29
+ end
30
+
31
+ def self.parse_unknown event
32
+ nil
33
+ end
34
+
35
+ def self.parse_request event
36
+ {
37
+ :name => "Request - #{event.name}",
38
+ :category => CATEGORIES[:request],
39
+ :time => event.time,
40
+ :duration => event.duration,
41
+ :path => event.payload[:path],
42
+ :method => event.payload[:method],
43
+ :body => nil
44
+ }
45
+ end
46
+
47
+ def self.parse_sql event
48
+ {
49
+ :name => "Database - #{event.payload[:name]}",
50
+ :category => CATEGORIES[:database],
51
+ :time => event.time,
52
+ :duration => event.duration,
53
+ :body => event.payload[:sql]
54
+ }
55
+ end
56
+
57
+ def self.parse_controller event
58
+ {
59
+ :name => "Controller - Process Action",
60
+ :category => CATEGORIES[:controller],
61
+ :time => event.time,
62
+ :duration => event.duration,
63
+ :body => "#{event.payload[:controller]}##{event.payload[:action]}",
64
+ :view_runtime => event.payload[:view_runtime],
65
+ :db_runtime => event.payload[:db_runtime]
66
+ }
67
+ end
68
+
69
+ def self.parse_view_template event
70
+ {
71
+ :name => "View - Render Template",
72
+ :category => CATEGORIES[:view],
73
+ :time => event.time,
74
+ :duration => event.duration,
75
+ :body => event.payload[:identifier]
76
+ }
77
+ end
78
+
79
+ def self.parse_view_partial event
80
+ {
81
+ :name => "View - Render Partial",
82
+ :category => CATEGORIES[:view_partial],
83
+ :time => event.time,
84
+ :duration => event.duration,
85
+ :body => event.payload[:identifier]
86
+ }
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,23 @@
1
+ module BenjiNode
2
+ class Railtie < Rails::Engine
3
+
4
+ # Default Configuration
5
+ config.benji = ActiveSupport::OrderedOptions.new
6
+ config.benji.poolsize = 1000
7
+
8
+ # Add Middleware
9
+ initializer "benji.add_middleware" do |app|
10
+ app.config.middleware.use BenjiNode::Middleware
11
+ end
12
+
13
+ # Initialize Subscription
14
+ writer = BenjiNode::Writer.new
15
+ initializer "benji.start_subscriber" do |app|
16
+ ActiveSupport::Notifications.subscribe /[^!]$/ do |*args|
17
+ event = ActiveSupport::Notifications::Event.new(*args)
18
+ writer.write(event)
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module BenjiNode
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,48 @@
1
+ module BenjiNode
2
+ class Writer
3
+
4
+ def initialize
5
+ @request_id = unique_id
6
+ end
7
+
8
+ def write event
9
+ data = BenjiNode::Parser.parse(event)
10
+ return unless data
11
+
12
+ check_for_new_request!(event, data)
13
+ check_for_event!(event, data)
14
+ end
15
+
16
+ private
17
+
18
+ def check_for_new_request! event, data
19
+ return unless is_new_request?(event)
20
+
21
+ # Create new _requests key
22
+ json = ActiveSupport::JSON.encode data
23
+ BenjiNode::Redis.hset "benji_requests", @request_id, json
24
+
25
+ @request_id = unique_id
26
+ end
27
+
28
+ def check_for_event! event, data
29
+ return if is_new_request?(event)
30
+
31
+ # Append to _events key
32
+ events = ActiveSupport::JSON.decode(BenjiNode::Redis.hget("benji_events", @request_id)) rescue []
33
+ events << data
34
+ json = ActiveSupport::JSON.encode events
35
+ BenjiNode::Redis.hset "benji_events", @request_id, json
36
+ end
37
+
38
+ def unique_id
39
+ BenjiNode::Redis.incr "benji_count"
40
+ "benji_#{BenjiNode::Redis.get "benji_count"}"
41
+ end
42
+
43
+ def is_new_request? event
44
+ event.name == "rack.request"
45
+ end
46
+
47
+ end
48
+ end
data/lib/benji_node.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'redis'
2
+ require 'active_support/secure_random'
3
+
4
+ require 'benji_node/parser'
5
+ require 'benji_node/writer'
6
+ require 'benji_node/middleware'
7
+
8
+ module BenjiNode
9
+ Redis = Redis.new :host => "http://localhost", :port => 6379
10
+ end
11
+
12
+ require 'benji_node/railtie'
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: benji_node
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Thomas Fankhauser
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-06 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rails
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 3
32
+ - 0
33
+ - 0
34
+ version: 3.0.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: redis
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ description: This node collects the data for the benji profiler for rails that you can clone from https://southdesign@github.com/southdesign/benji.git
52
+ email:
53
+ - tommylefunk@googlemail.com
54
+ executables: []
55
+
56
+ extensions: []
57
+
58
+ extra_rdoc_files: []
59
+
60
+ files:
61
+ - .gitignore
62
+ - Gemfile
63
+ - README.textile
64
+ - Rakefile
65
+ - benji_node.gemspec
66
+ - lib/benji_node.rb
67
+ - lib/benji_node/middleware.rb
68
+ - lib/benji_node/parser.rb
69
+ - lib/benji_node/railtie.rb
70
+ - lib/benji_node/version.rb
71
+ - lib/benji_node/writer.rb
72
+ has_rdoc: true
73
+ homepage: http://www.southdesign.de
74
+ licenses: []
75
+
76
+ post_install_message:
77
+ rdoc_options: []
78
+
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ hash: 3
96
+ segments:
97
+ - 0
98
+ version: "0"
99
+ requirements: []
100
+
101
+ rubyforge_project: benji_node
102
+ rubygems_version: 1.4.1
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: A node that collects data for the benji profiler for rails
106
+ test_files: []
107
+