Codelab zu Cloud Functions-Logging und -Tracing

Mit diesem Codelab lernen Sie, wie Sie die Logging- und Monitoring-Tools für alle Cloud Functions-Entwickler nutzen können. Diese Tools sind in allen Cloud Functions-Funktionen enthalten, die Sie in allen unterstützten Sprachen bereitstellen. So können Sie beim Schreiben und Betreiben Ihres serverlosen Codes produktiver arbeiten.

Wir verwenden hier eine HTTP-ausgelöste Funktion, aber alles, was wir behandeln, gilt auch für andere Sprachen und für Funktionen, die durch andere Ereignisse (Storage-Bucket, Pub/Sub usw.) ausgelöst werden.

Umgebung im eigenen Tempo einrichten

Wenn Sie noch kein Google-Konto haben (Gmail oder Google Apps), müssen Sie eines erstellen. Melden Sie sich unter console.cloud.google.com in der Google Cloud Platform Console an und erstellen Sie ein neues Projekt:

Screenshot von 2016-02-10 12:45:26.png

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. In diesem Codelab wird sie später als PROJECT_ID bezeichnet.

Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen zu nutzen.

Das Durchlaufen dieses Codelabs sollte nicht mehr als ein paar Dollar kosten. Es kann aber auch sein, dass Sie mehr Ressourcen brauchen oder sie weiterlaufen möchten (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).

Neuen Google Cloud Platform-Nutzern steht ein kostenloser Testzeitraum im Wert von 300$ zur Verfügung.

Google Cloud Shell

Google Cloud Functions und seine Logging- und Monitoring-Funktionen können Sie per Remotezugriff von Ihrem Laptop aus nutzen. In diesem Codelab nutzen wir Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Diese Debian-basierte virtuelle Maschine ist mit allen Entwicklertools ausgestattet, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud, wodurch Netzwerkleistung und Authentifizierung deutlich verbessert werden. Für dieses Codelab ist also nur ein Browser erforderlich, er funktioniert auch auf einem Chromebook.

Klicken Sie zum Aktivieren von Google Cloud Shell in der Entwicklerkonsole einfach auf die Schaltfläche oben rechts. Es dauert nur einen Moment, bis die Umgebung bereitgestellt und eine Verbindung hergestellt wird.

activateCloudShell.png

Klicken Sie auf die Schaltfläche „Cloud Shell starten“:

Screenshot 14.06.2017 um 22:13:43 Uhr.png

Wenn die Verbindung zur Cloud Shell hergestellt ist, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt auf Ihren PROJECT_ID gesetzt ist :

gcloud auth list

Befehlsausgabe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Cloud Shell legt außerdem einige Umgebungsvariablen standardmäßig fest, die nützlich sein können, wenn Sie zukünftige Befehle ausführen.

echo $GOOGLE_CLOUD_PROJECT

Befehlsausgabe

<PROJECT_ID>

Wenn das Projekt nicht festgelegt ist, geben Sie einfach den folgenden Befehl ein :

gcloud config set project <PROJECT_ID>

Suchen Sie Ihr PROJECT_ID? Sehen Sie nach, welche ID Sie bei der Einrichtung verwendet haben, oder suchen Sie sie im Dashboard der Konsole:

Projekt_ID.png

WICHTIG: Legen Sie zuletzt die Standardzone und die Projektkonfiguration fest:

gcloud config set compute/zone us-central1-f

Sie können aus verschiedenen Zonen wählen. Weitere Informationen finden Sie in der Dokumentation zu Regionen und Zonen.

Damit Sie etwas überwachen können, müssen Sie eine „Hello World“-Cloud-Funktion erstellen. Klicken Sie im linken Menü der Console auf Cloud Functions und dann auf Create function

Neue Funktion benennenhello-monitor

... und behalten Sie die Standardeinstellungen für den Quellcode bei (Sie können jedoch eine andere Sprache/Laufzeit auswählen) :

Erstellen Sie anschließend die Funktion mit der Schaltfläche Create&t :

