Socket
Socket
Sign inDemoInstall

aiomonitor

Package Overview
Dependencies
11
Maintainers
4
Alerts
File Explorer

Install Socket

Detect and block malicious and high-risk dependencies

Install

    aiomonitor

Adds monitor and Python REPL capabilities for asyncio applications


Maintainers
4

Readme

aiomonitor

.. image:: https://github.com/aio-libs/aiomonitor/workflows/CI/badge.svg :target: https://github.com/aio-libs/aiomonitor/actions?query=workflow%3ACI :alt: GitHub Actions status for the main branch

.. image:: https://codecov.io/gh/aio-libs/aiomonitor/branch/main/graph/badge.svg :target: https://codecov.io/gh/aio-libs/aiomonitor :alt: codecov.io status for the main branch

.. image:: https://badge.fury.io/py/aiomonitor.svg :target: https://pypi.org/project/aiomonitor :alt: Latest PyPI package version

.. image:: https://img.shields.io/pypi/dm/aiomonitor :target: https://pypistats.org/packages/aiomonitor :alt: Downloads count

.. image:: https://readthedocs.org/projects/aiomonitor-ng/badge/?version=latest :target: https://aiomonitor.aio-libs.org/en/latest/?badge=latest :alt: Documentation Status

aiomonitor is a module that adds monitor and cli capabilities for asyncio_ applications. Idea and code were borrowed from curio_ project. Task monitor that runs concurrently to the asyncio_ loop (or fast drop-in replacement uvloop_) in a separate thread as result monitor will work even if the event loop is blocked for some reason.

This library provides a python console using aioconsole_ module. It is possible to execute asynchronous commands inside your running application. Extensible with you own commands, in the style of the standard library's cmd_ module

.. image:: https://raw.githubusercontent.com/aio-libs/aiomonitor/main/docs/screenshot-ps-where-example.png :alt: An example to run the aiomonitor shell

Installation

Installation process is simple, just::

$ pip install aiomonitor

Example

Monitor has context manager interface:

.. code:: python

import aiomonitor

async def main():
    loop = asyncio.get_running_loop()
    run_forever = loop.create_future()
    with aiomonitor.start_monitor(loop):
        await run_forever

try:
    asyncio.run(main())
except KeyboardInterrupt:
    pass

Now from separate terminal it is possible to connect to the application::

$ telnet localhost 20101

or the included python client::

$ python -m aiomonitor.cli

Tutorial

Let's create a simple aiohttp_ application, and see how aiomonitor can be integrated with it.

.. code:: python

import asyncio

import aiomonitor
from aiohttp import web

# Simple handler that returns response after 100s
async def simple(request):
    print('Start sleeping')
    await asyncio.sleep(100)
    return web.Response(text="Simple answer")

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

# it is possible to pass a dictionary with local variables
# to the python console environment
host, port = "localhost", 8090
locals_ = {"port": port, "host": host}
# init monitor just before run_app
with aiomonitor.start_monitor(loop=loop, locals=locals_):
    # run application with built-in aiohttp run_app function
    web.run_app(app, port=port, host=host, loop=loop)

Let's save this code in file simple_srv.py, so we can run it with the following command::

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

And now one can connect to a running application from a separate terminal, with the telnet command, and aiomonitor will immediately respond with prompt::

$ telnet localhost 20101
Asyncio Monitor: 1 tasks running
Type help for commands
monitor >>>

Now you can type commands, for instance, help::

monitor >>> help
Usage: help [OPTIONS] COMMAND [ARGS]...

  To see the usage of each command, run them with "--help" option.

Commands:
  cancel                  Cancel an indicated task
  console                 Switch to async Python REPL
  exit (q,quit)           Leave the monitor client session
  help (?,h)              Show the list of commands
  ps (p)                  Show task table
  ps-terminated (pst,pt)  List recently terminated/cancelled tasks
  signal                  Send a Unix signal
  stacktrace (st,stack)   Print a stack trace from the event loop thread
  where (w)               Show stack frames and the task creation chain of a task
  where-terminated (wt)   Show stack frames and the termination/cancellation chain of a task

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

monitor >>> console
Python 3.10.7 (main, Sep  9 2022, 12:31:20) [Clang 13.1.6 (clang-1316.0.21.2.5)] 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)
---
>>> await asyncio.sleep(1, result=3)
3
>>>

To leave the console type exit() or press Ctrl+D::

>>> exit()

✓ The console session is closed.
monitor >>>

Extension

Additional console variables


You may add more variables that can be directly referenced in the ``console`` command.
Refer `the console-variables example code <https://github.com/aio-libs/aiomonitor/tree/main/examples/console-variables.py>`_

Custom console commands
~~~~~~~~~~~~~~~~~~~~~~~

``aiomonitor`` is very easy to extend with your own console commands.
Refer `the extension example code <https://github.com/aio-libs/aiomonitor/tree/main/examples/extension.py>`_

Requirements
------------

* Python_ 3.8+ (3.10.7+ recommended)
* aioconsole_
* Click_
* prompt_toolkit_
* uvloop_ (optional)


.. _PEP492: https://www.python.org/dev/peps/pep-0492/
.. _Python: https://www.python.org
.. _aioconsole: https://github.com/vxgmichel/aioconsole
.. _aiohttp: https://github.com/aio-libs/aiohttp
.. _asyncio: http://docs.python.org/3/library/asyncio.html
.. _Click: https://click.palletsprojects.com
.. _curio: https://github.com/dabeaz/curio
.. _prompt_toolkit: https://python-prompt-toolkit.readthedocs.io
.. _uvloop: https://github.com/MagicStack/uvloop
.. _cmd: http://docs.python.org/3/library/cmd.html

