Skip to main content


Metroid

Subscribe, act, publish.

Python version Django version Celery version ServiceBus version Django GUID version

Codecov Pre-commit Black mypy isort

Metroid - Metro for Django

This app is intended to streamline integration with Metro for all Django+Celery users by:

  • Asynchronous handling of subscriptions and messages with one command
  • Execute Celery tasks based on message topics, defined in settings.py
  • Retry failed tasks through your admin dashboard when using the MetroidTask base

Overview

  • python >= 3.10
  • django >= 4.2 - For asgiref, settings
  • django-guid >= 3.2.0 - Storing correlation IDs for failed tasks in the database, making debugging easy
  • Choose one:
    • celery >= 5.3.0 - Execute tasks based on a subject
    • django-rq >= 2.4.1 - Execute tasks based on a subject

Implementation

The python manage.py metroid app is fully asynchronous, and has no blocking code. It utilizes Celery to execute tasks.

It works by:

  1. Going through all your configured subscriptions and start a new async connection for each one of them
  2. Metro sends messages on the subscriptions
  3. This app filters out messages matching subjects you have defined, and queues a celery task to execute the function as specified for that subject
    3.1. If no task is found for that subject, the message is marked as complete
  4. The message is marked as complete after the Celery task has successfully been queued
  5. If the task is failed, an entry is automatically created in your database
  6. All failed tasks can be retried manually through the admin dashboard

Configure and install this package

Note For a complete example, have a look in demoproj/settings.py.

  1. Create a METROID key in settings.py with all your subscriptions and handlers. Example settings:
METROID = {
    'subscriptions': [
        {
            'topic_name': 'metro-demo',
            'subscription_name': 'sub-metrodemo-metrodemoerfett',
            'connection_string': config('CONNECTION_STRING_METRO_DEMO', None),
            'handlers': [
               {
                  'subject': 'MetroDemo/Type/GeekJokes',
                  'regex': False,
                  'handler_function': 'demoproj.demoapp.services.my_func'
                }
            ],
        },
    ],
   'worker_type': 'celery', # default
}

The handler_function is defined by providing the full dotted path as a string. For example,from demoproj.demoapp.services import my_func is provided as 'demoproj.demoapp.services.my_func'.

The handlers subject can be a regular expression or a string. If a regular expression is provided, the variable regex must be set to True. Example:

'handlers': [{'subject': r'^MetroDemo/Type/.*$','regex':True,'handler_function': my_func}],
  1. Configure Django-GUID by adding the app to your installed apps, to your middlewares and configuring logging as described here. Make sure you enable the CeleryIntegration:
from django_guid.integrations import CeleryIntegration

DJANGO_GUID = {
    'INTEGRATIONS': [
        CeleryIntegration(
            use_django_logging=True,
            log_parent=True,
        )
    ],
}

Creating your own handler functions

Your functions will be called with keyword arguments for

message, topic_name, subscription_name and subject. You function should in other words look something like this:

Celery
@app.task(base=MetroidTask)
def my_func(*, message: dict, topic_name: str, subscription_name: str, subject: str) -> None:
rq
def my_func(*, message: dict, topic_name: str, subscription_name: str, subject: str) -> None:

Running the project

  1. Ensure you have redis running:
docker-compose up
  1. Run migrations
python manage.py migrate
  1. Create an admin account
python manage.py createsuperuser
  1. Start a worker:
celery -A demoproj worker -l info
  1. Run the subscriber:
python manage.py metroid
  1. Send messages to Metro. Example code can be found in demoproj/demoapp/services.py
  2. Run the webserver:
python manage.py runserver 8000
  1. See failed messages under http://localhost:8080/admin

To contribute, please see CONTRIBUTING.md

Metadata

Release files for metroid 1.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for metroid 1.4.0
File Size Uploaded
metroid-1.4.0.tar.gz 15.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for metroid 1.4.0
File Interpreter ABI Platform
metroid-1.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 33.1 kB

Release files / metroid-1.4.0.tar.gz

Download URL metroid-1.4.0.tar.gz
Size 15.0 kB
Tags Source
SHA-256 checksum
How to use checksums
166b17b1f84bf2bcfbea17a0695b8ece0ac18f1f490c07d6b761ec9b100650b0
BLAKE2b-256 checksum
How to use checksums
fae9246f0d800ad901d77342e03d8ed0641600038f7e3e85214283b4a49a6be8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.9.18 Linux/6.2.0-1018-azure

Release files / metroid-1.4.0-py3-none-any.whl

Download URL metroid-1.4.0-py3-none-any.whl
Size 18.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a108154d7e02116941b8ac10f6077a4224c5143d4e65f30427ecd33c75cd002e
BLAKE2b-256 checksum
How to use checksums
7e180b24a18a8738462152941150e7dbd6724dae64f10847cefa56f8ef1e2946
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.9.18 Linux/6.2.0-1018-azure

Release history Release notifications | RSS feed

This release

1.4.0 This release

2 release files

1.3.0

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page