Code Monkey home page Code Monkey logo

pellet's Introduction

Pellet

Pellet helps improve your Django app performance by discovering N+1 queries.

The Django ORM makes it easy to forget using select_related and prefetch_related correctly and can accidentally cause N+1 queries to happen.

Pellet ultimately aims to recreate Bullet for Django.

usage terminal screenshot

Installing Pellet

pip install pellet

Enabling Pellet

  1. Add pellet.middleware.PelletMiddleware to your django middleware list.
  2. Configure pellet behaviour by using the PELLET variable in your django settings file.

Configuring Pellet

You can configure pellet by setting the PELLET variable in your django settings file. The default values used by pellet if this variable or any field in the object is not found is as follows:

PELLET = {
    # Enable/Disable pellet
    # If set to False the pellet
    # middleware does nothing
    "enabled": False,

    # Enable this if you want count and time
    # metrics at a query level
    "query_level_metrics_enabled": False,

    # Settings related to response headers
    # set by pellet
    "headers": {

        # Enables setting response headers
        "enabled": False,

        # Header to be used for setting total query count
        "query_count_header": "X-Pellet-Count",

        # Header to be used for setting total query time
        "query_time_header": "X-Pellet-Time"
    },

    # Settings related to pellet debug mode
    "debug": {

        # Enable debug mode
        # Don't enable on prod as it will slow down your app
        "enabled": False,

        # Query count thresholds which will
        # be used by pellet to report metrics
        # on the console
        "count_threshold": {

            # Min number of times a query should happen
            # for it to be classified as N+1
            # Queries with less count than this will
            # not show up in the debug table
            "min": 2,

            # Max number of times a query should happen
            # for it to be classified as a low impact
            # performance issue
            "low": 5,

            # Max number of times a query should happen
            # for it to be classified as a warning impact
            # performance issue
            # Every query happening more times than this
            # is classified as a high impact performance issue
            "medium": 10
        }
    },

    # Path to a callback function which will be called
    # with the request, response and
    # pellet metrics object
    "callback": None
}

Callback function

The callback function should accept three arguments:

  1. request -> django request object
  2. response -> django response object
  3. pellet_metrics -> dict containing metrics collected by pellet

Example functionality:

  1. collect and send api call level pellet metrics to an external service like datadog
  2. make integration tests fail for an api if too many queries are happening by raising an exception
  3. send alert emails, slack messages, etc on too many queries

Steps:

  1. Create a callback function:
# app/user/callbacks.py

from pellet.utils import get_sanitised_path

def write_datadog_metrics(path, metrics):
    # Writes metrics to datadog
    pass

def pellet_callback(request, response, pellet_metrics):
    # Get id stripped path
    # eg: /api/user/1/ -> /api/user/_id_/
    sanitised_path = get_sanitised_path(request.path)
    write_datadog_metrics(sanitised_path, pellet_metrics)
  1. Specify the callback function in the pellet config object.
PELLET = {
    # ..... rest of pellet config
    "callback": "app.user.callbacks.pellet_callback"
}

pellet's People

Contributors

har777 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

rvause

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.