CHANGES
=======

.. towncrier release notes start

0.7.0 (2023-12-21)
---------------------------------

- Overhauled the documentation
  (`#393 <https://github.com/aio-libs/aiomonitor/issues/393>`_)

- Adopted ruff to replace black, flake8 and isort
  (`#391 <https://github.com/aio-libs/aiomonitor/issues/391>`_)

- Added a new demo example to show various features of aiomonitor, especially using the GUI (also for PyCon APAC 2023 talk)
  (`#385 <https://github.com/aio-libs/aiomonitor/issues/385>`_)

- Relaxed our direct dependnecy version range of aiohttp ("3.8.5 only" to "3.8.5 and higher") to enable installation on Python 3.12
  (`#389 <https://github.com/aio-libs/aiomonitor/issues/389>`_)

- Updated the README example to conform with the latest API and convention
  (`#383 <https://github.com/aio-libs/aiomonitor/issues/383>`_)


0.6.0 (2023-08-27)
------------------

- Add the web-based monitoring user interface to list, inspect, and cancel running/terminated tasks, with refactoring the monitor business logic and presentation layers (`termui` and `webui`)
  (`#84 <https://github.com/aio-libs/aiomonitor/issues/84>`_)

- Replace the default port numbers for the terminal UI, the web UI, and the console access (50101, 50201, 50102 -> 20101, 20102, 20103 respectively)
  (`#374 <https://github.com/aio-libs/aiomonitor/issues/374>`_)

- Adopt towncrier to auto-generate the changelog
  (`#375 <https://github.com/aio-libs/aiomonitor/issues/375>`_)


0.5.0 (2023-07-21)
------------------

* Fix a regression in Python 3.10 due to #10 (`#11 <https://github.com/aio-libs/aiomonitor/issues/11>`_)

* Support Python 3.11 properly by allowing the optional (`name` and `context` kwargs passed to `asyncio.create_task()` in the hooked task factory function `#10 <https://github.com/aio-libs/aiomonitor/issues/10>`_)

* Update development dependencies

* Selective persistent termination logs (`#9 <https://github.com/aio-libs/aiomonitor/issues/9>`_)

* Implement cancellation chain tracker (`#8 <https://github.com/aio-libs/aiomonitor/issues/8>`_)

* Trigger auto-completion only when Tab is pressed

* Support auto-completion of commands and arguments (`#7 <https://github.com/aio-libs/aiomonitor/issues/7>`_)

* Add missing explicit dependency to Click

* Promote `console_locals` as public attr

* Reimplement console command (`#6 <https://github.com/aio-libs/aiomonitor/issues/6>`_)

* Migrate to Click-based command line interface (`#5 <https://github.com/aio-libs/aiomonitor/issues/5>`_)

* Adopt (`prompt_toolkit` and support concurrent clients `#4 <https://github.com/aio-libs/aiomonitor/issues/4>`_)

* Show the total number of tasks when executing (`ps` `#3 <https://github.com/aio-libs/aiomonitor/issues/3>`_)

* Apply black, isort, mypy, flake8 and automate CI workflows using GitHub Actions

* Fix the task creation location in the 'ps' command output

* Remove loop=loop from all asynchronous calls to support newer Python versions (`#329 <https://github.com/aio-libs/aiomonitor/issues/329>`_)

* Added the task creation stack chain display to the 'where' command by setting a custom task factory (`#1 <https://github.com/aio-libs/aiomonitor/issues/1>`_)

These are the backported changes from [aiomonitor-ng](https://github.com/achimnol/aiomonitor-ng).
As the version bumps have gone far away in the fork, all those extra releases are squashed into the v0.5.0 release.


0.4.5 (2019-11-03)
------------------

* Fixed endless loop on EOF (thanks @apatrushev)


0.4.4 (2019-03-23)
------------------

* Simplified python console start end #175

* Added python 3.7 compatibility #176


0.4.3 (2019-02-02)
------------------

* Reworked console server start/close logic #169


0.4.2 (2019-01-13)
------------------

* Fixed issue with type annotations from 0.4.1 release #164


0.4.1 (2019-01-10)
------------------

* Fixed Python 3.5 support #161 (thanks @bmerry)


0.4.0 (2019-01-04)
------------------

* Added support for custom commands #133 (thanks @yggdr)

* Fixed OptLocals being passed as the default value for "locals" #122 (thanks @agronholm)

* Added an API inspired by the standard library's cmd module #135 (thanks @yggdr)

* Correctly report the port running aioconsole #124 (thanks @bmerry)


0.3.1 (2018-07-03)
------------------

* Added the stacktrace command #120 (thanks @agronholm)


0.3.0 (2017-09-08)
------------------

* Added _locals_ parameter for passing environment to python REPL


0.2.1 (2016-01-03)
------------------

* Fixed import in telnet cli in #12 (thanks @hellysmile)


0.2.0 (2016-01-01)
------------------

* Added basic documentation

* Most of methods of Monitor class are not not private api


0.1.0 (2016-12-14)
------------------

* Added missed LICENSE file

* Updated API, added start_monitor() function


0.0.3 (2016-12-11)
------------------

* Fixed README.rst


0.0.2 (2016-12-11)
------------------

* Tests more stable now

* Added simple tutorial to README.rst


0.0.1 (2016-12-10)
------------------

* Initial release.

Keywords

FAQs


Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc