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.
ASGI-Unterstützung wurde in Version 0.1.4 des AppSignal-Pakets für Python hinzugefügt.
AppSignal unterstützt die Instrumentierung allgemeiner WSGI- und ASGI-Webanwendungen über OpenTelemetry.
AppSignal unterstützt auch beliebte Web-Frameworks direkt, wie z. B.
Django,
Flask,
FastAPI oder
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.
Installation
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:
# requirements.txt
# For a WSGI application:
opentelemetry-instrumentation-wsgi
# For an ASGI application:
opentelemetry-instrumentation-asgi
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:
import appsignal
appsignal.start()
# ... the rest of your code goes here ...
Importieren Sie dann OpenTelemetryMiddleware aus der entsprechenden OpenTelemetry-Instrumentierung und umhüllen Sie Ihre Anwendung damit:
# 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)
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:
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 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:
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 ...
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.