45 <bucket>.<context>:<ms>|ms\n |
45 <bucket>.<context>:<ms>|ms\n |
46 |
46 |
47 There is also a decorator (``statsd_timeit``) that may be used to |
47 There is also a decorator (``statsd_timeit``) that may be used to |
48 measure and send to the statsd_ server the time passed in a function |
48 measure and send to the statsd_ server the time passed in a function |
49 or a method and the number of calls. It will send a message like:: |
49 or a method and the number of calls. It will send a message like:: |
50 |
50 |
51 <bucket>.<funcname>:<ms>|ms\n<bucket>.<funcname>:1|c\n |
51 <bucket>.<funcname>:<ms>|ms\n<bucket>.<funcname>:1|c\n |
52 |
52 |
53 |
53 |
54 .. _statsd: https://github.com/etsy/statsd |
54 .. _statsd: https://github.com/etsy/statsd |
55 |
55 |
56 """ |
56 """ |
57 |
|
58 |
57 |
59 |
58 |
60 import time |
59 import time |
61 import socket |
60 import socket |
62 |
61 |
110 self.callable = callableobj |
109 self.callable = callableobj |
111 |
110 |
112 @property |
111 @property |
113 def __doc__(self): |
112 def __doc__(self): |
114 return self.callable.__doc__ |
113 return self.callable.__doc__ |
|
114 |
115 @property |
115 @property |
116 def __name__(self): |
116 def __name__(self): |
117 return self.callable.__name__ |
117 return self.callable.__name__ |
118 |
118 |
119 def __call__(self, *args, **kw): |
119 def __call__(self, *args, **kw): |
120 if _address is None: |
120 if _address is None: |
121 return self.callable(*args, **kw) |
121 return self.callable(*args, **kw) |
122 t0 = time.time() |
122 t0 = time.time() |
123 try: |
123 try: |
124 return self.callable(*args, **kw) |
124 return self.callable(*args, **kw) |
125 finally: |
125 finally: |
126 dt = 1000*(time.time()-t0) |
126 dt = 1000 * (time.time() - t0) |
127 msg = '{0}.{1}:{2:.4f}|ms\n{0}.{1}:1|c\n'.format(_bucket, self.__name__, dt) |
127 msg = '{0}.{1}:{2:.4f}|ms\n{0}.{1}:1|c\n'.format( |
|
128 _bucket, self.__name__, dt) |
128 _socket.sendto(msg, _address) |
129 _socket.sendto(msg, _address) |
129 |
130 |
130 def __get__(self, obj, objtype): |
131 def __get__(self, obj, objtype): |
131 """Support instance methods.""" |
132 """Support instance methods.""" |
132 if obj is None: # class method or some already wrapped method |
133 if obj is None: # class method or some already wrapped method |
133 return self |
134 return self |
134 import functools |
135 import functools |
135 return functools.partial(self.__call__, obj) |
136 return functools.partial(self.__call__, obj) |