Nach kurzer Zeit sollte die Funktion als Bereitschaft aufgeführt sein (durch das grüne Häkchen gekennzeichnet) :

Nachdem die Cloud Functions-Funktion erfolgreich bereitgestellt wurde, wird sie über die Befehlszeile getestet.

Geben Sie zuerst in Cloud Shell den folgenden Befehl aus :

$ gcloud functions describe hello-monitor

Es sollte eine Beschreibung der Funktion zurückgegeben werden, einschließlich einer URL für httpsTrigger, die der HTTP(S)-Endpunkt zum Aufrufen der Funktion ist. Sie sollte folgendes Format haben : https://<region>-<project-id>.cloudfunctions.net/hello-monitor

Das Auslösen der Funktion sollte jetzt so einfach sein wie curl'ing diese URL :

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

Wir verwenden jetzt Vegeta, ein einfaches Tool zum Testen von HTTP-Lasten. Geben Sie dazu einfach folgenden Befehl ein :

$ go get -u github.com/tsenart/vegeta

Wenn Sie mit ein paar Minuten Traffic an Ihre Cloud Functions-Funktion (fünf Anfragen pro Sekunde) senden möchten, verwenden Sie diesen Befehl :

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

Klicken Sie in der Funktionsansicht mit der rechten Maustaste auf das Menü „Protokolle ansehen“:

Daraufhin sollten Sie zum Abschnitt „ Dies mit Stackdriver Logging“ Ihres Projekts gelangen, in dem nur Ihre Cloud Functions-Logs angezeigt werden :

Wir hoffen, dass alle Anfragen an Ihre Funktion einen 200-Statuscode zurückgeben.

Mit dieser Loganzeige können Sie Folgendes tun :

  • Nach Protokollebene filtern (in unserem Fall liegen alle Logs auf Debug-Ebene vor)
  • Wählen Sie einen bestimmten Zeitraum aus (relativen oder absoluten Zeitraum).
  • Log-Streaming aktivieren (&play-Schaltfläche oben auf dem Bildschirm)
  • Link zum Logeintrag kopieren (zur Freigabe für Teammitglieder)
  • Logeintrag im Ressourcenkontext anzeigen
  • Protokolleintrag als visuellen Hinweis anpinnen
  • Exportieren Sie Logs in BigQuery, Cloud Storage oder Cloud Pub/Sub (oder laden Sie sie einfach im JSON- oder CSV-Format herunter)

Mit dem Selektor oben links können Sie Logs nach Funktion filtern. Sie können auch nach Labels oder einer Volltextsuche in der Suchleiste oben im Fenster suchen. In unserem Fall sind die Labels hello-monitor (der Name der Funktion) und eine Ausführungs-ID für die einzelnen Anfragen.

Filter können auch zur gemeinsamen Verwendung kopiert werden (über das Drop-down-Menü im Suchfeld) :

Gehen Sie über die Konsole zu „Funktionsdetails“ und sehen Sie sich die Spitze an, die wir mit unserem Belastungstest erstellt haben, sowohl in Bezug auf die Anzahl der Aufrufe pro Sekunde als auch in Bezug auf die Ausführungszeit :

Ein weiteres detaillierteres Tool zum Beobachten von Latenz und RPC-Aufrufen ist das Stackdriver Trace-Feature. Bevor wir dieses Feature verwenden können, müssen wir noch einige Änderungen an unseren Funktionen vornehmen:

  1. Das lebensrettende node-emoji-Paket als Abhängigkeit hinzufügen
  2. Funktionscode aktualisieren, um das Knoten-Emoji-Modul zu verwenden und Latenz zu beobachten
  3. Umgebungsvariable hinzufügen, um Stackdriver Trace für Cloud Functions zu aktivieren

Klicken Sie auf der Seite „Funktionsdetails“ auf „Bearbeiten“, um die Funktion zu ändern :

Bearbeite die Datei package.json, um eine Abhängigkeit für das Paket node-emoji hinzuzufügen :

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

