From 51bd6ba141d8ad84d1fb47bb6dd274ccc91d8205 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Mon, 4 Oct 2021 21:57:35 +0200 Subject: [PATCH] added profiling command --- README.md | 22 ++++++++++++++++++++-- scodoc.py | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 014e6869f..a757f17e4 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ Ou avec couverture (`pip install pytest-cov`) #### Utilisation des tests unitaires pour initialiser la base de dev On peut aussi utiliser les tests unitaires pour mettre la base de données de développement dans un état connu, par exemple pour éviter de -recréer à la main étudianst et semestres quand on développe. +recréer à la main étudiants et semestres quand on développe. Il suffit de positionner une variable d'environnement indiquant la BD utilisée par les tests: @@ -151,7 +151,25 @@ Si la base utilisée pour les dev n'est plus en phase avec les scripts de migration, utiliser les commandes `flask db history`et `flask db stamp`pour se positionner à la bonne étape. -# Paquet debian 11 +### Profiling + +Sur une machine de DEV, lancer + + flask profile --host 0.0.0.0 --length 32 --profile-dir /opt/scodoc-data + +le fichier `.prof` sera alors écrit dans `/opt/scoidoc-data` (on peut aussi utiliser `/tmp`). + +Pour la visualisation, [snakeviz](https://jiffyclub.github.io/snakeviz/) est bien: + + pip install snakeviz + +puis + + snakeviz -s --hostname 0.0.0.0 -p 5555 /opt/scodoc-data/GET.ScoDoc......prof + + + +# Paquet Debian 11 Les scripts associés au paquet Debian (.deb) sont dans `tools/debian`. Le plus important est `postinst`qui se charge de configurer le système (install ou diff --git a/scodoc.py b/scodoc.py index 68ed60764..f2c2b3d92 100755 --- a/scodoc.py +++ b/scodoc.py @@ -329,3 +329,27 @@ def recursive_help(cmd, parent=None): @app.cli.command() def dumphelp(): recursive_help(app.cli) + + +@app.cli.command() +@click.option("-h", "--host", default="127.0.0.1", help="The interface to bind to.") +@click.option("-p", "--port", default=5000, help="The port to bind to.") +@click.option( + "--length", + default=25, + help="Number of functions to include in the profiler report.", +) +@click.option( + "--profile-dir", default=None, help="Directory where profiler data files are saved." +) +def profile(host, port, length, profile_dir): + """Start the application under the code profiler.""" + from werkzeug.middleware.profiler import ProfilerMiddleware + from werkzeug.serving import run_simple + + app.wsgi_app = ProfilerMiddleware( + app.wsgi_app, restrictions=[length], profile_dir=profile_dir + ) + run_simple( + host, port, app, use_debugger=False + ) # use run_simple instead of app.run()