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

Die WSGI- und ASGI-Standards bieten eine gemeinsame Schicht für die Entwicklung von Web-Frameworks und -Servern in Python. Die meisten beliebten Python-Web-Frameworks halten sich an diese Standards, sodass jede Python-Webanwendung mit jedem Python-Webserver bereitgestellt werden kann.

<Tip>
  ASGI-Unterstützung wurde in Version `0.1.4` des AppSignal-Pakets für Python hinzugefügt.
</Tip>

AppSignal unterstützt die Instrumentierung allgemeiner WSGI- und ASGI-Webanwendungen über OpenTelemetry.

<Tip>
  AppSignal unterstützt auch beliebte Web-Frameworks direkt, wie z. B.
  [Django](/python/instrumentations/django),
  [Flask](/python/instrumentations/flask),
  [FastAPI](/python/instrumentations/fastapi) oder
  [Starlette](/python/instrumentations/starlette). Wenn Sie ein Web-Framework
  verwenden, das wir direkt unterstützen, folgen Sie den Anweisungen für dieses
  Framework anstelle der allgemeinen WSGI/ASGI-Anweisungen auf dieser Seite.
</Tip>

## Installation

<Note>
  🐍 Vergessen Sie nicht, zuerst das [AppSignal for Python-Paket zu installieren](/python/installation) in Ihrer Anwendung.
</Note>

Installieren Sie zunächst entweder das Paket `opentelemetry-instrumentation-wsgi` oder `opentelemetry-instrumentation-asgi`, je nachdem, welche Gateway-Schnittstelle in der Anwendung verwendet wird. Um es zu Ihrem Projekt hinzuzufügen, fügen Sie die folgende Zeile in Ihre `requirements.txt`-Datei ein:

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

## Einrichtung

Rufen Sie im Einstiegspunkt Ihrer Anwendung (üblicherweise `main.py` oder `app.py`) `appsignal.start()` auf, bevor Ihre Anwendung initialisiert wird, um Ihre Anwendung zu starten:

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

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

Importieren Sie dann `OpenTelemetryMiddleware` aus der entsprechenden OpenTelemetry-Instrumentierung und umhüllen Sie Ihre Anwendung damit:

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

## Routen gruppieren

Eine generische WSGI- oder ASGI-Instrumentierung hat standardmäßig nicht den nötigen Kontext, um zu verstehen, wie das Routing in Ihrer Anwendung strukturiert ist. Daher werden die Performance-Samples, die AppSignal erhält, nicht korrekt gruppiert. Sie müssen dem OpenTelemetry-Span manuell Routing-Informationen hinzufügen.

Eine Möglichkeit besteht darin, den semantischen HTTP-Konventionen von OpenTelemetry zu folgen und das Attribut `http.route` in Ihren Route-Handlern zu setzen:

<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 verwendet den Wert dieses Attributs automatisch und nutzt ihn, um Anfragen zusammen mit der Request-Methode zu gruppieren. Beispielsweise erscheint eine GET-Anfrage, die von dieser Methode behandelt wird, als `GET /users/:user_id` im AppSignal-Performance-Samples-Panel.

Wenn Sie Anfragen anders gruppieren möchten (zum Beispiel anhand der Methode oder Klasse, die sie implementiert), können Sie das Attribut `appsignal.root_name` verwenden:

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

Mit `appsignal.root_name` wird die Request-Methode nicht verwendet. Der angegebene Wert (in diesem Fall `UserHandlers#show`) wird verwendet, um alle von dieser Methode behandelten Anfragen zu gruppieren.
