De WSGI- en ASGI-standaarden bieden een gemeenschappelijke laag voor de ontwikkeling van webframeworks en -servers in Python. De meeste populaire Python-webframeworks volgen deze standaarden, waardoor elke Python-webapplicatie met elke Python-webserver kan worden gedeployed.
ASGI-ondersteuning is toegevoegd in versie 0.1.4 van het AppSignal voor Python-pakket.
AppSignal ondersteunt instrumentatie voor generieke WSGI- en ASGI-webapplicaties via OpenTelemetry.
AppSignal ondersteunt ook populaire webframeworks rechtstreeks, zoals
Django,
Flask,
FastAPI of
Starlette. Als u een
webframework gebruikt dat we rechtstreeks ondersteunen, volgt u de instructies voor dat framework
in plaats van de generieke WSGI/ASGI-instructies op deze pagina.
Installatie
Installeer eerst het opentelemetry-instrumentation-wsgi- of het opentelemetry-instrumentation-asgi-pakket, afhankelijk van de gateway interface die in de applicatie wordt gebruikt. Om het aan uw project toe te voegen, voegt u de volgende regel toe aan uw requirements.txt-bestand:
# requirements.txt
# For a WSGI application:
opentelemetry-instrumentation-wsgi
# For an ASGI application:
opentelemetry-instrumentation-asgi
Setup
Roep in het entry point van uw applicatie (meestal genaamd main.py of app.py), voordat uw applicatie wordt geïnitialiseerd, appsignal.start() aan om uw applicatie te starten:
import appsignal
appsignal.start()
# ... the rest of your code goes here ...
Importeer vervolgens OpenTelemetryMiddleware uit de bijbehorende OpenTelemetry-instrumentatie en omhul uw applicatie hiermee:
# 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)
Routes groeperen
Standaard heeft een generieke WSGI- of ASGI-instrumentatie niet de benodigde context om te begrijpen hoe routing is gestructureerd in uw applicatie. Daardoor worden de performance-samples die AppSignal ontvangt niet correct gegroepeerd. U moet routinginformatie handmatig toevoegen aan de OpenTelemetry-span.
Een manier om dit te doen is door de HTTP semantic conventions van OpenTelemetry te volgen en het http.route-attribuut in te stellen in uw route handlers:
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 gebruikt automatisch de waarde van dit attribuut om requests te groeperen, samen met de request-methode. Bijvoorbeeld, een GET-request die door deze methode wordt afgehandeld, verschijnt als GET /users/:user_id in het AppSignal performance samples-paneel.
Als u liever requests op een andere manier groepeert (bijvoorbeeld door te verwijzen naar de methode of class die ze implementeert), kunt u het appsignal.root_name-attribuut gebruiken:
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 ...
Bij gebruik van appsignal.root_name wordt de request-methode niet gebruikt. De opgegeven waarde (in dit geval UserHandlers#show) wordt gebruikt om alle requests die door deze methode worden afgehandeld te groeperen.