Pipelines

The Pipeline class is a subclass of StatsClient that batches together several stats before sending. It implements the entire client interface, plus a send() method.

Pipeline objects should be created with StatsClient.pipeline():

client = StatsClient()

pipe = client.pipeline()
pipe.incr('foo')
pipe.decr('bar')
pipe.timing('baz', 520)
pipe.send()

No stats will be sent until send() is called, at which point they will be packed into as few UDP packets as possible.

As a Context Manager

Pipeline objects can also be used as context managers:

with StatsClient().pipeline() as pipe:
    pipe.incr('foo')
    pipe.decr('bar')

Pipeline.send() will be called automatically when the managed block exits.

Thread Safety

While StatsClient instances are considered thread-safe (or at least as thread-safe as the standard library’s socket.send is), Pipeline instances are not thread-safe. Storing stats for later creates at least two important race conditions in a multi-threaded environment. You should create one Pipeline per-thread, if necessary.