statsd-instrument 1.1.1 → 1.1.2

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.
@@ -1,5 +1,6 @@
1
1
  require 'socket'
2
2
  require 'benchmark'
3
+ require 'timeout'
3
4
 
4
5
  class << Benchmark
5
6
  def ms
@@ -7,6 +8,7 @@ class << Benchmark
7
8
  end
8
9
  end
9
10
 
11
+
10
12
  module StatsD
11
13
  class << self
12
14
  attr_accessor :host, :port, :mode, :logger, :enabled, :default_sample_rate
@@ -14,6 +16,8 @@ module StatsD
14
16
  self.enabled = true
15
17
  self.default_sample_rate = 1
16
18
 
19
+ Timeout = defined?(::SystemTimer) ? ::SystemTimer : ::Timeout
20
+
17
21
  # StatsD.server = 'localhost:1234'
18
22
  def self.server=(conn)
19
23
  self.host, port = conn.split(':')
@@ -130,10 +134,16 @@ module StatsD
130
134
  command << "|@#{sample_rate}" if sample_rate < 1
131
135
 
132
136
  if mode == :production
133
- socket.send(command, 0, host, port)
137
+ socket_wrapper { socket.send(command, 0, host, port) }
134
138
  else
135
139
  logger.info "[StatsD] #{command}"
136
140
  end
137
141
  end
142
+
143
+ def self.socket_wrapper(options = {})
144
+ Timeout.timeout(options.fetch(:timeout, 0.1)) { yield }
145
+ rescue Timeout::Error, SocketError, IOError, SystemCallError => e
146
+ logger.error e
147
+ end
138
148
  end
139
149
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "statsd-instrument"
3
- s.version = '1.1.1'
3
+ s.version = '1.1.2'
4
4
  s.authors = ["Jesse Storimer"]
5
5
  s.email = ["jesse@shopify.com"]
6
6
  s.homepage = "http://github.com/shopify/statsd-instrument"
@@ -153,4 +153,45 @@ class StatsDTest < Test::Unit::TestCase
153
153
 
154
154
  StatsD.measure('values.foobar', 42)
155
155
  end
156
+
157
+ def test_socket_error_should_not_raise
158
+ StatsD.mode = :production
159
+ UDPSocket.any_instance.expects(:send).raises(SocketError)
160
+ StatsD.measure('values.foobar', 42)
161
+ StatsD.mode = :test
162
+ end
163
+
164
+ def test_timeout_error_should_not_raise
165
+ StatsD.mode = :production
166
+ UDPSocket.any_instance.expects(:send).raises(Timeout::Error)
167
+ StatsD.measure('values.foobar', 42)
168
+ StatsD.mode = :test
169
+ end
170
+
171
+ def test_system_call_error_should_not_raise
172
+ StatsD.mode = :production
173
+ UDPSocket.any_instance.expects(:send).raises(Errno::ETIMEDOUT)
174
+ StatsD.measure('values.foobar', 42)
175
+ StatsD.mode = :test
176
+ end
177
+
178
+ def test_io_error_should_not_raise
179
+ StatsD.mode = :production
180
+ UDPSocket.any_instance.expects(:send).raises(IOError)
181
+ StatsD.measure('values.foobar', 42)
182
+ StatsD.mode = :test
183
+ end
184
+
185
+ def test_long_request_should_timeout
186
+ StatsD.mode = :production
187
+ UDPSocket.any_instance.expects(:send).yields do
188
+ begin
189
+ Timeout.timeout(0.5) { sleep 1 }
190
+ rescue Timeout::Error
191
+ raise "Allowed long running request"
192
+ end
193
+ end
194
+ StatsD.measure('values.foobar', 42)
195
+ StatsD.mode = :test
196
+ end
156
197
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: statsd-instrument
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-11 00:00:00.000000000 Z
12
+ date: 2012-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mocha
16
- requirement: &2164776740 !ruby/object:Gem::Requirement
16
+ requirement: &2155684560 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2164776740
24
+ version_requirements: *2155684560
25
25
  description: A StatsD client for Ruby apps. Provides metaprogramming methods to inject
26
26
  StatsD instrumentation into your code.
27
27
  email:
@@ -65,4 +65,3 @@ specification_version: 3
65
65
  summary: A StatsD client for Ruby apps
66
66
  test_files:
67
67
  - test/statsd-instrument_test.rb
68
- has_rdoc: