Library of standard monitoring hooks for the Tornado framework
Project description
[![Build Status](https://travis-ci.org/uber/mutornadomon.png)](https://travis-ci.org/uber/mutornadomon)
[![Coverage Status](https://coveralls.io/repos/uber/mutornadomon/badge.svg?branch=master&service=github)](https://coveralls.io/github/uber/mutornadomon?branch=master)
# mutornadomon
**µtornadomon** is a library designed to be used with Tornado web applications. It adds an endpoint
(`/mutornadomon`) to HTTP servers which outputs application statistics for use with standard metric
collectors.
# Usage
The monitor is initialized using `mutornadomon.config.initialize_mutornadomon`.
## Exposing an HTTP endpoint
If you only pass a tornado web application, it will include request/response statistics,
and expose an HTTP endpoint for polling by external processes:
```
from mutornadomon.config import initialize_mutornadomon
import signal
[...]
application = tornado.web.Application(...)
monitor = initialize_mutornadomon(application)
def shut_down(*args):
monitor.stop()
some_other_application_stop_function()
tornado.ioloop.IOLoop.current().stop()
for sig in (signal.SIGQUIT, signal.SIGINT, signal.SIGTERM):
signal.signal(sig, shut_down)
```
This will add a `/mutornadomon` endpoint to the web application.
Here is an example request to that endpoint:
```
$ curl http://localhost:8080/mutornadomon
{"process": {"uptime": 38.98995113372803, "num_fds": 8, "meminfo": {"rss_bytes": 14020608, "vsz_bytes": 2530562048}, "cpu": {"num_threads": 1, "system_time": 0.049356776, "user_time": 0.182635456}}, "max_gauges": {"ioloop_pending_callbacks": 0, "ioloop_handlers": 2, "ioloop_excess_callback_latency": 0.0006290912628173773}, "min_gauges": {"ioloop_pending_callbacks": 0, "ioloop_handlers": 2, "ioloop_excess_callback_latency": -0.004179096221923834}, "gauges": {"ioloop_pending_callbacks": 0, "ioloop_handlers": 2, "ioloop_excess_callback_latency": 0.0006290912628173773}, "counters": {"callbacks": 388, "requests": 6, "localhost_requests": 6, "private_requests": 6}}
```
If you want to add your own metrics, you can do so by calling the `.kv()` or
`.count()` methods on the monitor object at any time.
The HTTP endpoint is restricted to only respond to request from loopback.
## Providing a publishing callback
Alternatively, instead of polling the HTTP interface, you can pass in a `publisher` callback:
```
import pprint
def publisher(metrics):
pprint.pprint(metrics)
monitor = initialize_mutornadomon(application, publisher=publisher)
```
By default, this will call the publisher callback every 10 seconds.
To override this pass the `publish_interval` parameter (in miliseconds).
## Monitoring non-web applications
If you don't pass an application object, other stats can still be collected:
```
import pprint
def publisher(metrics):
pprint.pprint(metrics)
monitor = initialize_mutornadomon(publisher=publisher)
```
This only works with the publisher callback interface.
[![Coverage Status](https://coveralls.io/repos/uber/mutornadomon/badge.svg?branch=master&service=github)](https://coveralls.io/github/uber/mutornadomon?branch=master)
# mutornadomon
**µtornadomon** is a library designed to be used with Tornado web applications. It adds an endpoint
(`/mutornadomon`) to HTTP servers which outputs application statistics for use with standard metric
collectors.
# Usage
The monitor is initialized using `mutornadomon.config.initialize_mutornadomon`.
## Exposing an HTTP endpoint
If you only pass a tornado web application, it will include request/response statistics,
and expose an HTTP endpoint for polling by external processes:
```
from mutornadomon.config import initialize_mutornadomon
import signal
[...]
application = tornado.web.Application(...)
monitor = initialize_mutornadomon(application)
def shut_down(*args):
monitor.stop()
some_other_application_stop_function()
tornado.ioloop.IOLoop.current().stop()
for sig in (signal.SIGQUIT, signal.SIGINT, signal.SIGTERM):
signal.signal(sig, shut_down)
```
This will add a `/mutornadomon` endpoint to the web application.
Here is an example request to that endpoint:
```
$ curl http://localhost:8080/mutornadomon
{"process": {"uptime": 38.98995113372803, "num_fds": 8, "meminfo": {"rss_bytes": 14020608, "vsz_bytes": 2530562048}, "cpu": {"num_threads": 1, "system_time": 0.049356776, "user_time": 0.182635456}}, "max_gauges": {"ioloop_pending_callbacks": 0, "ioloop_handlers": 2, "ioloop_excess_callback_latency": 0.0006290912628173773}, "min_gauges": {"ioloop_pending_callbacks": 0, "ioloop_handlers": 2, "ioloop_excess_callback_latency": -0.004179096221923834}, "gauges": {"ioloop_pending_callbacks": 0, "ioloop_handlers": 2, "ioloop_excess_callback_latency": 0.0006290912628173773}, "counters": {"callbacks": 388, "requests": 6, "localhost_requests": 6, "private_requests": 6}}
```
If you want to add your own metrics, you can do so by calling the `.kv()` or
`.count()` methods on the monitor object at any time.
The HTTP endpoint is restricted to only respond to request from loopback.
## Providing a publishing callback
Alternatively, instead of polling the HTTP interface, you can pass in a `publisher` callback:
```
import pprint
def publisher(metrics):
pprint.pprint(metrics)
monitor = initialize_mutornadomon(application, publisher=publisher)
```
By default, this will call the publisher callback every 10 seconds.
To override this pass the `publish_interval` parameter (in miliseconds).
## Monitoring non-web applications
If you don't pass an application object, other stats can still be collected:
```
import pprint
def publisher(metrics):
pprint.pprint(metrics)
monitor = initialize_mutornadomon(publisher=publisher)
```
This only works with the publisher callback interface.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
mutornadomon-0.4.2.tar.gz
(8.5 kB
view hashes)
Built Distribution
Close
Hashes for mutornadomon-0.4.2-py2-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4cb5a2c707f8159150f9ff0ffb6b6186f150972ad07ef01ee5a1d2fa15da573c |
|
MD5 | 1f0070154df561d51c4aed08d2a054c6 |
|
BLAKE2b-256 | 8760bf2c29d3540b403644f616bc20b72ed3cb25cfcfcb143efcd61ce85231f0 |