Debugging

Debugging Guillotina will be slightly different from other web application that are not asyncio but Guillotina provides some nice integration to help you out.

X-Debug header

Any any request, you can provide the header X-Debug:1 and Guillotina will output debugging headers in the response about timing, number of queries and cache hit/miss stats.

GET /(db)/(container)

Retrieves serialization of resource

  • Permission: guillotina.ViewContent
  • Context: guillotina.interfaces.content.IResource

http

GET /db/container HTTP/1.1
Accept: application/json
Authorization: Basic cm9vdDpyb290
X-Debug: 1

curl

curl -i http://nohost/db/container -H 'Accept: application/json' -H 'X-Debug: 1' --user root:root

httpie

http http://nohost/db/container Accept:application/json X-Debug:1 -a root:root

response

HTTP/1.1 200 OK
Content-Type: application/json
XG-Cache-hits: 0
XG-Cache-misses: 0
XG-Cache-stored: 0
XG-Num-Queries: 0
XG-Timing-0-start: 0.00429
XG-Timing-1-traversed: 0.16522
XG-Timing-2-beforeauthentication: 0.00215
XG-Timing-3-authentication: 0.39291
XG-Timing-4-viewfound: 0.11563
XG-Timing-5-authorization: 0.32139
XG-Timing-6-viewrender: 0.02027
XG-Timing-7-viewrendered: 0.48804
XG-Timing-8-renderer: 0.05293
XG-Timing-9-headers: 0.01383
XG-Timing-Total: 1.57666
XG-Total-Cache-hits: 0
XG-Total-Cache-misses: 0
XG-Total-Cache-stored: 0

{
    "@id": "http://localhost/db/container",
    "@type": "Container",
    "@name": "container",
    "@uid": "40f70cd0f2f541608e010e6dfe1ef72e",
    "@static_behaviors": [],
    "parent": {},
    "is_folderish": true,
    "creation_date": "2022-12-12T14:49:11.721468+00:00",
    "modification_date": "2022-12-12T14:49:11.721468+00:00",
    "type_name": "Container",
    "title": "container",
    "uuid": "40f70cd0f2f541608e010e6dfe1ef72e",
    "__behaviors__": [],
    "items": [],
    "length": 0
}
Query Parameters:
 
  • include (string) – (required)
  • omit (string) – (required)
Status Codes:

GDEBUG

On startup, you can also provide the environment variable GDEBUG=true. This will provide detailed query statistics with the X-Debug:1.

Additionally, you can provide GDEBUG_SUBSCRIBERS to get detailed timings logged for event subscribers.

aiomonitor

Guillotina also provides integration with the aiomonitor python module. This module allows you to attach to a running python with asyncio to inspect the active tasks running.

First, install aiomonitor:

pip install aiomonitor

Then, run guillotina with --monitor:

g serve --monitor

Finally, connect to it:

python -m aiomonitor.cli

Jupyter

Guillotina also works with Jupyter notebooks. Load the example notebook in the Guillotina repository to see an example of how to get started.