fozzie 1.0.3 → 1.1.0
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 +4 -4
- data/lib/fozzie/adapter.rb +1 -1
- data/lib/fozzie/adapter/datadog.rb +26 -0
- data/lib/fozzie/adapter/statsd.rb +94 -95
- data/lib/fozzie/bulk_dsl.rb +27 -28
- data/lib/fozzie/configuration.rb +0 -2
- data/lib/fozzie/dsl.rb +17 -19
- data/lib/fozzie/interface.rb +140 -140
- data/lib/fozzie/version.rb +3 -3
- data/spec/lib/fozzie/adapter/datadog_spec.rb +31 -0
- data/spec/lib/fozzie/adapter/statsd_spec.rb +82 -82
- data/spec/lib/fozzie/configuration_spec.rb +125 -125
- data/spec/lib/fozzie/rack/sinatra_spec.rb +31 -31
- data/spec/shared_examples/interface.rb +154 -160
- data/spec/spec_helper.rb +32 -29
- metadata +4 -2
data/lib/fozzie/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module Fozzie
|
2
|
-
VERSION = "1.0
|
3
|
-
end
|
1
|
+
module Fozzie
|
2
|
+
VERSION = "1.1.0"
|
3
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fozzie/adapter/datadog'
|
3
|
+
|
4
|
+
module Fozzie::Adapter
|
5
|
+
describe Datadog do
|
6
|
+
it_behaves_like "fozzie adapter"
|
7
|
+
|
8
|
+
# Switch to Statsd adapter for the duration of this test
|
9
|
+
before(:all) do
|
10
|
+
Fozzie.c.adapter = :Datadog
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:all) do
|
14
|
+
Fozzie.c.adapter = :TestAdapter
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#register" do
|
18
|
+
it "appends tags to the metrics" do
|
19
|
+
subject.should_receive(:send_to_socket).with(%r{\|#country:usa,testing$})
|
20
|
+
|
21
|
+
subject.register(:bucket => "foo", :value => 1, :type => :gauge, :sample_rate => 1, tags: ['country:usa','testing'])
|
22
|
+
end
|
23
|
+
|
24
|
+
it "does not append tags when none are specified" do
|
25
|
+
subject.should_receive(:send_to_socket).with(%r{foo:1\|g$})
|
26
|
+
|
27
|
+
subject.register(:bucket => "foo", :value => 1, :type => :gauge, :sample_rate => 1)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,82 +1,82 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fozzie/adapter/statsd'
|
3
|
-
|
4
|
-
module Fozzie::Adapter
|
5
|
-
describe Statsd do
|
6
|
-
it_behaves_like "fozzie adapter"
|
7
|
-
|
8
|
-
# Switch to Statsd adapter for the duration of this test
|
9
|
-
before(:all) do
|
10
|
-
Fozzie.c.adapter = :Statsd
|
11
|
-
end
|
12
|
-
|
13
|
-
after(:all) do
|
14
|
-
Fozzie.c.adapter = :TestAdapter
|
15
|
-
end
|
16
|
-
|
17
|
-
it "downcases any stat value" do
|
18
|
-
subject.should_receive(:send_to_socket).with
|
19
|
-
|
20
|
-
subject.register(:
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "#format_bucket" do
|
24
|
-
it "accepts arrays" do
|
25
|
-
subject.format_bucket([:foo, '2']).should match
|
26
|
-
subject.format_bucket([:foo, '2']).should match
|
27
|
-
subject.format_bucket(%w{foo bar}).should match
|
28
|
-
end
|
29
|
-
|
30
|
-
it "converts any values to strings for stat value, ignoring nil" do
|
31
|
-
subject.format_bucket([:foo, 1, nil, "@", "BAR"]).should =~ /foo.1._.bar/
|
32
|
-
end
|
33
|
-
|
34
|
-
it "replaces invalid chracters" do
|
35
|
-
subject.format_bucket([:foo, ':']).should match
|
36
|
-
subject.format_bucket([:foo, '@']).should match
|
37
|
-
subject.format_bucket('foo.bar.|').should match
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe "#format_value" do
|
42
|
-
it "defaults type to gauge when type is not mapped" do
|
43
|
-
subject.format_value(1, :foo, 1).should eq '1|g'
|
44
|
-
end
|
45
|
-
|
46
|
-
it "converts basic values to string" do
|
47
|
-
subject.format_value(1, :count, 1).should eq '1|c'
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
it "ensures block is called on socket error" do
|
52
|
-
subject.socket.stub(:send) { raise SocketError }
|
53
|
-
|
54
|
-
proc { subject.register(:
|
55
|
-
proc { subject.register(:
|
56
|
-
end
|
57
|
-
|
58
|
-
it "raises Timeout on slow lookup" do
|
59
|
-
Fozzie.c.timeout = 0.01
|
60
|
-
subject.socket.stub(:send).with(any_args) { sleep 0.4 }
|
61
|
-
|
62
|
-
subject.register(:
|
63
|
-
end
|
64
|
-
|
65
|
-
describe "multiple stats in a single call" do
|
66
|
-
|
67
|
-
it "collects stats together with delimeter" do
|
68
|
-
Fozzie.c.disable_prefix
|
69
|
-
|
70
|
-
stats = [
|
71
|
-
{ :
|
72
|
-
{ :
|
73
|
-
{ :
|
74
|
-
]
|
75
|
-
|
76
|
-
subject.should_receive(:send_to_socket).with "foo:1|c\nbar:1|g\nfoo.bar:100|ms"
|
77
|
-
|
78
|
-
subject.register(stats)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fozzie/adapter/statsd'
|
3
|
+
|
4
|
+
module Fozzie::Adapter
|
5
|
+
describe Statsd do
|
6
|
+
it_behaves_like "fozzie adapter"
|
7
|
+
|
8
|
+
# Switch to Statsd adapter for the duration of this test
|
9
|
+
before(:all) do
|
10
|
+
Fozzie.c.adapter = :Statsd
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:all) do
|
14
|
+
Fozzie.c.adapter = :TestAdapter
|
15
|
+
end
|
16
|
+
|
17
|
+
it "downcases any stat value" do
|
18
|
+
subject.should_receive(:send_to_socket).with(/\.foo/)
|
19
|
+
|
20
|
+
subject.register(:bucket => "FOO", :value => 1, :type => :gauge, :sample_rate => 1)
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#format_bucket" do
|
24
|
+
it "accepts arrays" do
|
25
|
+
subject.format_bucket([:foo, '2']).should match(/foo.2$/)
|
26
|
+
subject.format_bucket([:foo, '2']).should match(/foo.2$/)
|
27
|
+
subject.format_bucket(%w{foo bar}).should match(/foo.bar$/)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "converts any values to strings for stat value, ignoring nil" do
|
31
|
+
subject.format_bucket([:foo, 1, nil, "@", "BAR"]).should =~ /foo.1._.bar/
|
32
|
+
end
|
33
|
+
|
34
|
+
it "replaces invalid chracters" do
|
35
|
+
subject.format_bucket([:foo, ':']).should match(/foo.#{subject.class::RESERVED_CHARS_REPLACEMENT}$/)
|
36
|
+
subject.format_bucket([:foo, '@']).should match(/foo.#{subject.class::RESERVED_CHARS_REPLACEMENT}$/)
|
37
|
+
subject.format_bucket('foo.bar.|').should match(/foo.bar.#{subject.class::RESERVED_CHARS_REPLACEMENT}$/)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#format_value" do
|
42
|
+
it "defaults type to gauge when type is not mapped" do
|
43
|
+
subject.format_value(1, :foo, 1).should eq '1|g'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "converts basic values to string" do
|
47
|
+
subject.format_value(1, :count, 1).should eq '1|c'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "ensures block is called on socket error" do
|
52
|
+
subject.socket.stub(:send) { raise SocketError }
|
53
|
+
|
54
|
+
proc { subject.register(:bucket => 'data.bin', :value => 1, :type => :gauge, :sample_rate => 1) { sleep 0.01 } }.should_not raise_error
|
55
|
+
proc { subject.register(:bucket => 'data.bin', :value => 1, :type => :gauge, :sample_rate => 1) { sleep 0.01 } }.should_not raise_error
|
56
|
+
end
|
57
|
+
|
58
|
+
it "raises Timeout on slow lookup" do
|
59
|
+
Fozzie.c.timeout = 0.01
|
60
|
+
subject.socket.stub(:send).with(any_args) { sleep 0.4 }
|
61
|
+
|
62
|
+
subject.register(:bucket => 'data.bin', :value => 1, :type => :gauge, :sample_rate => 1).should eq false
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "multiple stats in a single call" do
|
66
|
+
|
67
|
+
it "collects stats together with delimeter" do
|
68
|
+
Fozzie.c.disable_prefix
|
69
|
+
|
70
|
+
stats = [
|
71
|
+
{ :bucket => 'foo', :value => 1, :type => :count, :sample_rate => 1 },
|
72
|
+
{ :bucket => 'bar', :value => 1, :type => :gauge, :sample_rate => 1 },
|
73
|
+
{ :bucket => %w{foo bar}, :value => 100, :type => :timing, :sample_rate => 1 }
|
74
|
+
]
|
75
|
+
|
76
|
+
subject.should_receive(:send_to_socket).with "foo:1|c\nbar:1|g\nfoo.bar:100|ms"
|
77
|
+
|
78
|
+
subject.register(stats)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -1,125 +1,125 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'resolv'
|
3
|
-
|
4
|
-
describe Fozzie::Configuration do
|
5
|
-
it "#host" do
|
6
|
-
subject.host.should be_kind_of(String)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "#port" do
|
10
|
-
subject.port.should be_kind_of(Fixnum)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "attempts to load configuration from yaml" do
|
14
|
-
c = Fozzie::Configuration.new({
|
15
|
-
env: 'test',
|
16
|
-
config_path: 'spec/',
|
17
|
-
adapter: :TestAdapter
|
18
|
-
})
|
19
|
-
c.stub(:origin_name => "")
|
20
|
-
c.host.should eq '1.1.1.1'
|
21
|
-
c.port.should eq 9876
|
22
|
-
c.appname.should eq 'fozzie'
|
23
|
-
c.data_prefix.should eq "fozzie#{c.safe_separator}test"
|
24
|
-
end
|
25
|
-
|
26
|
-
it "defaults env" do
|
27
|
-
subject.env.should eq 'test'
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "#adapter" do
|
31
|
-
it "throw error on incorrect assignment" do
|
32
|
-
-> { Fozzie::Configuration.new({:env => 'test', :adapter => 'foo'}) }.should raise_error(Fozzie::AdapterMissing)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "defaults adapter to Statsd" do
|
36
|
-
subject.adapter.should be_kind_of(Fozzie::Adapter::Statsd)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe "#disable_prefix" do
|
41
|
-
it "sets the data_prefix to nil" do
|
42
|
-
subject.disable_prefix
|
43
|
-
subject.data_prefix.should be_nil
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "#prefix and #data_prefix" do
|
48
|
-
it "creates a #data_prefix" do
|
49
|
-
subject.stub(:origin_name => "")
|
50
|
-
subject.data_prefix.should eq 'test'
|
51
|
-
end
|
52
|
-
|
53
|
-
it "creates a #data_prefix with appname when set" do
|
54
|
-
subject.stub(:origin_name => "")
|
55
|
-
subject.appname = 'astoria'
|
56
|
-
subject.data_prefix.should eq 'astoria.test'
|
57
|
-
end
|
58
|
-
|
59
|
-
it "creates a #data_prefix with origin" do
|
60
|
-
subject.appname = 'astoria'
|
61
|
-
subject.data_prefix.should match /^astoria\.(\S+)\.test$/
|
62
|
-
end
|
63
|
-
|
64
|
-
it "allows dynamic assignment of #prefix to derive #data_prefix" do
|
65
|
-
subject.prefix = [:foo, :bar, :car]
|
66
|
-
subject.data_prefix.should eq 'foo.bar.car'
|
67
|
-
end
|
68
|
-
|
69
|
-
it "allows dynamic injection of value to prefix" do
|
70
|
-
subject.stub(:origin_name => "")
|
71
|
-
subject.prefix << 'git-sha-1234'
|
72
|
-
subject.data_prefix.should eq 'test.git-sha-1234'
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
it "handles missing configuration namespace" do
|
77
|
-
proc { Fozzie::Configuration.new({:env => 'blbala', :config_path => 'spec/'}) }.should_not raise_error
|
78
|
-
end
|
79
|
-
|
80
|
-
it "#namespaces" do
|
81
|
-
subject.namespaces.should be_kind_of(Array)
|
82
|
-
subject.namespaces.should include("Stats")
|
83
|
-
subject.namespaces.should include("S")
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "#sniff?" do
|
87
|
-
it "defaults to false for testing" do
|
88
|
-
subject.stub(:env => "test")
|
89
|
-
subject.sniff?.should
|
90
|
-
end
|
91
|
-
|
92
|
-
it "defaults true when in development" do
|
93
|
-
subject.stub(:env => "development")
|
94
|
-
subject.sniff?.should
|
95
|
-
end
|
96
|
-
|
97
|
-
it "defaults true when in production" do
|
98
|
-
subject.stub(:env => "production")
|
99
|
-
subject.sniff?.should
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
describe "#sniff_envs allows configuration for #sniff?" do
|
104
|
-
let!(:sniff_envs) { subject.stub(:sniff_envs => ['test']) }
|
105
|
-
|
106
|
-
it "scopes to return false" do
|
107
|
-
subject.stub(:env => "development")
|
108
|
-
subject.sniff?.should
|
109
|
-
end
|
110
|
-
|
111
|
-
it "scopes to return true" do
|
112
|
-
subject.stub(:env => "test")
|
113
|
-
subject.sniff?.should
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
117
|
-
|
118
|
-
describe "ignoring prefix" do
|
119
|
-
it "does not use prefix when set to ignore" do
|
120
|
-
subject.disable_prefix
|
121
|
-
subject.ignore_prefix.should eq(true)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
end
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'resolv'
|
3
|
+
|
4
|
+
describe Fozzie::Configuration do
|
5
|
+
it "#host" do
|
6
|
+
subject.host.should be_kind_of(String)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "#port" do
|
10
|
+
subject.port.should be_kind_of(Fixnum)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "attempts to load configuration from yaml" do
|
14
|
+
c = Fozzie::Configuration.new({
|
15
|
+
env: 'test',
|
16
|
+
config_path: 'spec/',
|
17
|
+
adapter: :TestAdapter
|
18
|
+
})
|
19
|
+
c.stub(:origin_name => "")
|
20
|
+
c.host.should eq '1.1.1.1'
|
21
|
+
c.port.should eq 9876
|
22
|
+
c.appname.should eq 'fozzie'
|
23
|
+
c.data_prefix.should eq "fozzie#{c.safe_separator}test"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "defaults env" do
|
27
|
+
subject.env.should eq 'test'
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#adapter" do
|
31
|
+
it "throw error on incorrect assignment" do
|
32
|
+
-> { Fozzie::Configuration.new({:env => 'test', :adapter => 'foo'}) }.should raise_error(Fozzie::AdapterMissing)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "defaults adapter to Statsd" do
|
36
|
+
subject.adapter.should be_kind_of(Fozzie::Adapter::Statsd)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#disable_prefix" do
|
41
|
+
it "sets the data_prefix to nil" do
|
42
|
+
subject.disable_prefix
|
43
|
+
subject.data_prefix.should be_nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#prefix and #data_prefix" do
|
48
|
+
it "creates a #data_prefix" do
|
49
|
+
subject.stub(:origin_name => "")
|
50
|
+
subject.data_prefix.should eq 'test'
|
51
|
+
end
|
52
|
+
|
53
|
+
it "creates a #data_prefix with appname when set" do
|
54
|
+
subject.stub(:origin_name => "")
|
55
|
+
subject.appname = 'astoria'
|
56
|
+
subject.data_prefix.should eq 'astoria.test'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "creates a #data_prefix with origin" do
|
60
|
+
subject.appname = 'astoria'
|
61
|
+
subject.data_prefix.should match /^astoria\.(\S+)\.test$/
|
62
|
+
end
|
63
|
+
|
64
|
+
it "allows dynamic assignment of #prefix to derive #data_prefix" do
|
65
|
+
subject.prefix = [:foo, :bar, :car]
|
66
|
+
subject.data_prefix.should eq 'foo.bar.car'
|
67
|
+
end
|
68
|
+
|
69
|
+
it "allows dynamic injection of value to prefix" do
|
70
|
+
subject.stub(:origin_name => "")
|
71
|
+
subject.prefix << 'git-sha-1234'
|
72
|
+
subject.data_prefix.should eq 'test.git-sha-1234'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it "handles missing configuration namespace" do
|
77
|
+
proc { Fozzie::Configuration.new({:env => 'blbala', :config_path => 'spec/'}) }.should_not raise_error
|
78
|
+
end
|
79
|
+
|
80
|
+
it "#namespaces" do
|
81
|
+
subject.namespaces.should be_kind_of(Array)
|
82
|
+
subject.namespaces.should include("Stats")
|
83
|
+
subject.namespaces.should include("S")
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#sniff?" do
|
87
|
+
it "defaults to false for testing" do
|
88
|
+
subject.stub(:env => "test")
|
89
|
+
subject.sniff?.should be false
|
90
|
+
end
|
91
|
+
|
92
|
+
it "defaults true when in development" do
|
93
|
+
subject.stub(:env => "development")
|
94
|
+
subject.sniff?.should be true
|
95
|
+
end
|
96
|
+
|
97
|
+
it "defaults true when in production" do
|
98
|
+
subject.stub(:env => "production")
|
99
|
+
subject.sniff?.should be true
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#sniff_envs allows configuration for #sniff?" do
|
104
|
+
let!(:sniff_envs) { subject.stub(:sniff_envs => ['test']) }
|
105
|
+
|
106
|
+
it "scopes to return false" do
|
107
|
+
subject.stub(:env => "development")
|
108
|
+
subject.sniff?.should be false
|
109
|
+
end
|
110
|
+
|
111
|
+
it "scopes to return true" do
|
112
|
+
subject.stub(:env => "test")
|
113
|
+
subject.sniff?.should be true
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "ignoring prefix" do
|
119
|
+
it "does not use prefix when set to ignore" do
|
120
|
+
subject.disable_prefix
|
121
|
+
subject.ignore_prefix.should eq(true)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|