Naar hoofdinhoud gaan
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

🐍 Vergeet niet om eerst het AppSignal for Python-package te installeren in uw applicatie.
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.