Bearbeiten Sie die eigentliche Funktion, indem Sie den Inhalt von index.js so ändern :

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

Hiermit wird der Nachricht ein zufälliges Emoji hinzugefügt, das von der Funktion zurückgegeben wird, nachdem sie 300 Millisekunden pausiert wurde.

Fügen Sie schließlich eine Cloud Functions-Funktionsvariable mit dem Namen GOOGLE_CLOUD_TRACE_ENABLED hinzu und legen Sie sie auf true fest:

Denken Sie daran, auf „Speichern“ zu klicken.

Kehren Sie nun zu Cloud Shell zurück und rufen Sie den Befehl auf, um eine Belastung der neu bereitgestellten Funktion zu generieren :

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

Nun können wir die Liste der Traces beobachten, die ohne weitere Einrichtungsanforderungen und ohne spezifische Tracing-Bibliothek in Ihrem Code erstellt wurden.

Gehen Sie im Menü auf der linken Seite zu „Trace-Liste“ (unter Stackdriver Trace) :

Sie sollten etwa Folgendes sehen :

Dadurch sollte klar erkennbar sein, dass die in der Funktion eingeführte Latenz tatsächlich mit 300 ms gemessen wird.

Jeder Punkt in dieser Grafik ist eine Anfrage, für die Sie detaillierte Informationen abrufen können, z. B. Zeitstempel, HTTP-Methode und -Status, Labels, ein Link zurück zum entsprechenden Logeintrag und jeder nachfolgende RPC-Aufruf, den die Funktion ausführt :

Wenn du heranzoomen möchtest, klicke einfach auf die Grafik und ziehe sie an die gewünschte Stelle :Benutzerdefinierten Zeitbereich in der Trace-Grafik auswählen

Zum Herauszoomen klicken Sie oben auf der Seite auf die Schaltfläche „Zoom rückgängig machen“.

Da wir eine einzelne Funktion bereitgestellt haben, zeigt das Diagramm nur GET-Anfragen für den hello-monitor-URI. Sie können Traces aber nach HTTP-Methode (GET, POST, DELETE, ...), nach HTTP-Status (2XX, 3XX, ...) oder mit dem Anfragefilter filtern.

Gehen Sie jetzt im Menü auf der linken Seite zu „Traces – Übersicht“.

Auf dieser Übersichtsseite finden Sie aktuelle Traces und andere Statistiken.

...und die Möglichkeit, benutzerdefinierte Berichte basierend auf einer Kombination aus URI-Anfragefilter, HTTP-Methode, HTTP-Status und Zeitraum zu erstellen Sie können damit auch die generierten Werte mit einem bestimmten Zeitraum vergleichen :

Wenn Sie die korrekten Zeiträume festgelegt haben und genügend Datenpunkte vorliegen, können Sie einen Bericht erstellen, der die wichtige Latenzänderung zwischen der ersten und der neuen Funktion zeigt :

Mit einem solchen benutzerdefinierten Bericht lässt sich herausfinden, wann ein Leistungsproblem eingeführt wurde. Außerdem lässt sich damit ein Service Level Indicator (SLI) wie die Latenzzeit bei der Endnutzeranfrage erfassen.

Damit schließen wir unser Codelab ab und behandeln die Implementierung einer neuen Cloud Functions-Funktion, das Aufrufen der Logs und das Beobachten der Anfrage-Traces.

Cloud Functions und Stackdriver-Tools sind serverlose Plattformen, für die keine Kosten anfallen, wenn sie nicht verwendet werden. Als guter Cloud-Bürger sollten wir unsere Funktion aber löschen.

Wählen Sie einfach in der Cloud Functions-Übersichtsseite die Funktion hello-monitor aus und klicken Sie auf „Löschen“.

Wir arbeiten am Ende dieses einfachen Codelabs mit Cloud Functions-Logging und -Traces.

Mit den folgenden Links können Sie sich weiter informieren :

/