AppStats für Python 2

Das Python 2 SDK enthält die AppStats-Bibliothek, die zur Profilerstellung für die RPC-Leistung (Remote-Prozeduraufruf) der Anwendung verwendet wird. Ein App Engine-RPC ist ein Roundtrip-Netzwerkaufruf zwischen Ihrer Anwendung und einer App Engine Service API. Alle folgenden API-Aufrufe etwa sind RPC-Aufrufe:

  • Datastore Aufrufe wie ndb.get_multi(), ndb.put_multi(), oder ndb.gql().
  • Memcache -Aufrufe wie memcache.get() oder memcache.get_multi().
  • URL-Fetch-Aufrufe wie urlfetch.fetch().
  • E-Mail-Aufrufe wie mail.send().

Das Optimieren bzw. Debuggen einer skalierbaren Anwendung kann eine Herausforderung darstellen, da zahlreiche Probleme zu einer schlechten Leistung oder unerwarteten Kosten führen können. Diese Probleme sind mit den üblichen Informationsquellen wie Logs oder Anfragezeitstatistiken sehr schwer zu beheben. Der größte Zeitaufwand bei Anwendungsanfragen entsteht durch das Warten auf die Netzwerkaufrufe, die zur Verarbeitung der Anfrage erforderlich sind.

Sie sollten folgende Fragen beantworten, um weiterhin ein hohes Verarbeitungstempo Ihrer Anwendung zu gewährleisten:

  • Führt die Anwendung unnötige RPC-Aufrufe aus?
  • Sollte die Anwendung Daten im Cache zwischenspeichern, statt wiederholte RPC-Aufrufe zum erneuten Abruf derselben Daten auszuführen?
  • Funktioniert die Anwendung besser, wenn mehrere Anfragen parallel und nicht seriell ausgeführt werden?

Die AppStats-Bibliothek hilft Ihnen, diese Fragen zu beantworten. Außerdem können Sie mithilfe dieser Bibliothek Profile der RPC-Aufrufe erstellen und auf diese Weise dafür sorgen, dass die Anwendung RPC-Aufrufe so effizient wie möglich einsetzt. Mit AppStats können Sie alle RPC-Aufrufe für eine bestimmte Anfrage verfolgen und Berichte über die Dauer und die Kosten jedes Aufrufs erstellen.

Eine Optimierung der RPC-Nutzung durch Ihre Anwendung kann auch zur Kostensenkung beitragen. Weitere Informationen finden Sie unter App-Ressourcen verwalten.

Demovideo ansehen

Einrichtung

Sie können AppStats verwenden, ohne hierfür etwas herunterladen oder installieren zu müssen. Sie müssen lediglich die Anwendung konfigurieren, noch einmal bereitstellen und wie in den folgenden Schritten beschrieben auf die AppStats-Konsole zugreifen. Die AppStats-Bibliothek übernimmt alles Weitere.

1. Ereignisaufzeichnung installieren

Jeder Anfrage-Handler der Anwendung muss AppStats aufrufen, um Statistiken zu Web-Anfragen aufzuzeichnen. Wählen Sie je nach dem von der Anwendung verwendeten Framework eine der folgenden Optionen:

  • WSGI-Anfrage-Handler

    Sie müssen Ihre WSGI-Anwendung in der AppStats-Middleware kapseln, um AppStats mit WSGI-Anfrage-Handlern, einschließlich WSGI-Frameworks wie webapp2, verwenden zu können. Am einfachsten definieren Sie eine WSGI-Middleware, um jede WSGI-Anwendung mit appengine_config.py zu verpacken.

    Erstellen Sie eine Datei mit dem Namen appengine_config.py im Stammverzeichnis Ihrer Anwendung, falls noch nicht geschehen. Fügen Sie der Datei die folgende Funktion hinzu:

    def webapp_add_wsgi_middleware(app):
        from google.appengine.ext.appstats import recording
        app = recording.appstats_wsgi_middleware(app)
        return app

    Vor dem Aufruf der WSGI-Anwendung importiert die Laufzeit diese Datei und ruft die Funktion webapp_add_wsgi_middleware auf, falls sie gefunden wird.

    Weitere Informationen zu appengine_config.py finden Sie unter Optionale Konfiguration.

  • Django-Framework

    Zur Installation der Appstats-Middleware in einer Django-Anwendung bearbeiten Sie die Datei settings.py und fügen Sie die folgende Zeile als erstes Element in MIDDLEWARE_CLASSES hinzu:

        MIDDLEWARE_CLASSES = (
      'google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware',
    
      # ...
    )

    Die AppStats-Middleware muss das erste Element sein, sodass der Profiler auch andere Middleware in seine Statistiken aufnehmen kann.

    Die Django-Middleware ruft nach Bedarf AppStats zur Aufzeichnung von Ereignissen auf. Sie brauchen keine weiteren Anwendungscodes zu ändern.

