Skip to content
This repository was archived by the owner on May 16, 2024. It is now read-only.

Commit 8c67512

Browse files
author
Yann
committed
Merge pull request #33 from DataDog/yann/0.5.6
0.5.6
2 parents a30d373 + 8bb73ca commit 8c67512

File tree

5 files changed

+41
-68
lines changed

5 files changed

+41
-68
lines changed

CONTRIBUTING.md

Lines changed: 0 additions & 22 deletions
This file was deleted.

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ Change Log
7575
----------
7676
- [DEPRECATED]
7777
- Date: 2015.03.17
78+
- 0.5.6
79+
- Revert to 0.5.3 due to backward incompatibilities.
7880
- 0.5.5
7981
- Revert usage of Python property for socket introduced in 0.5.4, to avoid backward incompatibilities, and performance degradation
8082
- 0.5.4

setup.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33

44
setup(
55
name = "dogstatsd-python",
6-
version = "0.5.5",
6+
version = "0.5.6",
77
author = "Datadog, Inc.",
88
author_email = "[email protected]",
99
description = "Python bindings to Datadog's API and a user-facing command line tool.",
1010
py_modules=['statsd'],
1111
license = "BSD",
1212
keywords = "datadog data statsd metrics",
13-
url = "http://www.datadoghq.com",
14-
test_suite = "nose.collector"
13+
url = "http://www.datadoghq.com"
1514
)

statsd.py

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#!/usr/bin/env python
21
"""
32
DogStatsd is a Python client for DogStatsd, a Statsd fork for Datadog.
43
"""
@@ -21,7 +20,7 @@
2120
class DogStatsd(object):
2221
OK, WARNING, CRITICAL, UNKNOWN = (0, 1, 2, 3)
2322

24-
def __init__(self, host='localhost', port=8125, max_buffer_size=50):
23+
def __init__(self, host='localhost', port=8125, max_buffer_size = 50):
2524
"""
2625
Initialize a DogStatsd object.
2726
@@ -31,30 +30,29 @@ def __init__(self, host='localhost', port=8125, max_buffer_size=50):
3130
:param port: the port of the DogStatsd server.
3231
:param max_buffer_size: Maximum number of metric to buffer before sending to the server if sending metrics in batch
3332
"""
34-
self._host = host
35-
self._port = int(port)
33+
self._host = None
34+
self._port = None
3635
self.socket = None
3736
self.max_buffer_size = max_buffer_size
3837
self._send = self._send_to_server
39-
38+
self.connect(host, port)
4039
self.encoding = 'utf-8'
4140

42-
def __enter__(self):
43-
self.open_buffer(self.max_buffer_size)
44-
return self
45-
46-
def __exit__(self, type, value, traceback):
47-
self.close_buffer()
48-
4941
def get_socket(self):
5042
'''
5143
Return a connected socket
5244
'''
5345
if not self.socket:
54-
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
55-
self.socket.connect((self._host, self._port))
46+
self.connect(self._host, self._port)
5647
return self.socket
5748

49+
def __enter__(self):
50+
self.open_buffer(self.max_buffer_size)
51+
return self
52+
53+
def __exit__(self, type, value, traceback):
54+
self.close_buffer()
55+
5856
def open_buffer(self, max_buffer_size=50):
5957
'''
6058
Open a buffer to send a batch of metrics in one packet
@@ -67,7 +65,7 @@ def open_buffer(self, max_buffer_size=50):
6765
6866
'''
6967
self.max_buffer_size = max_buffer_size
70-
self.buffer = []
68+
self.buffer= []
7169
self._send = self._send_to_buffer
7270

7371
def close_buffer(self):
@@ -77,6 +75,15 @@ def close_buffer(self):
7775
self._send = self._send_to_server
7876
self._flush_buffer()
7977

