With Profyle you can easily detect where in your code you have a bottleneck, simply analyze the trace and see what function or operation is taking most of the execution time of the request
Analyze the traces and decide which parts of your code should be improved
$ pip install profyle
---> 100%
In order to track all your API requests you must implement the ProfyleMiddleware
Attribute | Required | Default | Description | ENV Variable |
---|---|---|---|---|
enabled |
No | True |
Enable or disable Profyle | PROFYLE_ENABLED |
pattern |
No | None |
0nly trace those paths that match with pattern | PROFYLE_PATTERN |
max_stack_depth |
No | -1 |
Limit maximum stack trace depth | PROFYLE_MAX_STACK_DEPTH |
min_duration |
No | 0 (milisecons) |
Only record traces with a greather duration than the limit. | PROFYLE_MIN_DURATION |
FastAPI
from fastapi import FastAPI
from profyle.fastapi import ProfyleMiddleware
app = FastAPI()
# Trace all requests
app.add_middleware(ProfyleMiddleware)
@app.get("/")
async def root():
return {"hello": "world"}
from fastapi import FastAPI
from profyle.fastapi import ProfyleMiddleware
app = FastAPI()
# Trace all requests that match that start with /users
# with a minimum duration of 100ms and a maximum stack depth of 20
app.add_middleware(
ProfyleMiddleware,
pattern="/users*",
max_stack_depth=20,
min_duration=100
)
@app.get("/users/{user_id}")
async def get_user(user_id: int):
return {"hello": "user"}
Flask
from flask import Flask
from profyle.flask import ProfyleMiddleware
app = Flask(__name__)
app.wsgi_app = ProfyleMiddleware(app.wsgi_app, pattern="*/api/products*")
@app.route("/")
def root():
return "<p>Hello, World!</p>"
Django
# settings.py
MIDDLEWARE = [
...
"profyle.django.ProfyleMiddleware",
...
]
- Run the web server:
$ profyle start
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
- List all requests tracing:
- Profyle stands on the shoulder of giants: Viztracer and Perfetto
- Detailed function entry/exit information on timeline with source code
- Super easy to use, no source code change for most features, no package dependency
- Supports threading, multiprocessing, subprocess and async
- Powerful front-end, able to render GB-level trace smoothly
- Works on Linux/MacOS/Window
- Start the web server and view profile traces
Options | Type | Default | Description |
---|---|---|---|
--port | INTEGER | 0 | web server port |
--host | TEXT | 127.0.0.1 | web server host |
$ profyle start --port 5432
INFO: Uvicorn running on http://127.0.0.1:5432 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
- Delete all profile traces
$ profyle clean
10 traces removed
- Check traces DB size
$ profyle check
DB size: 30MB