Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/vpcarlos/profyle
Development tool for analysing and managing python traces
https://github.com/vpcarlos/profyle
api asgi fastapi flask http middleware perfetto profile profyle python python3 trace tracing viztracer
Last synced: about 2 months ago
JSON representation
Development tool for analysing and managing python traces
- Host: GitHub
- URL: https://github.com/vpcarlos/profyle
- Owner: vpcarlos
- License: mit
- Created: 2023-02-23T10:46:37.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-19T14:51:52.000Z (8 months ago)
- Last Synced: 2024-08-31T15:21:23.570Z (4 months ago)
- Topics: api, asgi, fastapi, flask, http, middleware, perfetto, profile, profyle, python, python3, trace, tracing, viztracer
- Language: Python
- Homepage:
- Size: 3.86 MB
- Stars: 114
- Watchers: 2
- Forks: 5
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
### Development tool for analysing and managing python traces
[![Tests](https://github.com/vpcarlos/profyle/actions/workflows/test.yml/badge.svg)](https://github.com/vpcarlos/profyle/actions/workflows/test.yml)
## Why do you need Profyle?
### Bottlenecks
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### Enhance performace
Analyze the traces and decide which parts of your code should be improved## Installation
```console
$ pip install profyle---> 100%
```## Example
### 1. Implement
In order to track all your API requests you must implement theProfyleMiddleware
#### 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](https://en.wikipedia.org/wiki/Glob_(programming)) | `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
```Python
from fastapi import FastAPI
from profyle.fastapi import ProfyleMiddlewareapp = FastAPI()
# Trace all requests
app.add_middleware(ProfyleMiddleware)@app.get("/")
async def root():
return {"hello": "world"}
``````Python
from fastapi import FastAPI
from profyle.fastapi import ProfyleMiddlewareapp = 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
```Python
from flask import Flask
from profyle.flask import ProfyleMiddlewareapp = Flask(__name__)
app.wsgi_app = ProfyleMiddleware(app.wsgi_app, pattern="*/api/products*")
@app.route("/")
def root():
return "Hello, World!
"
```Django
```Python
# settings.pyMIDDLEWARE = [
...
"profyle.django.ProfyleMiddleware",
...
]
```### 2. Run
* Run the web server:```console
$ profyle startINFO: 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.
```### 3. List
* List all requests tracing:![Alt text](https://github.com/vpcarlos/profyle/blob/main/docs/img/traces.png?raw=true "Traces")
### 4. Analyze
* 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![Alt text](https://github.com/vpcarlos/profyle/blob/main/docs/img/trace1.png?raw=true "Trace1")
![Alt text](https://github.com/vpcarlos/profyle/blob/main/docs/img/trace2.png?raw=true "Trace2")
## CLI Commands
### start
* 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 |
```console
$ profyle start --port 5432INFO: 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.
```### clean
* Delete all profile traces```console
$ profyle clean10 traces removed
```### check
* Check traces DB size```console
$ profyle checkDB size: 30MB
```