> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# WSGI/ASGI-instrumentatie

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.

<Tip>
  ASGI-ondersteuning is toegevoegd in versie `0.1.4` van het AppSignal voor Python-pakket.
</Tip>

AppSignal ondersteunt instrumentatie voor generieke WSGI- en ASGI-webapplicaties via OpenTelemetry.

<Tip>
  AppSignal ondersteunt ook populaire webframeworks rechtstreeks, zoals
  [Django](/python/instrumentations/django),
  [Flask](/python/instrumentations/flask),
  [FastAPI](/python/instrumentations/fastapi) of
  [Starlette](/python/instrumentations/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.
</Tip>

## Installatie

<Note>
  🐍 Vergeet niet om eerst het [AppSignal for Python-package te installeren](/python/installation) in uw applicatie.
</Note>

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:

<CodeGroup>
  ```python Python theme={null}
  # requirements.txt
  # For a WSGI application:
  opentelemetry-instrumentation-wsgi
  # For an ASGI application:
  opentelemetry-instrumentation-asgi
  ```
</CodeGroup>

## 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:

<CodeGroup>
  ```python Python theme={null}
  import appsignal
  appsignal.start()

  # ... the rest of your code goes here ...
  ```
</CodeGroup>

Importeer vervolgens `OpenTelemetryMiddleware` uit de bijbehorende OpenTelemetry-instrumentatie en omhul uw applicatie hiermee:

<CodeGroup>
  ```python Python theme={null}
  # 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)
  ```
</CodeGroup>

## 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:

<CodeGroup>
  ```python Python theme={null}
  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 ...
  ```
</CodeGroup>

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:

<CodeGroup>
  ```python Python theme={null}
  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 ...
  ```
</CodeGroup>

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.
