strumbar 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +27 -5
- data/lib/strumbar/client.rb +3 -3
- data/lib/strumbar/configuration.rb +9 -1
- data/lib/strumbar/instrumentation/action_controller.rb +7 -5
- data/lib/strumbar/instrumentation/active_record.rb +4 -2
- data/lib/strumbar/instrumentation/redis.rb +6 -4
- data/lib/strumbar/instrumentation.rb +9 -3
- data/lib/strumbar/version.rb +1 -1
- data/lib/strumbar.rb +5 -1
- data/spec/instrumentation/redis_spec.rb +17 -1
- data/spec/instrumentation_spec.rb +79 -30
- data/spec/strumbar_spec.rb +24 -4
- metadata +13 -13
data/README.md
CHANGED
@@ -20,13 +20,23 @@ Or install it yourself as:
|
|
20
20
|
## Usage
|
21
21
|
|
22
22
|
|
23
|
-
Configuration:
|
23
|
+
Configuration (all options shown with default values):
|
24
24
|
|
25
25
|
``` ruby
|
26
26
|
Strumbar.configure do |config|
|
27
|
-
|
28
|
-
|
29
|
-
config.application = '
|
27
|
+
|
28
|
+
# Application name as it should be stored by your Statsd backend.
|
29
|
+
config.application = 'statsd_appname'
|
30
|
+
|
31
|
+
# Statsd hostname
|
32
|
+
config.host = 'statsd.appname.example'
|
33
|
+
|
34
|
+
# Statsd port
|
35
|
+
config.port = 8125
|
36
|
+
|
37
|
+
# Default sample rate for all events.
|
38
|
+
config.default_rate = 1
|
39
|
+
|
30
40
|
end
|
31
41
|
```
|
32
42
|
|
@@ -66,7 +76,19 @@ loading default instrumentation subscriptions. Currently, this list includes:
|
|
66
76
|
- ActiveRecord
|
67
77
|
- Redis
|
68
78
|
|
69
|
-
|
79
|
+
Alternatively, you can choose specific instrumentations to load
|
80
|
+
and set your own sample rates for each by passing a block to config.instrumentation, like so:
|
81
|
+
|
82
|
+
``` ruby
|
83
|
+
Strumbar.configure do |config|
|
84
|
+
config.instrumentation do
|
85
|
+
Strumbar::Instrumentation::ActionController.load rate: 0.5
|
86
|
+
Strumbar::Instrumentation::ActiveRecord.load
|
87
|
+
Strumbar::Instrumentation::Redis.load
|
88
|
+
|
89
|
+
AppName::Instrumentation::ThirdPartyInstrument.load rate: 0.8
|
90
|
+
end
|
91
|
+
end
|
70
92
|
|
71
93
|
## Authors
|
72
94
|
|
data/lib/strumbar/client.rb
CHANGED
@@ -7,15 +7,15 @@ module Strumbar
|
|
7
7
|
@port = port
|
8
8
|
end
|
9
9
|
|
10
|
-
def timing stat, time, sample_rate =
|
10
|
+
def timing stat, time, sample_rate = Strumbar.default_rate
|
11
11
|
super "#{Strumbar.application}.#{stat}", time, sample_rate
|
12
12
|
end
|
13
13
|
|
14
|
-
def increment stat, sample_rate =
|
14
|
+
def increment stat, sample_rate = Strumbar.default_rate
|
15
15
|
super "#{Strumbar.application}.#{stat}", sample_rate
|
16
16
|
end
|
17
17
|
|
18
|
-
def decrement stat, sample_rate =
|
18
|
+
def decrement stat, sample_rate = Strumbar.default_rate
|
19
19
|
super "##{Strumbar.application}.#{stat}", sample_rate
|
20
20
|
end
|
21
21
|
end
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Strumbar
|
2
2
|
module Instrumentation
|
3
3
|
module ActionController
|
4
|
-
def self.load
|
4
|
+
def self.load(options={})
|
5
|
+
options[:rate] ||= Strumbar.default_rate
|
6
|
+
|
5
7
|
Strumbar.subscribe /process_action.action_controller/ do |client, event|
|
6
8
|
key = "#{event.payload[:controller]}.#{event.payload[:action]}"
|
7
9
|
|
8
|
-
client.timing "#{key}.total_time", event.duration
|
9
|
-
client.timing "#{key}.view_time", event.payload[:view_runtime]
|
10
|
-
client.timing "#{key}.db_time", event.payload[:db_runtime]
|
10
|
+
client.timing "#{key}.total_time", event.duration, options[:rate]
|
11
|
+
client.timing "#{key}.view_time", event.payload[:view_runtime], options[:rate]
|
12
|
+
client.timing "#{key}.db_time", event.payload[:db_runtime], options[:rate]
|
11
13
|
|
12
|
-
client.increment "#{key}.status.#{event.payload[:status]}"
|
14
|
+
client.increment "#{key}.status.#{event.payload[:status]}", options[:rate]
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
module Strumbar
|
2
2
|
module Instrumentation
|
3
3
|
module ActiveRecord
|
4
|
-
def self.load
|
4
|
+
def self.load(options={})
|
5
|
+
options[:rate] ||= Strumbar.default_rate
|
6
|
+
|
5
7
|
Strumbar.subscribe /sql.active_record/ do |client, event|
|
6
|
-
client.timing 'query_log', event.duration
|
8
|
+
client.timing 'query_log', event.duration, options[:rate]
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
module Strumbar
|
2
2
|
module Instrumentation
|
3
3
|
module Redis
|
4
|
-
def self.load
|
4
|
+
def self.load(options={})
|
5
|
+
options[:rate] ||= Strumbar.default_rate
|
6
|
+
|
5
7
|
Strumbar.subscribe 'query.redis' do |client, event|
|
6
|
-
client.increment 'query.redis'
|
7
|
-
client.increment
|
8
|
+
client.increment 'query.redis', options[:rate]
|
9
|
+
client.increment('failure.redis', options[:rate]) if event.payload[:failure]
|
8
10
|
|
9
11
|
command = case event.payload[:command]
|
10
12
|
when NilClass then nil
|
@@ -14,7 +16,7 @@ module Strumbar
|
|
14
16
|
|
15
17
|
command.gsub!(/:/, '_') unless command.nil?
|
16
18
|
|
17
|
-
client.timing "#{command}.redis", event.duration
|
19
|
+
client.timing "#{command}.redis", event.duration, options[:rate]
|
18
20
|
end
|
19
21
|
|
20
22
|
unless ::Redis::Client.instance_methods.include? :call_with_instrumentation
|
@@ -5,9 +5,15 @@ module Strumbar
|
|
5
5
|
autoload :ActiveRecord, 'strumbar/instrumentation/active_record'
|
6
6
|
|
7
7
|
def self.load
|
8
|
-
Strumbar
|
9
|
-
|
10
|
-
|
8
|
+
custom_load = Strumbar.configuration.custom_load
|
9
|
+
|
10
|
+
if custom_load
|
11
|
+
custom_load.call
|
12
|
+
else
|
13
|
+
Strumbar::Instrumentation::ActionController.load if defined?(::ActionController)
|
14
|
+
Strumbar::Instrumentation::ActiveRecord.load if defined?(::ActiveRecord)
|
15
|
+
Strumbar::Instrumentation::Redis.load if defined?(::Redis)
|
16
|
+
end
|
11
17
|
end
|
12
18
|
end
|
13
19
|
end
|
data/lib/strumbar/version.rb
CHANGED
data/lib/strumbar.rb
CHANGED
@@ -29,7 +29,11 @@ module Strumbar
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def application
|
32
|
-
configuration.try(:application) || '
|
32
|
+
configuration.try(:application) || 'statsd_appname'
|
33
|
+
end
|
34
|
+
|
35
|
+
def default_rate
|
36
|
+
configuration.try(:default_rate) || 1
|
33
37
|
end
|
34
38
|
|
35
39
|
def subscribe identifier
|
@@ -27,7 +27,7 @@ describe Strumbar::Instrumentation::Redis do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'subscribes to query.redis notifications' do
|
30
|
-
Strumbar.client.should_receive(:increment).with('query.redis')
|
30
|
+
Strumbar.client.should_receive(:increment).with('query.redis', 1)
|
31
31
|
Strumbar.strum 'query.redis', {}
|
32
32
|
end
|
33
33
|
|
@@ -35,4 +35,20 @@ describe Strumbar::Instrumentation::Redis do
|
|
35
35
|
client = Redis::Client.new
|
36
36
|
client.call 'foo'
|
37
37
|
end
|
38
|
+
|
39
|
+
context 'with a user-defined redis sample rate' do
|
40
|
+
before do
|
41
|
+
Strumbar.configure do |config|
|
42
|
+
c.instrumentation do
|
43
|
+
Strumbar::Instrumentation::Redis.load rate: 0.5
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'subscribes to query.redis notifications' do
|
48
|
+
Strumbar.client.should_receive(:increment).with('query.redis', 0.5)
|
49
|
+
Strumbar.strum 'query.redis', {}
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
38
54
|
end
|
@@ -6,51 +6,100 @@ describe Strumbar::Instrumentation do
|
|
6
6
|
Object.send :remove_const, klass
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
context 'without a custom instrumentation loader' do
|
10
|
+
before do
|
11
|
+
Strumbar.configure do |config|
|
12
|
+
end
|
13
|
+
end
|
10
14
|
|
11
|
-
ActionController
|
15
|
+
it 'loads the ActionController subscription if ActionController is defined' do
|
12
16
|
|
13
|
-
|
14
|
-
Strumbar::Instrumentation.load
|
17
|
+
ActionController = true
|
15
18
|
|
16
|
-
|
17
|
-
|
19
|
+
Strumbar::Instrumentation::ActionController.should_receive :load
|
20
|
+
Strumbar::Instrumentation.load
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
Strumbar::Instrumentation.load
|
22
|
-
end
|
22
|
+
undefine :ActionController
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
it 'does not load ActionController subscription if not defined' do
|
26
|
+
Strumbar::Instrumentation::ActionController.should_not_receive :load
|
27
|
+
Strumbar::Instrumentation.load
|
28
|
+
end
|
26
29
|
|
27
|
-
|
28
|
-
|
30
|
+
it 'loads the ActiveRecord subscription if ActiveRecord is loaded' do
|
31
|
+
ActiveRecord = true
|
29
32
|
|
30
|
-
|
31
|
-
|
33
|
+
Strumbar::Instrumentation::ActiveRecord.should_receive :load
|
34
|
+
Strumbar::Instrumentation.load
|
32
35
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
36
|
+
undefine :ActiveRecord
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'does not load ActiveRecord subscription if not defined' do
|
40
|
+
Strumbar::Instrumentation::ActiveRecord.should_not_receive :load
|
41
|
+
Strumbar::Instrumentation.load
|
42
|
+
end
|
37
43
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
44
|
+
it 'loads the Redis subscription if Redis is defined' do
|
45
|
+
class Redis
|
46
|
+
class Client
|
47
|
+
def process ; end
|
48
|
+
end
|
42
49
|
end
|
50
|
+
|
51
|
+
Strumbar::Instrumentation::Redis.should_receive :load
|
52
|
+
Strumbar::Instrumentation.load
|
53
|
+
|
54
|
+
undefine :Redis
|
43
55
|
end
|
44
56
|
|
45
|
-
|
46
|
-
|
57
|
+
it 'does not load Redis subscription if not defined' do
|
58
|
+
Strumbar::Instrumentation::Redis.should_not_receive :load
|
59
|
+
Strumbar::Instrumentation.load
|
60
|
+
end
|
47
61
|
|
48
|
-
undefine :Redis
|
49
62
|
end
|
50
63
|
|
51
|
-
|
52
|
-
|
53
|
-
|
64
|
+
context 'with a custom instrumentations loader' do
|
65
|
+
before do
|
66
|
+
Strumbar.configure do |config|
|
67
|
+
config.instrumentation do
|
68
|
+
Strumbar::Instrumentation::ActionController.load
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'does load the ActionController subscription' do
|
74
|
+
ActionController = true
|
75
|
+
Strumbar::Instrumentation::ActionController.should_receive :load
|
76
|
+
Strumbar::Instrumentation.load
|
77
|
+
undefine :ActionController
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'does not load the ActiveRecord subscription even if ActiveRecord is loaded' do
|
81
|
+
ActiveRecord = true
|
82
|
+
|
83
|
+
Strumbar::Instrumentation::ActiveRecord.should_not_receive :load
|
84
|
+
Strumbar::Instrumentation.load
|
85
|
+
|
86
|
+
undefine :ActiveRecord
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'does not load the Redis subscription even if Redis is defined' do
|
90
|
+
class Redis
|
91
|
+
class Client
|
92
|
+
def process ; end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
Strumbar::Instrumentation::Redis.should_not_receive :load
|
97
|
+
Strumbar::Instrumentation.load
|
98
|
+
|
99
|
+
undefine :Redis
|
100
|
+
end
|
101
|
+
|
54
102
|
end
|
103
|
+
|
55
104
|
end
|
56
105
|
end
|
data/spec/strumbar_spec.rb
CHANGED
@@ -59,19 +59,39 @@ describe Strumbar do
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
describe 'after #configure' do
|
63
|
+
context 'with default values' do
|
64
|
+
before { Strumbar.configure { } }
|
65
|
+
subject { Strumbar }
|
66
|
+
|
67
|
+
its(:default_rate) { should == 1 }
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'with user values' do
|
71
|
+
before do
|
72
|
+
Strumbar.configure do |config|
|
73
|
+
config.default_rate = 0.5
|
74
|
+
end
|
75
|
+
end
|
76
|
+
subject { Strumbar }
|
77
|
+
|
78
|
+
its(:default_rate) { should == 0.5 }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
62
82
|
describe "#application" do
|
63
83
|
it "returns the configured value" do
|
64
|
-
Strumbar.configure { |
|
84
|
+
Strumbar.configure { |config| config.application = "foobar" }
|
65
85
|
Strumbar.application.should == "foobar"
|
66
86
|
end
|
67
87
|
it "defaults to something comically bad so you'll change it" do
|
68
|
-
Strumbar.application.should == "
|
88
|
+
Strumbar.application.should == "statsd_appname"
|
69
89
|
end
|
70
90
|
end
|
71
91
|
|
72
92
|
describe "#host" do
|
73
93
|
it "returns the configured value" do
|
74
|
-
Strumbar.configure { |
|
94
|
+
Strumbar.configure { |config| config.host = "statsd.app" }
|
75
95
|
Strumbar.host.should == "statsd.app"
|
76
96
|
end
|
77
97
|
it "defaults to localhost" do
|
@@ -81,7 +101,7 @@ describe Strumbar do
|
|
81
101
|
|
82
102
|
describe "#port" do
|
83
103
|
it "returns the configured port" do
|
84
|
-
Strumbar.configure { |
|
104
|
+
Strumbar.configure { |config| config.port = 9999 }
|
85
105
|
Strumbar.port.should == 9999
|
86
106
|
end
|
87
107
|
it "defaults to 8125" do
|
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.0
|
4
|
+
version: 0.1.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-
|
13
|
+
date: 2012-08-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
17
|
-
requirement: &
|
17
|
+
requirement: &70333463715220 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70333463715220
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: statsd
|
28
|
-
requirement: &
|
28
|
+
requirement: &70333463714500 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70333463714500
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rspec
|
39
|
-
requirement: &
|
39
|
+
requirement: &70333463713740 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70333463713740
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rake
|
50
|
-
requirement: &
|
50
|
+
requirement: &70333463713100 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70333463713100
|
59
59
|
description: An instrumentation utility.
|
60
60
|
email:
|
61
61
|
- anordman@majorleaguegaming.com
|
@@ -97,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
97
97
|
version: '0'
|
98
98
|
segments:
|
99
99
|
- 0
|
100
|
-
hash: -
|
100
|
+
hash: -4086101781260081787
|
101
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
102
|
none: false
|
103
103
|
requirements:
|
@@ -106,10 +106,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
106
|
version: '0'
|
107
107
|
segments:
|
108
108
|
- 0
|
109
|
-
hash: -
|
109
|
+
hash: -4086101781260081787
|
110
110
|
requirements: []
|
111
111
|
rubyforge_project:
|
112
|
-
rubygems_version: 1.8.
|
112
|
+
rubygems_version: 1.8.10
|
113
113
|
signing_key:
|
114
114
|
specification_version: 3
|
115
115
|
summary: Helper library to strum along in your application.
|