counters 1.3.0 → 1.3.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/lib/counters/base.rb +1 -1
- data/lib/counters/version.rb +1 -1
- data/spec/file_counter_spec.rb +15 -15
- data/spec/memory_counter_spec.rb +31 -31
- data/spec/redis_counter_spec.rb +18 -18
- data/spec/spec_helper.rb +36 -15
- data/spec/statsd_counter_spec.rb +15 -15
- metadata +2 -2
data/lib/counters/base.rb
CHANGED
data/lib/counters/version.rb
CHANGED
data/spec/file_counter_spec.rb
CHANGED
@@ -89,7 +89,7 @@ describe Counters::File do
|
|
89
89
|
Tempfile.new("counters.log")
|
90
90
|
end
|
91
91
|
|
92
|
-
|
92
|
+
subject do
|
93
93
|
Counters::File.new(tempfile)
|
94
94
|
end
|
95
95
|
|
@@ -104,60 +104,60 @@ describe Counters::File do
|
|
104
104
|
|
105
105
|
context "given the counter is namespaced" do
|
106
106
|
it "should namespace the key from #hit" do
|
107
|
-
|
108
|
-
|
107
|
+
subject.namespace = "juice"
|
108
|
+
subject.hit "foxglove"
|
109
109
|
tempfile.rewind
|
110
110
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\shit:\sjuice\.foxglove$/
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should namespace the key from #latency" do
|
114
|
-
|
115
|
-
|
114
|
+
subject.namespace = "cocktail"
|
115
|
+
subject.latency "angelica", 200
|
116
116
|
tempfile.rewind
|
117
117
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\slatency:\scocktail\.angelica\s200s$/
|
118
118
|
end
|
119
119
|
|
120
120
|
it "should namespace the key from #magnitude" do
|
121
|
-
|
122
|
-
|
121
|
+
subject.namespace = "brew"
|
122
|
+
subject.magnitude "crocus", 100
|
123
123
|
tempfile.rewind
|
124
124
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\smagnitude:\sbrew\.crocus 100$/
|
125
125
|
end
|
126
126
|
|
127
127
|
it "should namespace the key from #ping" do
|
128
|
-
|
129
|
-
|
128
|
+
subject.namespace = "beer"
|
129
|
+
subject.ping "tulip"
|
130
130
|
tempfile.rewind
|
131
131
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\sping:\sbeer\.tulip$/
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
135
|
it "should log a message to the logfile when a hit is recorded" do
|
136
|
-
|
136
|
+
subject.hit "urls.visited"
|
137
137
|
tempfile.rewind
|
138
138
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\shit.*urls\.visited$/
|
139
139
|
end
|
140
140
|
|
141
141
|
it "should log a message to the logfile when a magnitude is recorded" do
|
142
|
-
|
142
|
+
subject.magnitude "bytes.read", 2_013
|
143
143
|
tempfile.rewind
|
144
144
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\smagnitude.*bytes\.read.*2013$/
|
145
145
|
end
|
146
146
|
|
147
147
|
it "should log a message to the logfile when a latency is recorded" do
|
148
|
-
|
148
|
+
subject.latency "processing", 0.132 # in seconds
|
149
149
|
tempfile.rewind
|
150
150
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\slatency.*processing.*0.132s$/
|
151
151
|
end
|
152
152
|
|
153
153
|
it "should record a message in the logfile when a ping is recorded" do
|
154
|
-
|
154
|
+
subject.ping "crawler.alive"
|
155
155
|
tempfile.rewind
|
156
156
|
tempfile.read.should =~ /^#{TIMESTAMP_RE}\s-\sping.*crawler\.alive$/
|
157
157
|
end
|
158
158
|
|
159
159
|
it "should log a message to the logfile when a latency is recorded using a block" do
|
160
|
-
|
160
|
+
subject.latency "crawling" do
|
161
161
|
sleep 0.1
|
162
162
|
end
|
163
163
|
|
@@ -166,7 +166,7 @@ describe Counters::File do
|
|
166
166
|
end
|
167
167
|
|
168
168
|
it "should raise an ArgumentError when calling #latency with both a block and a latency" do
|
169
|
-
lambda {
|
169
|
+
lambda { subject.latency("processing", 0.123) { sleep 0.1 } }.should raise_error(ArgumentError)
|
170
170
|
end
|
171
171
|
|
172
172
|
it "should accept a filename on instantiation" do
|
data/spec/memory_counter_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Counters::Memory do
|
4
|
-
|
4
|
+
subject do
|
5
5
|
Counters::Memory.new
|
6
6
|
end
|
7
7
|
|
@@ -16,67 +16,67 @@ describe Counters::Memory do
|
|
16
16
|
|
17
17
|
context "given the counter is namespaced" do
|
18
18
|
it "should namespace the key from #hit" do
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
subject.namespace = "juice"
|
20
|
+
subject.hit "foxglove"
|
21
|
+
subject.hits["juice.foxglove"].should == 1
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should namespace the key from #latency" do
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
subject.namespace = "cocktail"
|
26
|
+
subject.latency "angelica", 200
|
27
|
+
subject.latencies["cocktail.angelica"].should == [200]
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should namespace the key from #magnitude" do
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
subject.namespace = "brew"
|
32
|
+
subject.magnitude "crocus", 100
|
33
|
+
subject.magnitudes["brew.crocus"].should == 100
|
34
34
|
end
|
35
35
|
|
36
36
|
it "should namespace the key from #ping" do
|
37
|
-
|
37
|
+
subject.namespace = "beer"
|
38
38
|
Timecop.freeze(Time.now.utc) do
|
39
|
-
|
40
|
-
|
39
|
+
subject.ping "tulip"
|
40
|
+
subject.pings["beer.tulip"].should == Time.now.utc
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should record a hit with key 'pages.read'" do
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
subject.hit "pages.read"
|
47
|
+
subject.hits.should have_key("pages.read")
|
48
|
+
subject.hits["pages.read"].should == 1
|
49
49
|
|
50
|
-
|
51
|
-
|
50
|
+
subject.hit "pages.read"
|
51
|
+
subject.hits["pages.read"].should == 2
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should record a ping with key 'processor.alive'" do
|
55
55
|
Timecop.freeze do
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
subject.ping "processor.alive"
|
57
|
+
subject.pings.should have_key("processor.alive")
|
58
|
+
subject.pings["processor.alive"].strftime("%Y-%m-%d %H:%M:%S").should == Time.now.utc.strftime("%Y-%m-%d %H:%M:%S")
|
59
59
|
end
|
60
60
|
|
61
61
|
target_time = Time.now + 9
|
62
62
|
Timecop.travel(target_time) do
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
subject.ping "processor.alive"
|
64
|
+
subject.pings.should have_key("processor.alive")
|
65
|
+
subject.pings["processor.alive"].strftime("%Y-%m-%d %H:%M:%S").should == target_time.utc.strftime("%Y-%m-%d %H:%M:%S")
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should record a latency with a passed value" do
|
70
|
-
|
71
|
-
|
70
|
+
subject.latency "processor.enqueue", 0.00012
|
71
|
+
subject.latencies["processor.enqueue"].should == [0.00012]
|
72
72
|
|
73
|
-
|
74
|
-
|
73
|
+
subject.latency "processor.enqueue", 0.00121
|
74
|
+
subject.latencies["processor.enqueue"].should == [0.00012, 0.00121]
|
75
75
|
end
|
76
76
|
|
77
77
|
it "should record a magnitude" do
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
subject.magnitude "processor.bytes_compressed", 9_312
|
79
|
+
subject.magnitude "processor.bytes_compressed", 8_271
|
80
|
+
subject.magnitudes["processor.bytes_compressed"].should == 8_271
|
81
81
|
end
|
82
82
|
end
|
data/spec/redis_counter_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Counters::Redis, "integration tests" do
|
|
6
6
|
::Redis.new
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
subject do
|
10
10
|
Counters::Redis.new(redis, :base_key => "counters")
|
11
11
|
end
|
12
12
|
|
@@ -25,40 +25,40 @@ describe Counters::Redis, "integration tests" do
|
|
25
25
|
|
26
26
|
context "given the counter is namespaced" do
|
27
27
|
it "should namespace the key from #hit" do
|
28
|
-
|
29
|
-
|
28
|
+
subject.namespace = "juice"
|
29
|
+
subject.hit "foxglove"
|
30
30
|
redis.hget("counters", "hits.juice.foxglove").should == "1"
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should namespace the key from #latency" do
|
34
|
-
|
35
|
-
|
34
|
+
subject.namespace = "cocktail"
|
35
|
+
subject.latency "angelica", 200
|
36
36
|
redis.hget("counters", "latencies.cocktail.angelica.nanoseconds").should == (200 * Counters::Redis::SCALING_FACTOR).to_s
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should namespace the key from #magnitude" do
|
40
|
-
|
41
|
-
|
40
|
+
subject.namespace = "brew"
|
41
|
+
subject.magnitude "crocus", 100
|
42
42
|
redis.hget("counters", "magnitudes.brew.crocus.value").should == "100"
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should namespace the key from #ping" do
|
46
|
-
|
46
|
+
subject.namespace = "beer"
|
47
47
|
Timecop.freeze(Time.now.utc) do
|
48
|
-
|
48
|
+
subject.ping "tulip"
|
49
49
|
redis.hget("counters", "pings.beer.tulip").should == Time.now.utc.to_i.to_s
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should record 2 hits on 'pages.read'" do
|
55
|
-
2.times {
|
55
|
+
2.times { subject.hit "pages.read" }
|
56
56
|
redis.hkeys("counters").should == ["hits.pages.read"]
|
57
57
|
redis.hget("counters", "hits.pages.read").to_i.should == 2
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should record magnitude using a signed 64 bit 'value' and a 'count'" do
|
61
|
-
4.times {
|
61
|
+
4.times { subject.magnitude "bytes.in", 2_047 }
|
62
62
|
redis.hkeys("counters").sort.should == %w(magnitudes.bytes.in.value magnitudes.bytes.in.count).sort
|
63
63
|
|
64
64
|
redis.hget("counters", "magnitudes.bytes.in.count").to_i.should == 4
|
@@ -66,8 +66,8 @@ describe Counters::Redis, "integration tests" do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
it "does not detect 63 bit integer overflow" do
|
69
|
-
|
70
|
-
|
69
|
+
subject.magnitude "bytes.in", 2**63 - 20
|
70
|
+
subject.magnitude "bytes.in", 2_047
|
71
71
|
|
72
72
|
target_value = (2**63 - 20) + 2_047
|
73
73
|
|
@@ -78,29 +78,29 @@ describe Counters::Redis, "integration tests" do
|
|
78
78
|
it "should record a ping on 'crawler' by HSET counters/pings.crawler with today's date/time as an int" do
|
79
79
|
now = Time.now
|
80
80
|
Timecop.freeze(now) do
|
81
|
-
|
81
|
+
subject.ping "crawler"
|
82
82
|
end
|
83
83
|
|
84
84
|
redis.hget("counters", "pings.crawler").should == now.to_i.to_s
|
85
85
|
|
86
86
|
target_time = Time.now + 9
|
87
87
|
Timecop.travel(target_time) do
|
88
|
-
|
88
|
+
subject.ping "crawler"
|
89
89
|
end
|
90
90
|
|
91
91
|
redis.hget("counters", "pings.crawler").should == target_time.to_i.to_s
|
92
92
|
end
|
93
93
|
|
94
94
|
it "should record latency on 'crawler.download' by HINCRBY counters/latencies.crawler.download.count by 1 and counters/latencies.crawler.download.nanoseconds by the latency" do
|
95
|
-
|
96
|
-
|
95
|
+
subject.latency "crawler.download", 1.9
|
96
|
+
subject.latency "crawler.download", 2.02
|
97
97
|
|
98
98
|
redis.hget("counters", "latencies.crawler.download.count").to_i.should == 2
|
99
99
|
redis.hget("counters", "latencies.crawler.download.nanoseconds").to_i.should == (2.02 + 1.90) * ONE_NANOSECOND
|
100
100
|
end
|
101
101
|
|
102
102
|
it "should record a block's latency" do
|
103
|
-
|
103
|
+
subject.latency "crawler.process" do
|
104
104
|
sleep 0.2
|
105
105
|
end
|
106
106
|
|
data/spec/spec_helper.rb
CHANGED
@@ -9,29 +9,29 @@ end
|
|
9
9
|
|
10
10
|
shared_examples_for "all counters" do
|
11
11
|
it "should raise a ArgumentError when the key includes invalid chars" do
|
12
|
-
lambda {
|
13
|
-
lambda {
|
14
|
-
lambda {
|
15
|
-
lambda {
|
16
|
-
lambda {
|
17
|
-
lambda {
|
18
|
-
lambda {
|
12
|
+
lambda { subject.hit "hit!" }.should raise_error(ArgumentError)
|
13
|
+
lambda { subject.hit "hit counter" }.should raise_error(ArgumentError)
|
14
|
+
lambda { subject.hit "boy.hit?" }.should raise_error(ArgumentError)
|
15
|
+
lambda { subject.hit "hit/a" }.should raise_error(ArgumentError)
|
16
|
+
lambda { subject.hit "hit-a" }.should raise_error(ArgumentError)
|
17
|
+
lambda { subject.hit "" }.should raise_error(ArgumentError)
|
18
|
+
lambda { subject.hit nil }.should raise_error(ArgumentError)
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should not raise ArgumentError when the key includes a number" do
|
22
|
-
lambda {
|
22
|
+
lambda { subject.hit "hit1" }.should_not raise_error(ArgumentError)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should not raise ArgumentError when the key includes a dot / fullstop" do
|
26
|
-
lambda {
|
26
|
+
lambda { subject.hit "hit." }.should_not raise_error(ArgumentError)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should not raise ArgumentError when the key includes an underscore" do
|
30
|
-
lambda {
|
30
|
+
lambda { subject.hit "hit_" }.should_not raise_error(ArgumentError)
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should return the latency block's value" do
|
34
|
-
value =
|
34
|
+
value = subject.latency "process" do
|
35
35
|
"the returned value"
|
36
36
|
end
|
37
37
|
|
@@ -39,11 +39,32 @@ shared_examples_for "all counters" do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should allow hitting with a specific value increment" do
|
42
|
-
lambda {
|
42
|
+
lambda { subject.hit "tada", 17 }.should_not raise_error
|
43
43
|
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
context "given a non-namespaced counter" do
|
46
|
+
before(:each) do
|
47
|
+
subject.namespace = nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return a sub-namespaced counter on-demand" do
|
51
|
+
subject.namespace.to_s.should be_empty
|
52
|
+
|
53
|
+
other = subject.namespace("sub")
|
54
|
+
other.namespace.should == "sub"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when the counter is namespaced" do
|
59
|
+
before(:each) do
|
60
|
+
subject.namespace = "origin"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should return a namespaced counter on-demand" do
|
64
|
+
subject.namespace.to_s.should_not be_empty
|
65
|
+
|
66
|
+
other = subject.namespace("sub")
|
67
|
+
other.namespace.should == "#{subject.namespace}.sub"
|
68
|
+
end
|
48
69
|
end
|
49
70
|
end
|
data/spec/statsd_counter_spec.rb
CHANGED
@@ -27,7 +27,7 @@ describe Counters::StatsD do
|
|
27
27
|
8125
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
subject do
|
31
31
|
Counters::StatsD.new(host, port, :socket => socket)
|
32
32
|
end
|
33
33
|
|
@@ -41,22 +41,22 @@ describe Counters::StatsD do
|
|
41
41
|
|
42
42
|
it "should record a hit as an increment of the key" do
|
43
43
|
socket.should_receive(:send).with("hits.tweets_received:1|c", 0, host, port)
|
44
|
-
|
44
|
+
subject.hit "tweets_received"
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should record a magnitude as a timer" do
|
48
48
|
socket.should_receive(:send).with("magnitudes.bytes_in:381|ms", 0, host, port)
|
49
|
-
|
49
|
+
subject.magnitude "bytes_in", 381
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should record a latency as a timer" do
|
53
53
|
socket.should_receive(:send).with("latencies.json_parsing:9|ms", 0, host, port)
|
54
|
-
|
54
|
+
subject.latency "json_parsing", 0.009
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should record a ping as a counter" do
|
58
58
|
socket.should_receive(:send).with("pings.tweet_processor:1|c", 0, host, port)
|
59
|
-
|
59
|
+
subject.ping "tweet_processor"
|
60
60
|
end
|
61
61
|
|
62
62
|
context "#initialize" do
|
@@ -68,33 +68,33 @@ describe Counters::StatsD do
|
|
68
68
|
|
69
69
|
context "given the counter is namespaced" do
|
70
70
|
it "should namespace the key from #hit" do
|
71
|
-
|
71
|
+
subject.namespace = "juice"
|
72
72
|
socket.should_receive(:send).with(/^hits\.juice\.foxglove\b/, anything, anything, anything)
|
73
|
-
|
73
|
+
subject.hit "foxglove"
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should namespace the key from #latency" do
|
77
|
-
|
77
|
+
subject.namespace = "cocktail"
|
78
78
|
socket.should_receive(:send).with(/^latencies\.cocktail\.angelica\b/, anything, anything, anything)
|
79
|
-
|
79
|
+
subject.latency "angelica", 200
|
80
80
|
end
|
81
81
|
|
82
82
|
it "should namespace the key from #magnitude" do
|
83
|
-
|
83
|
+
subject.namespace = "brew"
|
84
84
|
socket.should_receive(:send).with(/^magnitudes\.brew\.crocus\b/, anything, anything, anything)
|
85
|
-
|
85
|
+
subject.magnitude "crocus", 100
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should namespace the key from #ping" do
|
89
|
-
|
89
|
+
subject.namespace = "beer"
|
90
90
|
socket.should_receive(:send).with(/^pings\.beer\.tulip\b/, anything, anything, anything)
|
91
|
-
|
91
|
+
subject.ping "tulip"
|
92
92
|
end
|
93
93
|
|
94
94
|
it "should increment with the #hit value" do
|
95
|
-
|
95
|
+
subject.namespace = "pow"
|
96
96
|
socket.should_receive(:send).with(/^hits\.pow\.loudness:17\b/, anything, anything, anything)
|
97
|
-
|
97
|
+
subject.hit "loudness", 17
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: counters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.3.
|
5
|
+
version: 1.3.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- "Fran\xC3\xA7ois Beausoleil"
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-03 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|