Les standards WSGI et ASGI fournissent une couche commune pour le développement de frameworks et serveurs web en Python. La plupart des frameworks web Python populaires suivent ces standards, permettant à toute application web Python d’être déployée avec n’importe quel serveur web Python.
La prise en charge d’ASGI a été ajoutée dans la version 0.1.4 du package AppSignal pour Python.
AppSignal prend en charge l’instrumentation pour les applications web WSGI et ASGI génériques via OpenTelemetry.
AppSignal prend également en charge directement les frameworks web populaires, tels que
Django,
Flask,
FastAPI ou
Starlette. Si vous utilisez un framework
web que nous prenons directement en charge, suivez les instructions pour ce framework
au lieu des instructions WSGI/ASGI génériques de cette page.
Installation
Tout d’abord, installez soit le package opentelemetry-instrumentation-wsgi, soit le package opentelemetry-instrumentation-asgi, selon l’interface de passerelle utilisée dans l’application. Pour l’ajouter à votre projet, ajoutez la ligne suivante à votre fichier requirements.txt :
# requirements.txt
# For a WSGI application:
opentelemetry-instrumentation-wsgi
# For an ASGI application:
opentelemetry-instrumentation-asgi
Configuration
Dans le point d’entrée de votre application (généralement nommé main.py ou app.py), avant que votre application ne soit initialisée, appelez appsignal.start() pour démarrer votre application :
import appsignal
appsignal.start()
# ... the rest of your code goes here ...
Ensuite, importez OpenTelemetryMiddleware depuis l’instrumentation OpenTelemetry correspondante, et enveloppez votre application avec :
# For a WSGI application:
from opentelemetry.instrumentation.wsgi import OpenTelemetryMiddleware
# For an ASGI application:
from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware
my_app = # ... your WSGI/ASGI application goes here ...
my_app = OpenTelemetryMiddleware(my_app)
Regrouper les routes
Par défaut, une instrumentation WSGI ou ASGI générique n’aura pas le contexte nécessaire pour comprendre la structure du routage dans votre application. Par conséquent, les échantillons de performance reçus par AppSignal ne seront pas regroupés correctement. Vous devez ajouter manuellement les informations de routage au span OpenTelemetry.
Une façon de procéder est de suivre les conventions sémantiques HTTP d’OpenTelemetry, en définissant l’attribut http.route dans vos gestionnaires de route :
from opentelemetry.trace import get_current_span
def get_user_route_handler():
get_current_span().set_attribute("http.route", "/users/:user_id")
# ... your route handler goes here ...
AppSignal utilisera automatiquement la valeur de cet attribut pour regrouper les requêtes, avec la méthode de requête. Par exemple, une requête GET gérée par cette méthode apparaîtra comme GET /users/:user_id dans le panneau d’échantillons de performance d’AppSignal.
Si vous préférez regrouper les requêtes d’une autre manière (par exemple, en faisant référence à la méthode ou à la classe qui les implémente), vous pouvez utiliser l’attribut appsignal.root_name :
from opentelemetry.trace import get_current_span
class UserHandlers:
def show():
get_current_span().set_attribute("appsignal.root_name", "UserHandlers#show")
# ... your route handler goes here ...
En utilisant appsignal.root_name, la méthode de requête ne sera pas utilisée. La valeur fournie (dans ce cas, UserHandlers#show) sera utilisée pour regrouper toutes les requêtes gérées par cette méthode.