Lets create simple aiohttp application, and see how aiomonitor can integrates with it.

Basic aiohttp server

import asyncio

import aiomonitor
from aiohttp import web

# Simple handler that returns response after 100s
async def simple(request):
    loop = request.app.loop

    print('Start sleeping')
    await asyncio.sleep(100, loop=loop)
    return web.Response(text="Simple answer")

loop = asyncio.get_event_loop()
# create application and register route create route
app = web.Application(loop=loop)
app.router.add_get('/simple', simple)

# init monitor just befor run_app
with aiomonitor.start_monitor(loop):
    # run application with built in aoihttp run_app function
    web.run_app(app, port=8090, host='localhost')

Lets save this code in file simple_srv.py, so we can run it with command:

$ python simple_srv.py
======== Running on http://localhost:8090 ========
(Press CTRL+C to quit)

Connection over telnet

And now it is possible to connect to the running application from separate terminal, by execution nc command, immediately aiomonitor will respond with prompt:

$ nc localhost 50101
Asyncio Monitor: 1 tasks running
Type help for commands
monitor >>>

aiomonitor packaged with own telnet client, just in case you do not have nc or other related utility:

$ python -m aiomonitor.cli
Asyncio Monitor: 1 tasks running
Type help for commands
monitor >>>

Once connection established, one can type commands, for instance help:

monitor >>> help
             ps               : Show task table
             where taskid     : Show stack frames for a task
             cancel taskid    : Cancel an indicated task
             signal signame   : Send a Unix signal
             console          : Switch to async Python REPL
             quit             : Leave the monitor

Library will respond with list of supported commands:

  • ps – shows table of alive tasks with their id and state
  • where – prints stack frame for the task, taskid must be supplied
  • cancel – command cancels task, taskid must be supplied
  • signal – command sends unix signal to the app process
  • console – switch to python REPL
  • quit – stops telnet session

Python REPL

aiomonitor supports also async python console inside running event loop so you can explore state of your application:

monitor >>> console
Python 3.5.2 (default, Oct 11 2016, 05:05:28)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
This console is running in an asyncio event loop.
It allows you to wait for coroutines using the 'await' syntax.
Try: await asyncio.sleep(1, result=3, loop=loop)

Now you may execute regular function as well as coroutines by adding await keyword:

>>> import aiohttp
>>> session = aiohttp.ClientSession()
>>> resp = await session.get('http://python.org')
>>> resp.status
>>> data = await resp.read()
>>> len(data)

To leave console type exit():

>>> exit()
monitor >>>