2. Konsolenpfad festlegen

Sie können auf die AppStats-Konsole zugreifen, indem Sie in einem Webbrowser eine URL für die Anwendung aufrufen. Sie müssen den Pfad der URL auf eine der folgenden Arten festlegen:

  • Standard-URL

    Zur Zuordnung von Appstats zum Standardverzeichnis (/_ah/stats/) fügen Sie das appstats-Builtin zur Datei app.yaml hinzu:

    runtime: python27
    api_version: 1
    threadsafe: yes
    
    builtins:
    - appstats: on
    
    handlers:
    - url: .*
      script: main.app
    
  • Benutzerdefinierte URL

    Wenn Sie AppStats einem anderen Verzeichnis als dem Standardverzeichnis zuordnen möchten, können Sie die Anweisung url in app.yaml verwenden:

      - url: /stats.*
      script: google.appengine.ext.appstats.ui.app
      

3. Optionale Konfiguration

Sie können das Verhalten von AppStats konfigurieren, indem Sie entsprechende Inhalte in die Datei appengine_config.py im Stammverzeichnis der Anwendung einfügen. Ein vollständiges Beispiel der Konfigurationsoptionen finden Sie in der Datei google/appengine/ext/appstats/sample_appengine_config.py im SDK.

Einige wichtige Hinweise zu appengine_config.py:

  • Wenn Ihre Anfragehandler sys.path bearbeiten, müssen Sie dieselben Änderungen auch an sys.path in appengine_config.py vornehmen, damit alle Dateien für die Appstats-Weboberfläche sichtbar sind.

Kosten ansehen

AppStats kann sowohl die RPC-Kosten als auch die Zeit überwachen. Wenn die Anwendung zwar schnell genug, aber teurer als erwartet ist, suchen Sie nach Vorgängen, die mehr kosten als erwartet. Um das Kosten-Tracking zu aktivieren, legen Sie appstats_CALC_RPC_COSTS = True in Ihrer appengine_config.py -Datei fest.

4. AppStats vom Entwicklungsserver aus testen

Sie können die Appstats-Einrichtung mit dem Entwicklungsserver testen. Wenn Sie den Konsolenpfad so konfiguriert haben, dass er die oben angegebene Standard-URL verwendet, können Sie über http://localhost:8080/_ah/stats/ auf die Konsole zugreifen.

5. Bereitstellen

Sobald Sie mit der AppStats-Einrichtung zufrieden sind, stellen Sie die Anwendung bereit. Wenn Sie den Konsolenpfad so konfiguriert haben, dass er die oben angegebene Standard-URL verwendet, können Sie über http://your_app_id.appspot.com/_ah/stats auf die Konsole zugreifen.

Einführung in die Appstats-Konsole

