strumbar 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Andrew Nordman
1
+ Copyright (c) 2012-2013 Andrew Nordman
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -90,6 +90,8 @@ Strumbar.configure do |config|
90
90
  end
91
91
  end
92
92
 
93
+ ```
94
+
93
95
  ## Authors
94
96
 
95
97
  Written by [Andrew Nordman](https://github.com/cadwallion) and [Matthew Wilson](https://github.com/hypomodern)
@@ -1,7 +1,7 @@
1
1
  require 'statsd'
2
2
 
3
3
  module Strumbar
4
- class Client < ::Statsd::Client
4
+ class Client < ::Statsd
5
5
  def initialize host, port
6
6
  @host = host
7
7
  @port = port
@@ -3,13 +3,15 @@ module Strumbar
3
3
  module ActionController
4
4
  def self.load(options={})
5
5
  options[:rate] ||= Strumbar.default_rate
6
+ using_mongoid = options.fetch(:mongoid, false)
6
7
 
7
8
  Strumbar.subscribe /process_action.action_controller/ do |client, event|
8
9
  key = "#{event.payload[:controller]}.#{event.payload[:action]}"
10
+ db_runtime_key = using_mongoid ? :mongo_runtime : :db_runtime
9
11
 
10
12
  client.timing "#{key}.total_time", event.duration, options[:rate]
11
13
  client.timing "#{key}.view_time", event.payload[:view_runtime], options[:rate]
12
- client.timing "#{key}.db_time", event.payload[:db_runtime], options[:rate]
14
+ client.timing "#{key}.db_time", event.payload[db_runtime_key], options[:rate]
13
15
 
14
16
  client.increment "#{key}.status.#{event.payload[:status]}", options[:rate]
15
17
  end
@@ -0,0 +1,46 @@
1
+ module Strumbar
2
+ module Instrumentation
3
+ module Mongoid
4
+ # Seems a little out of scope for Strumbar, but honestly you're probably going to want
5
+ # this if you want to get anything out of instrumenting Mongoid.
6
+ module ControllerRuntime
7
+ extend ActiveSupport::Concern
8
+
9
+ protected
10
+
11
+ attr_internal :mongo_runtime
12
+
13
+ def time_tracker
14
+ Strumbar::Instrumentation::Mongoid::RuntimeTracker
15
+ end
16
+
17
+ def process_action action, *args
18
+ time_tracker.reset
19
+ super
20
+ end
21
+
22
+ def cleanup_view_runtime
23
+ mongo_rt_before_render = time_tracker.reset
24
+ runtime = super
25
+ mongo_rt_after_render = time_tracker.reset
26
+ self.mongo_runtime = mongo_rt_before_render + mongo_rt_after_render
27
+
28
+ runtime - mongo_rt_after_render
29
+ end
30
+
31
+ def append_info_to_payload payload
32
+ super
33
+ payload[:mongo_runtime] = mongo_runtime
34
+ end
35
+
36
+ module ClassMethods
37
+ def log_process_action payload
38
+ messages, mongo_runtime = super, payload[:mongo_runtime]
39
+ messages << ("Mongo: %.1fms" % mongo_runtime.to_f) if mongo_runtime
40
+ messages
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,34 @@
1
+ module Strumbar
2
+ module Instrumentation
3
+ module Mongoid
4
+ # This is basically how ActiveRecord instruments this, although they use a LogSubscriber,
5
+ # for no adequately explained reason. I'm not sure if we should include the controller mixin
6
+ # in Strumbar or not? Seems simultaneously in and out of scope.
7
+ class RuntimeTracker
8
+ RUNTIME_KEY = 'Mongoid::RuntimeTracker#runtime'
9
+ COUNT_KEY = 'Mongoid::RuntimeTracker#count'
10
+
11
+ def self.runtime= value
12
+ Thread.current[RUNTIME_KEY] = value
13
+ end
14
+
15
+ def self.runtime
16
+ Thread.current[RUNTIME_KEY] ||= 0
17
+ end
18
+
19
+ def self.count= value
20
+ Thread.current[COUNT_KEY] = value
21
+ end
22
+
23
+ def self.count
24
+ Thread.current[COUNT_KEY] ||= 0
25
+ end
26
+
27
+ def self.reset
28
+ time, self.runtime, self.count = runtime, 0, 0
29
+ time
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,42 @@
1
+ require 'strumbar/instrumentation/mongoid/runtime_tracker'
2
+ require 'strumbar/instrumentation/mongoid/controller_runtime'
3
+
4
+ module Strumbar
5
+ module Instrumentation
6
+ module Mongoid
7
+ CALLS_TO_BE_INSTRUMENTED = [ :read, :write ]
8
+
9
+ def self.load(options={})
10
+ options[:rate] ||= Strumbar.default_rate
11
+
12
+ Strumbar.subscribe 'mongo.mongoid' do |client, event|
13
+ RuntimeTracker.runtime += event.duration
14
+ RuntimeTracker.count += 1
15
+ end
16
+
17
+ if defined?(::ActionController)
18
+ ActiveSupport.on_load(:action_controller) do
19
+ include ControllerRuntime
20
+ end
21
+ end
22
+
23
+ unless ::Moped::Connection.instance_methods.include? :read_with_instrumentation
24
+ ::Moped::Connection.module_eval do
25
+ CALLS_TO_BE_INSTRUMENTED.each do |method|
26
+ class_eval <<-CODE, __FILE__, __LINE__ + 1
27
+ def #{method}_with_instrumentation(*args, &block)
28
+ Strumbar.strum 'mongo.mongoid', name: "#{method}" do
29
+ #{method}_without_instrumentation(*args, &block)
30
+ end
31
+ end
32
+ CODE
33
+
34
+ alias_method_chain method, :instrumentation
35
+ end
36
+ end
37
+ end
38
+ end # of self.load
39
+
40
+ end
41
+ end
42
+ end
@@ -1,8 +1,9 @@
1
1
  module Strumbar
2
2
  module Instrumentation
3
- autoload :Redis, 'strumbar/instrumentation/redis'
4
3
  autoload :ActionController, 'strumbar/instrumentation/action_controller'
5
4
  autoload :ActiveRecord, 'strumbar/instrumentation/active_record'
5
+ autoload :Mongoid, 'strumbar/instrumentation/mongoid'
6
+ autoload :Redis, 'strumbar/instrumentation/redis'
6
7
 
7
8
  def self.load
8
9
  custom_load = Strumbar.configuration.custom_load
@@ -12,6 +13,7 @@ module Strumbar
12
13
  else
13
14
  Strumbar::Instrumentation::ActionController.load if defined?(::ActionController)
14
15
  Strumbar::Instrumentation::ActiveRecord.load if defined?(::ActiveRecord)
16
+ Strumbar::Instrumentation::Mongoid.load if defined?(::Mongoid)
15
17
  Strumbar::Instrumentation::Redis.load if defined?(::Redis)
16
18
  end
17
19
  end
@@ -1,3 +1,3 @@
1
1
  module Strumbar
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ class AbstractHarness
4
+ def process_action action, *args
5
+ "Processed."
6
+ end
7
+
8
+ def append_info_to_payload payload
9
+ payload
10
+ end
11
+
12
+ def self.log_process_action payload
13
+ []
14
+ end
15
+ end
16
+
17
+ module Strumbar
18
+ module Instrumentation
19
+ module Mongoid
20
+ describe ControllerRuntime do
21
+ let(:test_harness) {
22
+ Class.new(AbstractHarness) do
23
+ include ControllerRuntime
24
+
25
+ public :time_tracker, :process_action, :append_info_to_payload
26
+ end
27
+ }
28
+
29
+ describe "#time_tracker" do
30
+ it "is a convenient way access the RuntimeTracker class" do
31
+ test_harness.new.time_tracker.should == RuntimeTracker
32
+ end
33
+ end
34
+
35
+ describe "#process_action" do
36
+ it "resets the tracker" do
37
+ test_harness.new.time_tracker.runtime = 1000
38
+
39
+ test_harness.new.process_action :my_action
40
+ test_harness.new.time_tracker.runtime.should == 0
41
+ end
42
+ end
43
+
44
+ describe ".log_process_action" do
45
+ it "adds the Mongo runtime to the list of messages to be logged" do
46
+ messages = test_harness.log_process_action({ mongo_runtime: 1000 })
47
+ messages.should == ["Mongo: 1000.0ms"]
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module Strumbar
4
+ module Instrumentation
5
+ module Mongoid
6
+ describe RuntimeTracker do
7
+ %w(runtime count).each do |attribute|
8
+ describe ".#{attribute}" do
9
+ it "is a class attribute" do
10
+ RuntimeTracker.send("#{attribute}=", 100)
11
+ RuntimeTracker.send(attribute).should == 100
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ describe ".reset" do
18
+ it "returns the current runtime" do
19
+ RuntimeTracker.runtime = 1500
20
+
21
+ RuntimeTracker.reset.should == 1500
22
+ end
23
+
24
+ it "resets the count and runtime attributes" do
25
+ RuntimeTracker.runtime = 1000
26
+ RuntimeTracker.count = 2
27
+
28
+ RuntimeTracker.reset
29
+ RuntimeTracker.runtime.should == 0
30
+ RuntimeTracker.count.should == 0
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,10 @@
1
1
  $:.push File.join(File.dirname(__FILE__), '..', 'lib')
2
2
 
3
+ # fake a Rails implementation detail
4
+ class Module
5
+ def attr_internal name
6
+ attr_accessor name
7
+ end
8
+ end
9
+
3
10
  require 'strumbar'
data/strumbar.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Strumbar::VERSION
17
17
 
18
18
  gem.add_dependency 'activesupport'
19
- gem.add_dependency 'statsd'
19
+ gem.add_dependency 'statsd-ruby'
20
20
 
21
21
  gem.add_development_dependency 'rspec'
22
22
  gem.add_development_dependency 'rake'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strumbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-10 00:00:00.000000000 Z
13
+ date: 2013-02-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
- requirement: &70333463715220 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70333463715220
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
26
31
  - !ruby/object:Gem::Dependency
27
- name: statsd
28
- requirement: &70333463714500 !ruby/object:Gem::Requirement
32
+ name: statsd-ruby
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ! '>='
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: '0'
34
39
  type: :runtime
35
40
  prerelease: false
36
- version_requirements: *70333463714500
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: rspec
39
- requirement: &70333463713740 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ! '>='
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: '0'
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *70333463713740
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: rake
50
- requirement: &70333463713100 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ! '>='
@@ -55,7 +70,12 @@ dependencies:
55
70
  version: '0'
56
71
  type: :development
57
72
  prerelease: false
58
- version_requirements: *70333463713100
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
59
79
  description: An instrumentation utility.
60
80
  email:
61
81
  - anordman@majorleaguegaming.com
@@ -76,8 +96,13 @@ files:
76
96
  - lib/strumbar/instrumentation.rb
77
97
  - lib/strumbar/instrumentation/action_controller.rb
78
98
  - lib/strumbar/instrumentation/active_record.rb
99
+ - lib/strumbar/instrumentation/mongoid.rb
100
+ - lib/strumbar/instrumentation/mongoid/controller_runtime.rb
101
+ - lib/strumbar/instrumentation/mongoid/runtime_tracker.rb
79
102
  - lib/strumbar/instrumentation/redis.rb
80
103
  - lib/strumbar/version.rb
104
+ - spec/instrumentation/mongoid/controller_runtime_spec.rb
105
+ - spec/instrumentation/mongoid/runtime_tracker_spec.rb
81
106
  - spec/instrumentation/redis_spec.rb
82
107
  - spec/instrumentation_spec.rb
83
108
  - spec/spec_helper.rb
@@ -97,7 +122,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
122
  version: '0'
98
123
  segments:
99
124
  - 0
100
- hash: -4086101781260081787
125
+ hash: 4031522421417010496
101
126
  required_rubygems_version: !ruby/object:Gem::Requirement
102
127
  none: false
103
128
  requirements:
@@ -106,14 +131,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
131
  version: '0'
107
132
  segments:
108
133
  - 0
109
- hash: -4086101781260081787
134
+ hash: 4031522421417010496
110
135
  requirements: []
111
136
  rubyforge_project:
112
- rubygems_version: 1.8.10
137
+ rubygems_version: 1.8.24
113
138
  signing_key:
114
139
  specification_version: 3
115
140
  summary: Helper library to strum along in your application.
116
141
  test_files:
142
+ - spec/instrumentation/mongoid/controller_runtime_spec.rb
143
+ - spec/instrumentation/mongoid/runtime_tracker_spec.rb
117
144
  - spec/instrumentation/redis_spec.rb
118
145
  - spec/instrumentation_spec.rb
119
146
  - spec/spec_helper.rb