diff options
author | James Socol <james@thegroundwork.com> | 2015-03-26 12:41:43 -0400 |
---|---|---|
committer | James Socol <james@thegroundwork.com> | 2015-03-26 12:41:43 -0400 |
commit | e78b04626aade2d912da6e54fb149856082e8ee8 (patch) | |
tree | 7dab268d7eef44858d9f7a537b3fd6fe43360ebc | |
parent | 5ebfaa87f62df16caca10fefc22c56fe548e3ec7 (diff) | |
parent | dc2d35a7ceec854f5688e2311a2621b2df2199ed (diff) | |
download | pystatsd-e78b04626aade2d912da6e54fb149856082e8ee8.tar.gz |
Merge branch 'ipv6-flag'
-rw-r--r-- | CHANGES | 6 | ||||
-rw-r--r-- | statsd/client.py | 13 | ||||
-rw-r--r-- | statsd/defaults/__init__.py | 1 | ||||
-rw-r--r-- | statsd/defaults/django.py | 4 | ||||
-rw-r--r-- | statsd/defaults/env.py | 4 | ||||
-rw-r--r-- | statsd/tests.py | 41 |
6 files changed, 54 insertions, 15 deletions
@@ -1,6 +1,12 @@ Statsd Changelog ================ +Version 3.2 +----------- + +- Add an explicit IPv6 flag. + + Version 3.1 ----------- diff --git a/statsd/client.py b/statsd/client.py index a423dae..73e7712 100644 --- a/statsd/client.py +++ b/statsd/client.py @@ -131,12 +131,12 @@ class StatsClientBase(object): class StatsClient(StatsClientBase): """A client for statsd.""" - def __init__(self, host='localhost', port=8125, prefix=None, + def __init__(self, host='localhost', port=8125, ipv6=False, prefix=None, maxudpsize=512): """Create a new client.""" + fam = socket.AF_INET6 if ipv6 else socket.AF_INET family, _, _, _, addr = socket.getaddrinfo( - host, port, 0, socket.SOCK_DGRAM - )[0] + host, port, fam, socket.SOCK_DGRAM)[0] self._addr = addr self._sock = socket.socket(family, socket.SOCK_DGRAM) self._prefix = prefix @@ -157,10 +157,12 @@ class StatsClient(StatsClientBase): class TCPStatsClient(StatsClientBase): """TCP version of StatsClient.""" - def __init__(self, host='localhost', port=8125, prefix=None, timeout=None): + def __init__(self, host='localhost', port=8125, ipv6=False, prefix=None, + timeout=None): """Create a new client.""" self._host = host self._port = port + self._ipv6 = ipv6 self._timeout = timeout self._prefix = prefix self._sock = None @@ -180,8 +182,9 @@ class TCPStatsClient(StatsClientBase): self._sock = None def connect(self): + fam = socket.AF_INET6 if self._ipv6 else socket.AF_INET family, _, _, _, addr = socket.getaddrinfo( - self._host, self._port, 0, socket.SOCK_STREAM)[0] + self._host, self._port, fam, socket.SOCK_STREAM)[0] self._sock = socket.socket(family, socket.SOCK_STREAM) self._sock.settimeout(self._timeout) self._sock.connect(addr) diff --git a/statsd/defaults/__init__.py b/statsd/defaults/__init__.py index 2f2de3b..21851e3 100644 --- a/statsd/defaults/__init__.py +++ b/statsd/defaults/__init__.py @@ -1,4 +1,5 @@ HOST = 'localhost' PORT = 8125 +IPV6 = False PREFIX = None MAXUDPSIZE = 512 diff --git a/statsd/defaults/django.py b/statsd/defaults/django.py index c4c2951..74da212 100644 --- a/statsd/defaults/django.py +++ b/statsd/defaults/django.py @@ -12,4 +12,6 @@ if statsd is None: port = getattr(settings, 'STATSD_PORT', defaults.PORT) prefix = getattr(settings, 'STATSD_PREFIX', defaults.PREFIX) maxudpsize = getattr(settings, 'STATSD_MAXUDPSIZE', defaults.MAXUDPSIZE) - statsd = StatsClient(host, port, prefix, maxudpsize) + ipv6 = getattr(settings, 'STATSD_IPV6', defaults.IPV6) + statsd = StatsClient(host=host, port=port, prefix=prefix, + maxudpsize=maxudpsize, ipv6=ipv6) diff --git a/statsd/defaults/env.py b/statsd/defaults/env.py index eb857f9..1ee863f 100644 --- a/statsd/defaults/env.py +++ b/statsd/defaults/env.py @@ -12,4 +12,6 @@ if statsd is None: port = int(os.getenv('STATSD_PORT', defaults.PORT)) prefix = os.getenv('STATSD_PREFIX', defaults.PREFIX) maxudpsize = int(os.getenv('STATSD_MAXUDPSIZE', defaults.MAXUDPSIZE)) - statsd = StatsClient(host, port, prefix, maxudpsize) + ipv6 = bool(int(os.getenv('STATSD_IPV6', defaults.IPV6))) + statsd = StatsClient(host=host, port=port, prefix=prefix, + maxudpsize=maxudpsize, ipv6=ipv6) diff --git a/statsd/tests.py b/statsd/tests.py index a6a525c..16cf7ac 100644 --- a/statsd/tests.py +++ b/statsd/tests.py @@ -27,22 +27,23 @@ make_val = { } -def _udp_client(prefix=None, addr=None, port=None): +def _udp_client(prefix=None, addr=None, port=None, ipv6=False): if not addr: addr = ADDR[0] if not port: port = ADDR[1] - sc = StatsClient(host=addr, port=port, prefix=prefix) + sc = StatsClient(host=addr, port=port, prefix=prefix, ipv6=ipv6) sc._sock = mock.Mock() return sc -def _tcp_client(prefix=None, addr=None, port=None, timeout=None): +def _tcp_client(prefix=None, addr=None, port=None, timeout=None, ipv6=False): if not addr: addr = ADDR[0] if not port: port = ADDR[1] - sc = TCPStatsClient(host=addr, port=port, prefix=prefix, timeout=timeout) + sc = TCPStatsClient(host=addr, port=port, prefix=prefix, timeout=timeout, + ipv6=ipv6) sc._sock = mock.Mock() return sc @@ -210,21 +211,45 @@ def _test_ipv6(cl, proto, addr): _sock_check(cl._sock, 1, proto, 'foo:30|g', addr=addr) -@mock.patch.object(random, 'random', lambda: -1) def test_ipv6_udp(): """StatsClient can use to IPv6 address.""" addr = ('::1', 8125, 0, 0) - cl = _udp_client(addr=addr[0]) + cl = _udp_client(addr=addr[0], ipv6=True) _test_ipv6(cl, 'udp', addr) -@mock.patch.object(random, 'random', lambda: -1) + def test_ipv6_tcp(): """TCPStatsClient can use to IPv6 address.""" addr = ('::1', 8125, 0, 0) - cl = _tcp_client(addr=addr[0]) + cl = _tcp_client(addr=addr[0], ipv6=True) _test_ipv6(cl, 'tcp', addr) +def _test_resolution(cl, proto, addr): + cl.incr('foo') + _sock_check(cl._sock, 1, proto, 'foo:1|c', addr=addr) + + +def test_ipv6_resolution_udp(): + cl = _udp_client(addr='localhost', ipv6=True) + _test_resolution(cl, 'udp', ('::1', 8125, 0, 0)) + + +def test_ipv6_resolution_tcp(): + cl = _tcp_client(addr='localhost', ipv6=True) + _test_resolution(cl, 'tcp', ('::1', 8125, 0, 0)) + + +def test_ipv4_resolution_udp(): + cl = _udp_client(addr='localhost') + _test_resolution(cl, 'udp', ('127.0.0.1', 8125)) + + +def test_ipv4_resolution_tcp(): + cl = _tcp_client(addr='localhost') + _test_resolution(cl, 'tcp', ('127.0.0.1', 8125)) + + def _test_gauge_delta(cl, proto): tests = ( (12, '+12'), |