Die AppStats-Konsole bietet zusammengefasste Informationen zu durchgeführten RPC-Aufrufen und angeforderten URL-Pfaden sowie einen Verlauf der letzten Anfragen und Details zu einzelnen Anfragen:

  • Die Tabelle RPC-Statistik zeigt eine Statistik für jeden von der Anwendung erstellten RPC-Typ an. Durch Klicken auf eine Plus-Schaltfläche wird der Eintrag erweitert und es wird für den RPC eine Aufschlüsselung nach Pfad-Anfrage angezeigt:

    Screenshot

  • Die Tabelle Pfadstatistik zeigt eine Statistik mit Daten zu den einzelnen Pfad-Anfragen an, die an die Anwendung gesendet wurden. Durch Klicken auf eine Plus-Schaltfläche wird der Eintrag erweitert und es wird für die Pfad-Anfrage eine Aufschlüsselung nach RPC angezeigt:

    Screenshot

    Wenn Sie die Funktion API-Kostenüberwachung aktiviert haben, werden auch Kosten angezeigt.

  • Die Tabelle Anfrageverlauf enthält Daten zu einzelnen Anfragen. Durch Klicken auf eine Plus-Schaltfläche wird der Eintrag erweitert und es wird eine Aufschlüsselung nach RPC angezeigt: Wenn Sie auf einen Anfrage-Link klicken, wird für die Anfrage eine Zeitachse mit spezifischem RPC-Timing angezeigt:

    Screenshot

  • Im RPC-Diagramm mit Zeitachse sehen Sie, wann bestimmte RPC-Anfragen durchgeführt wurden und wie lange die Verarbeitung dieser Anfragen dauerte. Der Balken RPC Gesamt zeigt die Gesamtzeit an, die für das Warten auf RPC-Aufrufe aufgewendet wurde. Der Balken Gesamtsumme zeigt die Gesamtzeit an, die für die Verarbeitung der Anfrage aufgewendet wurde. Wie Sie in der Zeitachse unten sehen können, wurde die meiste Zeit für RPC-Aufrufe aufgewendet. Dies ist häufig der Fall. Die anderen Tabs enthalten zusätzliche Informationen zu der Anfrage. Das Verständnis der Auswirkungen von RPC-Aufrufen auf die Antwortzeit der Anwendung ist für die Leistungsanalyse von unschätzbarem Wert.

    Screenshot

  • Mit Interactive Playground können Entwickler beliebigen Python-Code in ein Webformular eingeben und in der App-Umgebung ausführen.

    Klicken Sie nach dem Öffnen von AppStats auf den Link für Interactive Playground. Ein Formular mit einem einzelnen Textfeld wird angezeigt. Geben Sie in das Textfeld beliebigen Python-Code ein, den Sie ausführen möchten, und senden Sie das Formular zur Ausführung. Alle für die Standardausgabe gesendeten Ergebnisse werden neben dem Textfeld angezeigt. Außerdem wird eine Analyse der Zeitachse der RPC-Aufrufe angezeigt, die von dem eingegebenen Code generiert wurden.

    Interactive Playground kann aktiviert oder deaktiviert werden. Im SDK ist es standardmäßig aktiviert, in der Produktion standardmäßig deaktiviert. Fügen Sie der Datei appengine_config.py die folgende Zeile hinzu, um es zu aktivieren:

    <pre suppresswarning="yes" class="prettyprint">
    appstats_SHELL_OK = True
    </pre>
    

So gehts:

Appstats verwendet API-Hooks, um sich selbst zum Framework für Remote-Prozeduraufrufe hinzuzufügen, das den App Engine-Dienst-APIs zugrunde liegt. Es zeichnet Statistiken für alle API-Aufrufe auf, die während des Anfrage-Handlers ausgeführt werden, und speichert die Daten dann unter Verwendung des Namespace __appstats__ in Memcache. AppStats speichert die Statistik der letzten tausend ausgeführten Anfragen. Die Daten enthalten Übersichtsdarstellungen im Umfang von jeweils ca. 200 Byte und Detailaufzeichnungen mit jeweils bis zu 100 KB. Sie können festlegen, wie detailliert die Detaileinträge sein sollen. (Siehe hierzu Optionale Konfiguration und die Beispielkonfigurationsdatei.)

Die API-Hooks fügen einen gewissen Overhead zu den Anfrage-Handlern hinzu. AppStats fügt den Logs auf der Ebene "info" eine Nachricht hinzu, um die von der AppStats-Bibliothek selbst verbrauchte Ressourcenmenge zu melden. Die Log-Zeile sieht ungefähr folgendermaßen aus:

<pre suppresswarning="yes" class="prettyprint">
INFO 2009-08-25 12:04:07,277 recording.py:290] Saved; key: __appstats__:046800, part: 160 bytes, full: 25278 bytes, overhead: 0.019 + 0.018; link: http://your_app_id.[REGION_ID].r.appspot.com/stats/detail?time=1234567890123
</pre>

In dieser Zeile werden der aktualisierte Memcache-Schlüssel, die Größe der Einträge mit der Zusammenfassung (part ) und den Details ( full) sowie der Zeitbedarf (in Sekunden) für die Aufzeichnung dieser Informationen gemeldet. Die Log-Zeile enthält den Link zur AppStats-Verwaltungsoberfläche, in der die Daten für dieses Ereignis angezeigt werden.