fozzie 0.0.26 → 0.0.27
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/README.md +138 -100
- data/lib/fozzie/configuration.rb +12 -5
- data/lib/fozzie/socket.rb +4 -3
- data/lib/fozzie/version.rb +1 -1
- data/spec/lib/fozzie/configuration_spec.rb +27 -12
- metadata +4 -4
data/README.md
CHANGED
@@ -12,101 +12,106 @@ Ruby gem for registering statistics to a [Statsd](https://github.com/etsy/statsd
|
|
12
12
|
Send through statistics depending on the type you want to provide:
|
13
13
|
|
14
14
|
### Increment counter
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
``` ruby
|
16
|
+
Stats.increment 'wat' # increments the value in a Statsd bucket called 'some.prefix.wat' -
|
17
|
+
# the exact bucket name depends on the bucket name prefix (see below)
|
18
|
+
```
|
19
19
|
### Decrement counter
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
``` ruby
|
21
|
+
Stats.decrement 'wat'
|
22
|
+
```
|
23
23
|
### Decrement counter - provide a value as integer
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
``` ruby
|
25
|
+
Stats.count 'wat', 5
|
26
|
+
```
|
27
27
|
### Basic timing - provide a value in milliseconds
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
``` ruby
|
29
|
+
Stats.timing 'wat', 500
|
30
|
+
```
|
31
31
|
### Timings - provide a block to time against (inline and do syntax supported)
|
32
|
+
``` ruby
|
33
|
+
Stats.time 'wat' { sleep 5 }
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
sleep 5
|
37
|
-
end
|
38
|
-
|
39
|
-
Stats.time_for 'wat' { sleep 5 }
|
35
|
+
Stats.time_to_do 'wat' do
|
36
|
+
sleep 5
|
37
|
+
end
|
40
38
|
|
39
|
+
Stats.time_for 'wat' { sleep 5 }
|
40
|
+
```
|
41
41
|
### Gauges - register arbitrary values
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
``` ruby
|
43
|
+
Stats.gauge 'wat', 99
|
44
|
+
```
|
45
45
|
### Events - register different events
|
46
46
|
|
47
47
|
|
48
48
|
#### Commits
|
49
|
+
``` ruby
|
50
|
+
Stats.commit
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
Stats.committed
|
53
|
-
|
52
|
+
Stats.committed
|
53
|
+
```
|
54
54
|
#### Builds
|
55
|
+
``` ruby
|
56
|
+
Stats.built
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
-
Stats.build
|
59
|
-
|
58
|
+
Stats.build
|
59
|
+
```
|
60
60
|
#### Deployments
|
61
|
-
|
62
|
-
|
61
|
+
``` ruby
|
62
|
+
Stats.deployed
|
63
|
+
```
|
63
64
|
|
64
65
|
With a custom app:
|
66
|
+
``` ruby
|
67
|
+
Stats.deployed 'watapp'
|
65
68
|
|
66
|
-
|
67
|
-
|
68
|
-
Stats.deploy
|
69
|
+
Stats.deploy
|
70
|
+
```
|
69
71
|
|
70
72
|
With a custom app:
|
71
|
-
|
72
|
-
|
73
|
+
``` ruby
|
74
|
+
Stats.deploy 'watapp'
|
75
|
+
```
|
73
76
|
|
74
77
|
#### Custom
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
78
|
+
``` ruby
|
79
|
+
Stats.event 'pull'
|
80
|
+
```
|
81
|
+
With a custom app:
|
82
|
+
|
83
|
+
``` ruby
|
84
|
+
Stats.event 'pull', 'watapp'
|
85
|
+
```
|
82
86
|
### Boolean result - pass a value to be true or false, and increment on true
|
83
|
-
|
84
|
-
|
85
|
-
|
87
|
+
``` ruby
|
88
|
+
Stats.increment_on 'wat', duck.valid?
|
89
|
+
```
|
86
90
|
## Sampling
|
87
91
|
|
88
92
|
Each of the above methods accepts a sample rate as the last argument (before any applicable blocks), e.g:
|
89
93
|
|
90
|
-
|
94
|
+
``` ruby
|
95
|
+
Stats.increment 'wat', 10
|
91
96
|
|
92
|
-
|
97
|
+
Stats.decrement 'wat', 10
|
93
98
|
|
94
|
-
|
95
|
-
|
99
|
+
Stats.count 'wat', 5, 10
|
100
|
+
```
|
96
101
|
## Monitor
|
97
102
|
|
98
103
|
You can monitor methods with the following:
|
104
|
+
``` ruby
|
105
|
+
class FooBar
|
99
106
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
# my code here...
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
107
|
+
_monitor
|
108
|
+
def zar
|
109
|
+
# my code here...
|
110
|
+
end
|
108
111
|
|
109
|
-
|
112
|
+
end
|
113
|
+
```
|
114
|
+
This will register the processing time for this method, everytime it is called, under the Graphite bucket `foo_bar.zar`.
|
110
115
|
|
111
116
|
This will work on both Class and Instance methods.
|
112
117
|
|
@@ -114,10 +119,12 @@ This will work on both Class and Instance methods.
|
|
114
119
|
|
115
120
|
Fozzie supports the following namespaces as default
|
116
121
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
122
|
+
``` ruby
|
123
|
+
Stats.increment 'wat'
|
124
|
+
S.increment 'wat'
|
125
|
+
Statistics.increment 'wat'
|
126
|
+
Warehouse.increment 'wat'
|
127
|
+
```
|
121
128
|
|
122
129
|
You can customise this via the YAML configuration (see instructions below)
|
123
130
|
|
@@ -129,29 +136,52 @@ Fozzie is configured via a YAML or by setting a block against the Fozzie namespa
|
|
129
136
|
|
130
137
|
Create a `fozzie.yml` within a `config` folder on the root of your app, which contains your settings for each env. Simple, verbose example below.
|
131
138
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
139
|
+
``` yaml
|
140
|
+
development:
|
141
|
+
appname: wat
|
142
|
+
host: '127.0.0.1'
|
143
|
+
port: 8125
|
144
|
+
namespaces: %w{Foo Bar Wat}
|
145
|
+
prefix: %{foo bar car}
|
146
|
+
test:
|
147
|
+
appname: wat
|
148
|
+
host: 'localhost'
|
149
|
+
port: 8125
|
150
|
+
namespaces: %w{Foo Bar Wat}
|
151
|
+
production:
|
152
|
+
appname: wat
|
153
|
+
host: 'stats.wat.com'
|
154
|
+
port: 8125
|
155
|
+
namespaces: %w{Foo Bar Wat}
|
156
|
+
```
|
147
157
|
|
148
158
|
### Configure block
|
149
159
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
160
|
+
``` ruby
|
161
|
+
Fozzie.configure do |config|
|
162
|
+
config.appname = "wat"
|
163
|
+
config.host = "127.0.0.1"
|
164
|
+
config.port = 8125
|
165
|
+
config.prefix = []
|
166
|
+
end
|
167
|
+
```
|
168
|
+
### Prefixes
|
169
|
+
|
170
|
+
You can inject or set the prefix value for your application.
|
171
|
+
|
172
|
+
``` ruby
|
173
|
+
Fozzie.configure do |config|
|
174
|
+
config.prefix = ['foo', 'wat', 'bar']
|
175
|
+
end
|
176
|
+
```
|
177
|
+
|
178
|
+
``` ruby
|
179
|
+
Fozzie.configure do |config|
|
180
|
+
config.prefix << 'dynamic-value'
|
181
|
+
end
|
182
|
+
```
|
183
|
+
|
184
|
+
Prefixes are cached on first use, therefore any changes to the Fozzie configure prefix after first metric is sent in your application will be ignored.
|
155
185
|
|
156
186
|
## Middleware
|
157
187
|
|
@@ -159,13 +189,15 @@ To time and register the controller actions within your Rails application, Fozzi
|
|
159
189
|
|
160
190
|
### Rack
|
161
191
|
|
162
|
-
|
163
|
-
|
192
|
+
``` ruby
|
193
|
+
require 'rack'
|
194
|
+
require 'fozzie'
|
164
195
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
196
|
+
app = Rack::Builder.new {
|
197
|
+
use Fozzie::Rack::Middleware
|
198
|
+
lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'OK'] }
|
199
|
+
}
|
200
|
+
```
|
169
201
|
|
170
202
|
### Rails
|
171
203
|
|
@@ -178,11 +210,13 @@ Fozzie::Rails::Middleware will automatically be invoked on Rails initialization.
|
|
178
210
|
Fozzie automatically constructs bucket name prefixes from app name,
|
179
211
|
hostname, and environment. For example:
|
180
212
|
|
181
|
-
|
182
|
-
|
213
|
+
``` ruby
|
214
|
+
Stats.increment 'wat'
|
215
|
+
```
|
183
216
|
increments the bucket named
|
184
|
-
|
185
|
-
|
217
|
+
``` text
|
218
|
+
app-name.your-computer-name.development.wat
|
219
|
+
```
|
186
220
|
|
187
221
|
When working on your development machine. This allows multiple
|
188
222
|
application instances, in different environments, to be distinguished
|
@@ -195,12 +229,16 @@ The app name can be configured via the YAML configuration.
|
|
195
229
|
The current implementation of Fozzie wraps the sending of the statistic in a timeout and rescue block, which prevent long host lookups (i.e. if your stats server disappears) and minimises impact on your code or application if something is erroring at a low level.
|
196
230
|
|
197
231
|
Fozzie will try to log these errors, but only if a logger has been applied (which by default it does not). Examples:
|
198
|
-
|
199
|
-
require 'logger'
|
200
|
-
Fozzie.logger = Logger.new(STDOUT)
|
201
232
|
|
202
|
-
|
203
|
-
|
233
|
+
``` ruby
|
234
|
+
require 'logger'
|
235
|
+
Fozzie.logger = Logger.new(STDOUT)
|
236
|
+
```
|
237
|
+
|
238
|
+
``` ruby
|
239
|
+
require 'logger'
|
240
|
+
Fozzie.logger = Logger.new 'log/fozzie.log'
|
241
|
+
```
|
204
242
|
|
205
243
|
This may change, depending on feedback and more production experience.
|
206
244
|
|
data/lib/fozzie/configuration.rb
CHANGED
@@ -10,7 +10,7 @@ module Fozzie
|
|
10
10
|
class Configuration
|
11
11
|
include Sys
|
12
12
|
|
13
|
-
attr_accessor :env, :config_path, :host, :port, :appname, :namespaces, :timeout, :monitor_classes, :sniff_envs, :ignore_prefix
|
13
|
+
attr_accessor :env, :config_path, :host, :port, :appname, :namespaces, :timeout, :monitor_classes, :sniff_envs, :ignore_prefix, :prefix
|
14
14
|
|
15
15
|
def initialize(args = {})
|
16
16
|
merge_and_assign_config(args)
|
@@ -24,11 +24,17 @@ module Fozzie
|
|
24
24
|
# Returns the prefix for any stat requested to be registered
|
25
25
|
def data_prefix
|
26
26
|
return nil if @ignore_prefix
|
27
|
+
return @data_prefix if @data_prefix
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
29
|
+
data_prefix = @prefix.collect do |me|
|
30
|
+
(me.kind_of?(Symbol) && self.respond_to?(me.to_sym) ? self.send(me) : me.to_s)
|
31
|
+
end
|
32
|
+
|
33
|
+
data_prefix = data_prefix.collect do |s|
|
34
|
+
s.empty? ? nil : s.gsub(Socket::DELIMETER, '-')
|
35
|
+
end.compact.join(Socket::DELIMETER).strip
|
36
|
+
|
37
|
+
@data_prefix ||= (data_prefix.empty? ? nil : data_prefix)
|
32
38
|
end
|
33
39
|
|
34
40
|
# Returns the origin name of the current machine to register the stat against
|
@@ -55,6 +61,7 @@ module Fozzie
|
|
55
61
|
def self.default_configuration
|
56
62
|
{
|
57
63
|
:host => '127.0.0.1',
|
64
|
+
:prefix => [:appname, :origin_name, :env],
|
58
65
|
:port => 8125,
|
59
66
|
:config_path => '',
|
60
67
|
:env => (ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'),
|
data/lib/fozzie/socket.rb
CHANGED
@@ -4,6 +4,7 @@ module Fozzie
|
|
4
4
|
module Socket
|
5
5
|
|
6
6
|
RESERVED_CHARS_REGEX = /[\:\|\@\s]/
|
7
|
+
DELIMETER = '.'
|
7
8
|
|
8
9
|
private
|
9
10
|
|
@@ -12,10 +13,10 @@ module Fozzie
|
|
12
13
|
# Creates the Statsd key from the given values, and sends to socket (depending on sample rate)
|
13
14
|
#
|
14
15
|
def send(stat, delta, type, sample_rate)
|
15
|
-
stat = [stat].flatten.compact.collect(&:to_s).join(
|
16
|
-
stat = stat.gsub('::',
|
16
|
+
stat = [stat].flatten.compact.collect(&:to_s).join(DELIMETER).downcase
|
17
|
+
stat = stat.gsub('::', DELIMETER).gsub(RESERVED_CHARS_REGEX, '_')
|
17
18
|
|
18
|
-
k = [Fozzie.c.data_prefix, stat].compact.join(
|
19
|
+
k = [Fozzie.c.data_prefix, stat].compact.join(DELIMETER)
|
19
20
|
k << ":"
|
20
21
|
k << [delta, type].join('|')
|
21
22
|
k << '@%s' % sample_rate.to_s if sample_rate < 1
|
data/lib/fozzie/version.rb
CHANGED
@@ -24,20 +24,35 @@ describe Fozzie::Configuration do
|
|
24
24
|
subject.env.should eq 'test'
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
subject.stubs(:origin_name).returns("")
|
29
|
-
subject.data_prefix.should eq 'test'
|
30
|
-
end
|
27
|
+
describe "#prefix and #data_prefix" do
|
31
28
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
29
|
+
it "creates a #data_prefix" do
|
30
|
+
subject.stubs(:origin_name).returns("")
|
31
|
+
subject.data_prefix.should eq 'test'
|
32
|
+
end
|
33
|
+
|
34
|
+
it "creates a #data_prefix with appname when set" do
|
35
|
+
subject.stubs(:origin_name).returns("")
|
36
|
+
subject.appname = 'astoria'
|
37
|
+
subject.data_prefix.should eq 'astoria.test'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "creates a #data_prefix with origin" do
|
41
|
+
subject.appname = 'astoria'
|
42
|
+
subject.data_prefix.should match /^astoria\.(\S+)\.test$/
|
43
|
+
end
|
44
|
+
|
45
|
+
it "allows dynamic assignment of #prefix to derive #data_prefix" do
|
46
|
+
subject.prefix = [:foo, :bar, :car]
|
47
|
+
subject.data_prefix.should eq 'foo.bar.car'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "allows dynamic injection of value to prefix" do
|
51
|
+
subject.stubs(:origin_name).returns("")
|
52
|
+
subject.prefix << 'git-sha-1234'
|
53
|
+
subject.data_prefix.should eq 'test.git-sha-1234'
|
54
|
+
end
|
37
55
|
|
38
|
-
it "creates a prefix with origin" do
|
39
|
-
subject.appname = 'astoria'
|
40
|
-
subject.data_prefix.should match /^astoria\.(\S+)\.test$/
|
41
56
|
end
|
42
57
|
|
43
58
|
it "handles missing configuration namespace" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fozzie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.27
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-08-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: sys-uname
|
@@ -262,7 +262,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
262
262
|
version: '0'
|
263
263
|
segments:
|
264
264
|
- 0
|
265
|
-
hash:
|
265
|
+
hash: 1975054614990968952
|
266
266
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
267
267
|
none: false
|
268
268
|
requirements:
|
@@ -271,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
271
|
version: '0'
|
272
272
|
segments:
|
273
273
|
- 0
|
274
|
-
hash:
|
274
|
+
hash: 1975054614990968952
|
275
275
|
requirements: []
|
276
276
|
rubyforge_project: fozzie
|
277
277
|
rubygems_version: 1.8.24
|