A StatsD dependency for nameko, enabling services to send stats using pystatsd.
To use the dependency you simply declare it on the service and then you can use it within any of the service methods (entrypoints, simple methods, etc.).
from nameko_statsd import StatsD
class Service:
statsd = StatsD('prod1')
@entrypoint
@statsd.timer('process_data')
def process_data(self):
...
@rpc
def get_data(self):
self.statsd.incr('get_data')
...
def simple_method(self, value):
self.statsd.gauge(value)
...
def another_method(self, data):
...
with self.statsd.timer('another_timer', rate=2):
...The statsd.StatsClient instance exposes a set of methods that you can
access without having to go through the client itself. The dependency
acts as a pass-through for them. They are: incr, decr, gauge,
set, timer and timing.
In the above code example, you can see how we access incr, gauge and
timer.
You can also decorate any method in the service with the timer decorator,
as shown in the example. This allows you to time any method without having
to change its logic.
The library accepts any arguments accepted by statsd.StatsClient or
statsd.TCPStatsClient in the service configuration file as well as two
additional items that control the behaviour of the dependency itself
(enabled and protocol). You need one configuration block per different
statsd server. For example, if we had two statsd servers, prod1 and
prod2, we could have something like this:
STATSD:
prod1:
enabled: true
protocol: "udp"
host: "host1"
port: 8125
prefix: "prefix-1"
maxudpsize: 512
prod2:
enabled: false
protocol: "tcp"
host: "host2"
port: 8125
prefix: "prefix-2"The enabled value will activate/deactivate all stats, according to how it
is set (true/false). In this example, production 1 is enabled while
production 2 is not. You can set protocol to tcp (case insensitive) to
use the TCP based statsd.TCPStatsClient, if protocol is omitted (or set
to udp) the default UDP based statsd.StatsClient will be used. All
remaining values are passed directly to statsd.StatsClient (or
statsd.TCPStatsClient) on creation.
You can pass any arguments to the decorator, they will be given to the
statsd.StatsClient().timer decorator.
So, for example:
class MyService:
statsd = StatsD('prod1')
@entrypoint
@statsd.timer('my_stat', rate=5)
def method(...):
# method body
@statsd.timer('another-stat')
def another_method(...):
# method bodyis equivalent to the following:
class MyService:
statsd = StatsD('prod1')
@entrypoint
def method(...):
with self.statsd.timer('my_stat', rate=5):
# method body
def another_method(...):
with self.statsd.timer('another-stat'):
# method bodyWhen you attach a nameko_statsd.StatsD dependency to your service, no
client is created. Only when you use the dependency explicitly or when
you run a method that has been decorated with the timer decorator,
a client is created.
This lazy feature means you can attach as many nameko_statsd.StatsD
dependencies to your service as you fancy, and no client will be created
unless it is actually used.
The following Nameko versions are supported: 2.12, 2.13, 2.14
In previous versions of nameko-statsd, the timer decorator could only
be used if the service class inherited from nameko_statsd.ServiceBase or
if the correct name argument was passed to the nameko_statsd.StatsD
dependency provider.
Since version 0.1.1, nameko_statsd.StatsD is able
to determine the correct attribute name when nameko binds the dependency
provider to the service. Therefore, name argument to the
nameko_statsd.StatsD dependency provider, the nameko_statsd.ServiceBase
base class (and the associated metaclass) have been deprecated and will be
removed in a future release.