statsd-ruby 0.3.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +43 -0
- data/.travis.yml +6 -0
- data/Gemfile +2 -0
- data/README.rdoc +19 -4
- data/Rakefile +4 -28
- data/lib/statsd.rb +91 -34
- data/spec/helper.rb +4 -3
- data/spec/statsd_spec.rb +111 -32
- data/statsd-ruby.gemspec +17 -49
- metadata +40 -38
- data/VERSION +0 -1
data/.gitignore
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# simplecov generated
|
2
|
+
coverage
|
3
|
+
|
4
|
+
# rdoc generated
|
5
|
+
rdoc
|
6
|
+
|
7
|
+
# yard generated
|
8
|
+
doc
|
9
|
+
.yardoc
|
10
|
+
|
11
|
+
# bundler
|
12
|
+
.bundle
|
13
|
+
Gemfile.lock
|
14
|
+
|
15
|
+
# jeweler generated
|
16
|
+
pkg
|
17
|
+
|
18
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
19
|
+
#
|
20
|
+
# * Create a file at ~/.gitignore
|
21
|
+
# * Include files you want ignored
|
22
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
23
|
+
#
|
24
|
+
# After doing this, these files will be ignored in all your git projects,
|
25
|
+
# saving you from having to 'pollute' every project you touch with them
|
26
|
+
#
|
27
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
28
|
+
#
|
29
|
+
# For MacOS:
|
30
|
+
#
|
31
|
+
#.DS_Store
|
32
|
+
#
|
33
|
+
# For TextMate
|
34
|
+
#*.tmproj
|
35
|
+
#tmtags
|
36
|
+
#
|
37
|
+
# For emacs:
|
38
|
+
#*~
|
39
|
+
#\#*
|
40
|
+
#.\#*
|
41
|
+
#
|
42
|
+
# For vim:
|
43
|
+
#*.swp
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.rdoc
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
= statsd
|
1
|
+
= statsd-ruby {<img src="https://secure.travis-ci.org/reinh/statsd-ruby.png" />}[http://travis-ci.org/reinh/statsd-ruby]
|
2
2
|
|
3
|
-
A Ruby
|
3
|
+
A Ruby client for {StatsD}[https://github.com/etsy/statsd]
|
4
|
+
|
5
|
+
= Installing
|
6
|
+
|
7
|
+
Bundler:
|
8
|
+
gem "statsd-ruby", :require => "statsd"
|
4
9
|
|
5
10
|
= Testing
|
6
11
|
|
@@ -8,6 +13,10 @@ Run the specs with <tt>rake spec</tt>
|
|
8
13
|
|
9
14
|
Run the specs and include live integration specs with <tt>LIVE=true rake spec</tt>. Note: This will test over a real UDP socket.
|
10
15
|
|
16
|
+
= Performance
|
17
|
+
|
18
|
+
* A short note about DNS: If you use a dns name for the host option, then you will want to use a local caching dns service for optimial performance (e.g. nscd).
|
19
|
+
|
11
20
|
== Contributing to statsd
|
12
21
|
|
13
22
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
@@ -22,8 +31,14 @@ Run the specs and include live integration specs with <tt>LIVE=true rake spec</t
|
|
22
31
|
|
23
32
|
* Rein Henrichs
|
24
33
|
* Ray Krueger
|
34
|
+
* Jeremy Kemper
|
35
|
+
* Ryan Tomayko
|
36
|
+
* Gabriel Burt
|
37
|
+
* Rick Olson
|
38
|
+
* Trae Robrock
|
39
|
+
* Corey Donohoe
|
40
|
+
* James Tucker
|
25
41
|
|
26
42
|
== Copyright
|
27
43
|
|
28
|
-
Copyright (c) 2011 Rein Henrichs. See LICENSE.txt for
|
29
|
-
further details.
|
44
|
+
Copyright (c) 2011 Rein Henrichs. See LICENSE.txt for further details.
|
data/Rakefile
CHANGED
@@ -1,39 +1,15 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'bundler/gem_tasks'
|
3
3
|
|
4
|
-
|
5
|
-
Jeweler::Tasks.new do |gem|
|
6
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
7
|
-
gem.name = "statsd-ruby"
|
8
|
-
gem.homepage = "http://github.com/reinh/statsd"
|
9
|
-
gem.license = "MIT"
|
10
|
-
gem.summary = %Q{A Statsd client in Ruby}
|
11
|
-
gem.description = %Q{A Statsd client in Ruby}
|
12
|
-
gem.email = "rein@phpfog.com"
|
13
|
-
gem.authors = ["Rein Henrichs"]
|
14
|
-
gem.add_development_dependency "minitest", ">= 0"
|
15
|
-
gem.add_development_dependency "yard", "~> 0.6.0"
|
16
|
-
gem.add_development_dependency "jeweler", "~> 1.5.2"
|
17
|
-
gem.add_development_dependency "rcov", ">= 0"
|
18
|
-
end
|
19
|
-
Jeweler::RubygemsDotOrgTasks.new
|
4
|
+
task :default => :spec
|
20
5
|
|
21
6
|
require 'rake/testtask'
|
22
7
|
Rake::TestTask.new(:spec) do |spec|
|
23
8
|
spec.libs << 'lib' << 'spec'
|
24
9
|
spec.pattern = 'spec/**/*_spec.rb'
|
25
10
|
spec.verbose = true
|
11
|
+
spec.warning = true
|
26
12
|
end
|
27
13
|
|
28
|
-
require 'rcov/rcovtask'
|
29
|
-
Rcov::RcovTask.new do |spec|
|
30
|
-
spec.libs << 'lib' << 'spec'
|
31
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
32
|
-
spec.verbose = true
|
33
|
-
spec.rcov_opts << "--exclude spec,gems"
|
34
|
-
end
|
35
|
-
|
36
|
-
task :default => :spec
|
37
|
-
|
38
14
|
require 'yard'
|
39
15
|
YARD::Rake::YardocTask.new
|
data/lib/statsd.rb
CHANGED
@@ -7,65 +7,118 @@ require 'socket'
|
|
7
7
|
# @example Send some stats
|
8
8
|
# $statsd.increment 'garets'
|
9
9
|
# $statsd.timing 'glork', 320
|
10
|
+
# $statsd.gauge 'bork', 100
|
10
11
|
# @example Use {#time} to time the execution of a block
|
11
12
|
# $statsd.time('account.activate') { @account.activate! }
|
12
13
|
# @example Create a namespaced statsd client and increment 'account.activate'
|
13
14
|
# statsd = Statsd.new('localhost').tap{|sd| sd.namespace = 'account'}
|
14
15
|
# statsd.increment 'activate'
|
16
|
+
#
|
17
|
+
# Statsd instances are thread safe for general usage, by using a thread local
|
18
|
+
# UDPSocket and carrying no state. The attributes are stateful, and are not
|
19
|
+
# mutexed, it is expected that users will not change these at runtime in
|
20
|
+
# threaded environments. If users require such use cases, it is recommend that
|
21
|
+
# users either mutex around their Statsd object, or create separate objects for
|
22
|
+
# each namespace / host+port combination.
|
15
23
|
class Statsd
|
16
24
|
# A namespace to prepend to all statsd calls.
|
17
|
-
|
25
|
+
attr_reader :namespace
|
26
|
+
|
27
|
+
# StatsD host. Defaults to 127.0.0.1.
|
28
|
+
attr_reader :host
|
29
|
+
|
30
|
+
# StatsD port. Defaults to 8125.
|
31
|
+
attr_reader :port
|
18
32
|
|
19
|
-
#characters that will be replaced with _ in stat names
|
20
|
-
RESERVED_CHARS_REGEX = /[\:\|\@]/
|
21
|
-
|
22
33
|
class << self
|
23
|
-
# Set to
|
24
|
-
# stat logging using logger.debug
|
34
|
+
# Set to a standard logger instance to enable debug logging.
|
25
35
|
attr_accessor :logger
|
26
36
|
end
|
27
|
-
|
37
|
+
|
28
38
|
# @param [String] host your statsd host
|
29
39
|
# @param [Integer] port your statsd port
|
30
|
-
def initialize(host, port=8125)
|
31
|
-
|
40
|
+
def initialize(host = '127.0.0.1', port = 8125)
|
41
|
+
self.host, self.port = host, port
|
42
|
+
@prefix = nil
|
32
43
|
end
|
33
44
|
|
34
|
-
#
|
45
|
+
# @attribute [w] namespace
|
46
|
+
# Writes are not thread safe.
|
47
|
+
def namespace=(namespace)
|
48
|
+
@namespace = namespace
|
49
|
+
@prefix = "#{namespace}."
|
50
|
+
end
|
51
|
+
|
52
|
+
# @attribute [w] host
|
53
|
+
# Writes are not thread safe.
|
54
|
+
def host=(host)
|
55
|
+
@host = host || '127.0.0.1'
|
56
|
+
end
|
57
|
+
|
58
|
+
# @attribute [w] port
|
59
|
+
# Writes are not thread safe.
|
60
|
+
def port=(port)
|
61
|
+
@port = port || 8125
|
62
|
+
end
|
63
|
+
|
64
|
+
# Sends an increment (count = 1) for the given stat to the statsd server.
|
35
65
|
#
|
36
|
-
# @param stat
|
37
|
-
# @param sample_rate
|
66
|
+
# @param [String] stat stat name
|
67
|
+
# @param [Numeric] sample_rate sample rate, 1 for always
|
38
68
|
# @see #count
|
39
|
-
def increment(stat, sample_rate=1)
|
69
|
+
def increment(stat, sample_rate=1)
|
70
|
+
count stat, 1, sample_rate
|
71
|
+
end
|
40
72
|
|
41
|
-
# Sends a decrement (count = -1) for the given stat to the statsd server.
|
73
|
+
# Sends a decrement (count = -1) for the given stat to the statsd server.
|
42
74
|
#
|
43
|
-
# @param stat
|
44
|
-
# @param sample_rate
|
75
|
+
# @param [String] stat stat name
|
76
|
+
# @param [Numeric] sample_rate sample rate, 1 for always
|
45
77
|
# @see #count
|
46
|
-
def decrement(stat, sample_rate=1)
|
78
|
+
def decrement(stat, sample_rate=1)
|
79
|
+
count stat, -1, sample_rate
|
80
|
+
end
|
47
81
|
|
48
82
|
# Sends an arbitrary count for the given stat to the statsd server.
|
49
83
|
#
|
50
84
|
# @param [String] stat stat name
|
51
85
|
# @param [Integer] count count
|
52
|
-
# @param [
|
53
|
-
def count(stat, count, sample_rate=1)
|
86
|
+
# @param [Numeric] sample_rate sample rate, 1 for always
|
87
|
+
def count(stat, count, sample_rate=1)
|
88
|
+
send_stats stat, count, :c, sample_rate
|
89
|
+
end
|
90
|
+
|
91
|
+
# Sends an arbitary gauge value for the given stat to the statsd server.
|
92
|
+
#
|
93
|
+
# This is useful for recording things like available disk space,
|
94
|
+
# memory usage, and the like, which have different semantics than
|
95
|
+
# counters.
|
96
|
+
#
|
97
|
+
# @param [String] stat stat name.
|
98
|
+
# @param [Numeric] gauge value.
|
99
|
+
# @param [Numeric] sample_rate sample rate, 1 for always
|
100
|
+
# @example Report the current user count:
|
101
|
+
# $statsd.gauge('user.count', User.count)
|
102
|
+
def gauge(stat, value, sample_rate=1)
|
103
|
+
send_stats stat, value, :g, sample_rate
|
104
|
+
end
|
54
105
|
|
55
106
|
# Sends a timing (in ms) for the given stat to the statsd server. The
|
56
107
|
# sample_rate determines what percentage of the time this report is sent. The
|
57
108
|
# statsd server then uses the sample_rate to correctly track the average
|
58
109
|
# timing for the stat.
|
59
110
|
#
|
60
|
-
# @param stat stat name
|
111
|
+
# @param [String] stat stat name
|
61
112
|
# @param [Integer] ms timing in milliseconds
|
62
|
-
# @param [
|
63
|
-
def timing(stat, ms, sample_rate=1)
|
113
|
+
# @param [Numeric] sample_rate sample rate, 1 for always
|
114
|
+
def timing(stat, ms, sample_rate=1)
|
115
|
+
send_stats stat, ms, :ms, sample_rate
|
116
|
+
end
|
64
117
|
|
65
118
|
# Reports execution time of the provided block using {#timing}.
|
66
119
|
#
|
67
|
-
# @param stat
|
68
|
-
# @param sample_rate
|
120
|
+
# @param [String] stat stat name
|
121
|
+
# @param [Numeric] sample_rate sample rate, 1 for always
|
69
122
|
# @yield The operation to be timed
|
70
123
|
# @see #timing
|
71
124
|
# @example Report the time (in ms) taken to activate an account
|
@@ -79,20 +132,24 @@ class Statsd
|
|
79
132
|
|
80
133
|
private
|
81
134
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
sampled(sample_rate) { send_to_socket("#{prefix}#{stat}:#{delta}|#{type}#{'|@' << sample_rate.to_s if sample_rate < 1}") }
|
135
|
+
def send_stats(stat, delta, type, sample_rate=1)
|
136
|
+
if sample_rate == 1 or rand < sample_rate
|
137
|
+
# Replace Ruby module scoping with '.' and reserved chars (: | @) with underscores.
|
138
|
+
stat = stat.to_s.gsub('::', '.').tr(':|@', '_')
|
139
|
+
rate = "|@#{sample_rate}" unless sample_rate == 1
|
140
|
+
send_to_socket "#{@prefix}#{stat}:#{delta}|#{type}#{rate}"
|
141
|
+
end
|
90
142
|
end
|
91
143
|
|
92
144
|
def send_to_socket(message)
|
93
|
-
self.class.logger.debug {"Statsd: #{message}"} if self.class.logger
|
145
|
+
self.class.logger.debug { "Statsd: #{message}" } if self.class.logger
|
94
146
|
socket.send(message, 0, @host, @port)
|
147
|
+
rescue => boom
|
148
|
+
self.class.logger.error { "Statsd: #{boom.class} #{boom}" } if self.class.logger
|
149
|
+
nil
|
95
150
|
end
|
96
151
|
|
97
|
-
def socket
|
152
|
+
def socket
|
153
|
+
Thread.current[:statsd_socket] ||= UDPSocket.new
|
154
|
+
end
|
98
155
|
end
|
data/spec/helper.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'bundler/setup'
|
2
2
|
require 'minitest/autorun'
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
require 'simplecov'
|
5
|
+
SimpleCov.start
|
6
|
+
|
6
7
|
require 'statsd'
|
7
8
|
require 'logger'
|
8
9
|
|
data/spec/statsd_spec.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
describe Statsd do
|
4
|
+
class Statsd
|
5
|
+
public :socket
|
6
|
+
end
|
7
|
+
|
4
8
|
before do
|
5
9
|
@statsd = Statsd.new('localhost', 1234)
|
6
|
-
|
7
|
-
public :sampled # we need to test this
|
8
|
-
attr_reader :host, :port # we also need to test this
|
9
|
-
def socket; @socket ||= FakeUDPSocket.new end
|
10
|
-
end
|
10
|
+
@socket = Thread.current[:statsd_socket] = FakeUDPSocket.new
|
11
11
|
end
|
12
12
|
|
13
|
-
after {
|
13
|
+
after { Thread.current[:statsd_socket] = nil }
|
14
14
|
|
15
15
|
describe "#initialize" do
|
16
16
|
it "should set the host and port" do
|
@@ -18,22 +18,48 @@ describe Statsd do
|
|
18
18
|
@statsd.port.must_equal 1234
|
19
19
|
end
|
20
20
|
|
21
|
-
it "should default the port to 8125" do
|
22
|
-
Statsd.new
|
21
|
+
it "should default the host to 127.0.0.1 and port to 8125" do
|
22
|
+
statsd = Statsd.new
|
23
|
+
statsd.host.must_equal '127.0.0.1'
|
24
|
+
statsd.port.must_equal 8125
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#host and #port" do
|
29
|
+
it "should set host and port" do
|
30
|
+
@statsd.host = '1.2.3.4'
|
31
|
+
@statsd.port = 5678
|
32
|
+
@statsd.host.must_equal '1.2.3.4'
|
33
|
+
@statsd.port.must_equal 5678
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should not resolve hostnames to IPs" do
|
37
|
+
@statsd.host = 'localhost'
|
38
|
+
@statsd.host.must_equal 'localhost'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should set nil host to default" do
|
42
|
+
@statsd.host = nil
|
43
|
+
@statsd.host.must_equal '127.0.0.1'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should set nil port to default" do
|
47
|
+
@statsd.port = nil
|
48
|
+
@statsd.port.must_equal 8125
|
23
49
|
end
|
24
50
|
end
|
25
51
|
|
26
52
|
describe "#increment" do
|
27
53
|
it "should format the message according to the statsd spec" do
|
28
54
|
@statsd.increment('foobar')
|
29
|
-
@
|
55
|
+
@socket.recv.must_equal ['foobar:1|c']
|
30
56
|
end
|
31
57
|
|
32
58
|
describe "with a sample rate" do
|
33
59
|
before { class << @statsd; def rand; 0; end; end } # ensure delivery
|
34
60
|
it "should format the message according to the statsd spec" do
|
35
61
|
@statsd.increment('foobar', 0.5)
|
36
|
-
@
|
62
|
+
@socket.recv.must_equal ['foobar:1|c|@0.5']
|
37
63
|
end
|
38
64
|
end
|
39
65
|
end
|
@@ -41,14 +67,31 @@ describe Statsd do
|
|
41
67
|
describe "#decrement" do
|
42
68
|
it "should format the message according to the statsd spec" do
|
43
69
|
@statsd.decrement('foobar')
|
44
|
-
@
|
70
|
+
@socket.recv.must_equal ['foobar:-1|c']
|
45
71
|
end
|
46
72
|
|
47
73
|
describe "with a sample rate" do
|
48
74
|
before { class << @statsd; def rand; 0; end; end } # ensure delivery
|
49
75
|
it "should format the message according to the statsd spec" do
|
50
76
|
@statsd.decrement('foobar', 0.5)
|
51
|
-
@
|
77
|
+
@socket.recv.must_equal ['foobar:-1|c|@0.5']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#gauge" do
|
83
|
+
it "should send a message with a 'g' type, per the nearbuy fork" do
|
84
|
+
@statsd.gauge('begrutten-suffusion', 536)
|
85
|
+
@socket.recv.must_equal ['begrutten-suffusion:536|g']
|
86
|
+
@statsd.gauge('begrutten-suffusion', -107.3)
|
87
|
+
@socket.recv.must_equal ['begrutten-suffusion:-107.3|g']
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "with a sample rate" do
|
91
|
+
before { class << @statsd; def rand; 0; end; end } # ensure delivery
|
92
|
+
it "should format the message according to the statsd spec" do
|
93
|
+
@statsd.gauge('begrutten-suffusion', 536, 0.1)
|
94
|
+
@socket.recv.must_equal ['begrutten-suffusion:536|g|@0.1']
|
52
95
|
end
|
53
96
|
end
|
54
97
|
end
|
@@ -56,14 +99,14 @@ describe Statsd do
|
|
56
99
|
describe "#timing" do
|
57
100
|
it "should format the message according to the statsd spec" do
|
58
101
|
@statsd.timing('foobar', 500)
|
59
|
-
@
|
102
|
+
@socket.recv.must_equal ['foobar:500|ms']
|
60
103
|
end
|
61
104
|
|
62
105
|
describe "with a sample rate" do
|
63
106
|
before { class << @statsd; def rand; 0; end; end } # ensure delivery
|
64
107
|
it "should format the message according to the statsd spec" do
|
65
108
|
@statsd.timing('foobar', 500, 0.5)
|
66
|
-
@
|
109
|
+
@socket.recv.must_equal ['foobar:500|ms|@0.5']
|
67
110
|
end
|
68
111
|
end
|
69
112
|
end
|
@@ -71,7 +114,7 @@ describe Statsd do
|
|
71
114
|
describe "#time" do
|
72
115
|
it "should format the message according to the statsd spec" do
|
73
116
|
@statsd.time('foobar') { sleep(0.001); 'test' }
|
74
|
-
@
|
117
|
+
@socket.recv.must_equal ['foobar:1|ms']
|
75
118
|
end
|
76
119
|
|
77
120
|
it "should return the result of the block" do
|
@@ -84,36 +127,40 @@ describe Statsd do
|
|
84
127
|
|
85
128
|
it "should format the message according to the statsd spec" do
|
86
129
|
result = @statsd.time('foobar', 0.5) { sleep(0.001); 'test' }
|
87
|
-
@
|
130
|
+
@socket.recv.must_equal ['foobar:1|ms|@0.5']
|
88
131
|
end
|
89
132
|
end
|
90
133
|
end
|
91
134
|
|
92
135
|
describe "#sampled" do
|
93
136
|
describe "when the sample rate is 1" do
|
94
|
-
|
95
|
-
|
137
|
+
before { class << @statsd; def rand; raise end; end }
|
138
|
+
it "should send" do
|
139
|
+
@statsd.timing('foobar', 500, 1)
|
140
|
+
@socket.recv.must_equal ['foobar:500|ms']
|
96
141
|
end
|
97
142
|
end
|
98
143
|
|
99
144
|
describe "when the sample rate is greater than a random value [0,1]" do
|
100
145
|
before { class << @statsd; def rand; 0; end; end } # ensure delivery
|
101
|
-
it "should
|
102
|
-
@statsd.
|
146
|
+
it "should send" do
|
147
|
+
@statsd.timing('foobar', 500, 0.5)
|
148
|
+
@socket.recv.must_equal ['foobar:500|ms|@0.5']
|
103
149
|
end
|
104
150
|
end
|
105
151
|
|
106
152
|
describe "when the sample rate is less than a random value [0,1]" do
|
107
153
|
before { class << @statsd; def rand; 1; end; end } # ensure no delivery
|
108
|
-
it "should not
|
109
|
-
@statsd.
|
154
|
+
it "should not send" do
|
155
|
+
@statsd.timing('foobar', 500, 0.5).must_equal nil
|
110
156
|
end
|
111
157
|
end
|
112
158
|
|
113
159
|
describe "when the sample rate is equal to a random value [0,1]" do
|
114
|
-
before { class << @statsd; def rand; 0
|
115
|
-
it "should
|
116
|
-
@statsd.
|
160
|
+
before { class << @statsd; def rand; 0; end; end } # ensure delivery
|
161
|
+
it "should send" do
|
162
|
+
@statsd.timing('foobar', 500, 0.5)
|
163
|
+
@socket.recv.must_equal ['foobar:500|ms|@0.5']
|
117
164
|
end
|
118
165
|
end
|
119
166
|
end
|
@@ -123,17 +170,22 @@ describe Statsd do
|
|
123
170
|
|
124
171
|
it "should add namespace to increment" do
|
125
172
|
@statsd.increment('foobar')
|
126
|
-
@
|
173
|
+
@socket.recv.must_equal ['service.foobar:1|c']
|
127
174
|
end
|
128
175
|
|
129
176
|
it "should add namespace to decrement" do
|
130
177
|
@statsd.decrement('foobar')
|
131
|
-
@
|
178
|
+
@socket.recv.must_equal ['service.foobar:-1|c']
|
132
179
|
end
|
133
180
|
|
134
181
|
it "should add namespace to timing" do
|
135
182
|
@statsd.timing('foobar', 500)
|
136
|
-
@
|
183
|
+
@socket.recv.must_equal ['service.foobar:500|ms']
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should add namespace to gauge" do
|
187
|
+
@statsd.gauge('foobar', 500)
|
188
|
+
@socket.recv.must_equal ['service.foobar:500|g']
|
137
189
|
end
|
138
190
|
end
|
139
191
|
|
@@ -156,11 +208,9 @@ describe Statsd do
|
|
156
208
|
|
157
209
|
@log.string.must_be_empty
|
158
210
|
end
|
159
|
-
|
160
211
|
end
|
161
212
|
|
162
213
|
describe "stat names" do
|
163
|
-
|
164
214
|
it "should accept anything as stat" do
|
165
215
|
@statsd.increment(Object, 1)
|
166
216
|
end
|
@@ -169,16 +219,45 @@ describe Statsd do
|
|
169
219
|
class Statsd::SomeClass; end
|
170
220
|
@statsd.increment(Statsd::SomeClass, 1)
|
171
221
|
|
172
|
-
@
|
222
|
+
@socket.recv.must_equal ['Statsd.SomeClass:1|c']
|
173
223
|
end
|
174
224
|
|
175
225
|
it "should replace statsd reserved chars in the stat name" do
|
176
226
|
@statsd.increment('ray@hostname.blah|blah.blah:blah', 1)
|
177
|
-
@
|
227
|
+
@socket.recv.must_equal ['ray_hostname.blah_blah.blah_blah:1|c']
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "handling socket errors" do
|
232
|
+
before do
|
233
|
+
require 'stringio'
|
234
|
+
Statsd.logger = Logger.new(@log = StringIO.new)
|
235
|
+
@socket.instance_eval { def send(*) raise SocketError end }
|
178
236
|
end
|
179
237
|
|
238
|
+
it "should ignore socket errors" do
|
239
|
+
@statsd.increment('foobar').must_equal nil
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should log socket errors" do
|
243
|
+
@statsd.increment('foobar')
|
244
|
+
@log.string.must_match 'Statsd: SocketError'
|
245
|
+
end
|
180
246
|
end
|
181
247
|
|
248
|
+
describe "thread safety" do
|
249
|
+
|
250
|
+
it "should use a thread local socket" do
|
251
|
+
Thread.current[:statsd_socket].must_equal @socket
|
252
|
+
@statsd.send(:socket).must_equal @socket
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should create a new socket when used in a new thread" do
|
256
|
+
sock = @statsd.send(:socket)
|
257
|
+
Thread.new { Thread.current[:statsd_socket].wont_equal sock }.join
|
258
|
+
end
|
259
|
+
|
260
|
+
end
|
182
261
|
end
|
183
262
|
|
184
263
|
describe Statsd do
|
data/statsd-ruby.gemspec
CHANGED
@@ -1,57 +1,25 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
5
2
|
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{statsd-ruby}
|
8
|
-
s.version = "0.3.0"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
3
|
+
Gem::Specification.new("statsd-ruby", "1.0.0") do |s|
|
11
4
|
s.authors = ["Rein Henrichs"]
|
12
|
-
s.
|
13
|
-
|
14
|
-
s.
|
15
|
-
s.
|
16
|
-
"LICENSE.txt",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
"LICENSE.txt",
|
22
|
-
"README.rdoc",
|
23
|
-
"Rakefile",
|
24
|
-
"VERSION",
|
25
|
-
"lib/statsd.rb",
|
26
|
-
"spec/helper.rb",
|
27
|
-
"spec/statsd_spec.rb",
|
28
|
-
"statsd-ruby.gemspec"
|
29
|
-
]
|
30
|
-
s.homepage = %q{http://github.com/reinh/statsd}
|
31
|
-
s.licenses = ["MIT"]
|
32
|
-
s.require_paths = ["lib"]
|
33
|
-
s.rubygems_version = %q{1.3.9.1}
|
34
|
-
s.summary = %q{A Statsd client in Ruby}
|
5
|
+
s.email = "rein@phpfog.com"
|
6
|
+
|
7
|
+
s.summary = "A Ruby StatsD client"
|
8
|
+
s.description = "A Ruby StatsD client (https://github.com/etsy/statsd)"
|
35
9
|
|
36
|
-
|
37
|
-
|
10
|
+
s.homepage = "https://github.com/reinh/statsd-ruby"
|
11
|
+
s.licenses = %w[MIT]
|
38
12
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
else
|
45
|
-
s.add_dependency(%q<minitest>, [">= 0"])
|
46
|
-
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
47
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
48
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
49
|
-
end
|
50
|
-
else
|
51
|
-
s.add_dependency(%q<minitest>, [">= 0"])
|
52
|
-
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
53
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
54
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
13
|
+
s.extra_rdoc_files = %w[LICENSE.txt README.rdoc]
|
14
|
+
|
15
|
+
if $0 =~ /gem/ # If running under rubygems (building), otherwise, just leave
|
16
|
+
s.files = `git ls-files`.split($\)
|
17
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
55
18
|
end
|
19
|
+
|
20
|
+
s.add_development_dependency "minitest", ">= 3.2.0"
|
21
|
+
s.add_development_dependency "yard"
|
22
|
+
s.add_development_dependency "simplecov", ">= 0.6.4"
|
23
|
+
s.add_development_dependency "rake"
|
56
24
|
end
|
57
25
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statsd-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Rein Henrichs
|
@@ -15,59 +15,57 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
18
|
+
date: 2012-07-02 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
name: minitest
|
23
21
|
prerelease: false
|
24
|
-
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
23
|
none: false
|
26
24
|
requirements:
|
27
25
|
- - ">="
|
28
26
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
27
|
+
hash: 15
|
30
28
|
segments:
|
29
|
+
- 3
|
30
|
+
- 2
|
31
31
|
- 0
|
32
|
-
version:
|
32
|
+
version: 3.2.0
|
33
|
+
requirement: *id001
|
34
|
+
name: minitest
|
33
35
|
type: :development
|
34
|
-
version_requirements: *id001
|
35
36
|
- !ruby/object:Gem::Dependency
|
36
|
-
name: yard
|
37
37
|
prerelease: false
|
38
|
-
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
43
|
+
hash: 3
|
44
44
|
segments:
|
45
45
|
- 0
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
version: "0"
|
47
|
+
requirement: *id002
|
48
|
+
name: yard
|
49
49
|
type: :development
|
50
|
-
version_requirements: *id002
|
51
50
|
- !ruby/object:Gem::Dependency
|
52
|
-
name: jeweler
|
53
51
|
prerelease: false
|
54
|
-
|
52
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
55
53
|
none: false
|
56
54
|
requirements:
|
57
|
-
- -
|
55
|
+
- - ">="
|
58
56
|
- !ruby/object:Gem::Version
|
59
|
-
hash:
|
57
|
+
hash: 15
|
60
58
|
segments:
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-
|
64
|
-
version:
|
59
|
+
- 0
|
60
|
+
- 6
|
61
|
+
- 4
|
62
|
+
version: 0.6.4
|
63
|
+
requirement: *id003
|
64
|
+
name: simplecov
|
65
65
|
type: :development
|
66
|
-
version_requirements: *id003
|
67
66
|
- !ruby/object:Gem::Dependency
|
68
|
-
name: rcov
|
69
67
|
prerelease: false
|
70
|
-
|
68
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
71
69
|
none: false
|
72
70
|
requirements:
|
73
71
|
- - ">="
|
@@ -76,9 +74,10 @@ dependencies:
|
|
76
74
|
segments:
|
77
75
|
- 0
|
78
76
|
version: "0"
|
77
|
+
requirement: *id004
|
78
|
+
name: rake
|
79
79
|
type: :development
|
80
|
-
|
81
|
-
description: A Statsd client in Ruby
|
80
|
+
description: A Ruby StatsD client (https://github.com/etsy/statsd)
|
82
81
|
email: rein@phpfog.com
|
83
82
|
executables: []
|
84
83
|
|
@@ -89,16 +88,17 @@ extra_rdoc_files:
|
|
89
88
|
- README.rdoc
|
90
89
|
files:
|
91
90
|
- .document
|
91
|
+
- .gitignore
|
92
|
+
- .travis.yml
|
93
|
+
- Gemfile
|
92
94
|
- LICENSE.txt
|
93
95
|
- README.rdoc
|
94
96
|
- Rakefile
|
95
|
-
- VERSION
|
96
97
|
- lib/statsd.rb
|
97
98
|
- spec/helper.rb
|
98
99
|
- spec/statsd_spec.rb
|
99
100
|
- statsd-ruby.gemspec
|
100
|
-
|
101
|
-
homepage: http://github.com/reinh/statsd
|
101
|
+
homepage: https://github.com/reinh/statsd-ruby
|
102
102
|
licenses:
|
103
103
|
- MIT
|
104
104
|
post_install_message:
|
@@ -127,9 +127,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
127
|
requirements: []
|
128
128
|
|
129
129
|
rubyforge_project:
|
130
|
-
rubygems_version: 1.
|
130
|
+
rubygems_version: 1.8.15
|
131
131
|
signing_key:
|
132
132
|
specification_version: 3
|
133
|
-
summary: A
|
134
|
-
test_files:
|
135
|
-
|
133
|
+
summary: A Ruby StatsD client
|
134
|
+
test_files:
|
135
|
+
- spec/helper.rb
|
136
|
+
- spec/statsd_spec.rb
|
137
|
+
has_rdoc:
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.3.0
|