78+
def connect(self, host, port):
79+
"""
80+
Connect to the statsd server on the given host and port.
81+
"""
82+
self._host = host
83+
self._port = int(port)
84+
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
85+
self.socket.connect((self._host, self._port))
86+
8087
def gauge(self, metric, value, tags=None, sample_rate=1):
8188
"""
8289
Record the value of a gauge, optionally setting a list of tags and a
@@ -176,13 +183,12 @@ def _report(self, metric, metric_type, value, tags, sample_rate):
176183

177184
def _send_to_server(self, packet):
178185
try:
179-
# If set, use socket directly
180-
(self.socket or self.get_socket()).send(packet.encode(self.encoding))
186+
self.socket.send(packet.encode(self.encoding))
181187
except socket.error:
182-
log.info("Error submitting packet, will try refreshing the socket")
183-
self.socket = None
188+
log.info("Error submitting metric, will try refreshing the socket")
189+
self.connect(self._host, self._port)
184190
try:
185-
self.get_socket().send(packet.encode(self.encoding))
191+
self.socket.send(packet.encode(self.encoding))
186192
except socket.error:
187193
log.exception("Failed to send packet with a newly binded socket")
188194

@@ -193,7 +199,7 @@ def _send_to_buffer(self, packet):
193199

194200
def _flush_buffer(self):
195201
self._send_to_server("\n".join(self.buffer))
196-
self.buffer = []
202+
self.buffer=[]
197203

198204
def _escape_event_content(self, string):
199205
return string.replace('\n', '\\n')
@@ -233,7 +239,10 @@ def event(self, title, text, alert_type=None, aggregation_key=None,
233239
raise Exception(u'Event "%s" payload is too big (more that 8KB), '
234240
'event discarded' % title)
235241

236-
self._send(string)
242+
try:
243+
self.socket.send(string.encode(self.encoding))
244+
except Exception:
245+
log.exception(u'Error submitting event "%s"' % title)
237246

238247
def service_check(self, check_name, status, tags=None, timestamp=None,
239248
hostname=None, message=None):
@@ -255,7 +264,10 @@ def service_check(self, check_name, status, tags=None, timestamp=None,
255264
if message:
256265
string = u'{0}|m:{1}'.format(string, message)
257266

258-
self._send(string)
267+
try:
268+
self.socket.send(string.encode(self.encoding))
269+
except Exception:
270+
log.exception(u'Error submitting service check "{0}"'.format(check_name))
259271

260272

261273
statsd = DogStatsd()

tests/test_statsd.py

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def setUp(self):
4545
self.statsd.socket = FakeSocket()
4646

4747
def recv(self):
48-
return self.statsd.get_socket().recv()
48+
return self.statsd.socket.recv()
4949

5050
def test_set(self):
5151
self.statsd.set('set', 123)
@@ -89,7 +89,7 @@ def test_sample_rate(self):
8989
assert not self.recv()
9090
for i in range(10000):
9191
self.statsd.increment('sampled_counter', sample_rate=0.3)
92-
self.assert_almost_equal(3000, len(self.statsd.get_socket().payloads), 150)
92+
self.assert_almost_equal(3000, len(self.statsd.socket.payloads), 150)
9393
t.assert_equal('sampled_counter:1|c|@0.3', self.recv())
9494

9595
def test_tags_and_samples(self):
@@ -182,24 +182,6 @@ def test_batched_buffer_autoflush(self):
182182
def test_module_level_instance(self):
183183
t.assert_true(isinstance(statsd.statsd, statsd.DogStatsd))
184184

185-
def test_instantiating_does_not_connect(self):
186-
dogpound = DogStatsd()
187-
t.assert_equal(None, dogpound.socket)
188-
189-
def test_accessing_socket_opens_socket(self):
190-
dogpound = DogStatsd()
191-
try:
192-
t.assert_not_equal(None, dogpound.get_socket())
193-
finally:
194-
dogpound.get_socket().close()
195-
196-
def test_accessing_socket_multiple_times_returns_same_socket(self):
197-
dogpound = DogStatsd()
198-
fresh_socket = FakeSocket()
199-
dogpound.socket = fresh_socket
200-
t.assert_equal(fresh_socket, dogpound.get_socket())
201-
t.assert_not_equal(FakeSocket(), dogpound.get_socket())
202-
203185

204186
if __name__ == '__main__':
205187
statsd = statsd

0 commit comments

Comments
 (0)