Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (pypi.python.org).
Help us improve Python packaging - Donate today!

Attach a unique identifier to every WSGI request.

Project Description

request-id

Attach a unique identifier to every request in your WSGI application.

request-id is implemented as a WSGI middleware.

The package will do 3 things:

  1. Generate a unique request_id identifier which will be stored in the WSGI environ and set as the X-Request-ID response header.
  2. Rename the processing thread with the request_id such that any log messages output by the logger have the request_id attached.
  3. Log the request to the Python stdlib logging library, which can be used to generate a simple access log.

Installation

You may install the request-id package using pip:

$ pip install request-id

Configure with PasteDeploy

Update your application INI to run in a pipeline with the request-id filter:

[app:myapp]
use = egg:myapp

[filter:request-id]
use = egg:request-id
format = {status} {REQUEST_METHOD:<6} {REQUEST_PATH:<60} {REQUEST_ID}

[pipeline:main]
pipeline =
  request-id
  myapp

[loggers]
keys = translogger

[handlers]
keys = translogger

[formatters]
keys = minimal

[logger_translogger]
level = INFO
handlers = translogger
qualname = request_id
propagate = 0

[handler_translogger]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = minimal

[formatter_minimal]
format = %(message)s

Configure in code

Create a RequestIdMiddleware object and compose it with your WSGI application:

from request_id import RequestIdMiddleware
from wsgiref.simple_server import make_server

def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield 'Hello World\n'

app = RequestIdMiddleware(
    app,
    format='{status} {REQUEST_METHOD:<6} {REQUEST_PATH:<60} {REQUEST_ID}',
)

if __name__ == '__main__':
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

Access the request_id

The request_id is stored in the request environ dictionary and may be accessed from anywhere this is available using request_id.get_request_id(request) where request is an instance of webob.request.Request.

Settings

logger_name
The name of the Python stdlib logger to which the log output will be delivered. Default: request_id
logging_level
The name of the Python stdlib logging level on which request information will be output. Default: INFO
format

A formatting string using PEP-3101 string format syntax. Possible options are:

  • REQUEST_ID
  • REMOTE_ADDR
  • REMOTE_USER
  • REQUEST_METHOD
  • REQUEST_URI
  • REQUEST_PATH
  • HTTP_HOST
  • HTTP_VERSION
  • HTTP_REFERER
  • HTTP_USER_AGENT
  • time
  • duration
  • bytes
  • status

Default: '{REMOTE_ADDR} {HTTP_HOST} {REMOTE_USER} [{time}] "{REQUEST_METHOD} {REQUEST_URI} {HTTP_VERSION}" {status} {bytes} {duration} "{HTTP_REFERER}" "{HTTP_USER_AGENT}" - {REQUEST_ID}

source_header
If not None then the request_id will be pulled from this header in the request. This is useful if another system upstream is setting a request identifier which you want to use in the WSGI application. Default: None
exclude_prefixes
A (space or line separated) list of URL paths to be ignored based on request.path_info. Paths should have a leading / in order to match properly. Default: None

Acknowledgements

This code is heavily based on the translogger middleware from Paste.

unreleased

0.2 (2016-08-09)

  • Catch exceptions and return webob.exc.HTTPInternalServerError so that a request_id may be attached to the response.

0.1.2 (2016-07-26)

  • Fix a couple bugs with exclude_prefixes and add some docs for it.

0.1.1 (2016-07-26)

  • Add a new setting exclude_prefixes which can be used to avoid logging certain requests.

0.1.0 (2016-07-26)

  • Initial release.
Release History

Release History

This version
History Node

0.2.1

History Node

0.2

History Node

0.1.2

History Node

0.1.1

History Node

0.1.0

Download Files

Download Files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

File Name & Checksum SHA256 Checksum Help Version File Type Upload Date
request_id-0.2.1-py2.py3-none-any.whl (8.2 kB) Copy SHA256 Checksum SHA256 py2.py3 Wheel Nov 3, 2016
request-id-0.2.1.tar.gz (6.0 kB) Copy SHA256 Checksum SHA256 Source Nov 3, 2016

Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting