Echtzeit-Logs mit Fluentd und BigQuery analysieren

Logs sind seit Langem ein effektives Mittel, um die Leistung von umfangreichen Systemen und Anwendungen sichtbar zu machen. Mit steigendem Umfang und zunehmender Komplexität dieser Systeme ist es jedoch schwierig geworden, mehrere Logs zu verwalten, die über eine Infrastrukturflotte verteilt sind.

Fluentd, ein Open-Source-Log-Collector, der weltweit von über 2.000 Unternehmen verwendet wird, dient dazu, die Log-Sammlung über viele Datenquellen und Systeme hinweg in einer einheitlichen Logging-Ebene zusammenzufassen. Da es sich nur schwer voraussagen lässt, welche Daten für eine spätere Analyse nützlich sein können, wird in der Regel alles protokolliert und später aussortiert. Das Erfassen und Speichern all dieser Daten kann mit der Zeit jedoch umständlich sein, wodurch es langsam und schwierig wird, die Antworten zu finden, nach denen Sie suchen.

Hier erweisen sich die Stärken von BigQuery, Googles vollständig verwaltetem, hoch skalierbarem, parallelem Abfragedienst, für Log-Ergebnisse als unglaublich nützlich. Im Gegensatz zu einem großen MapReduce-Job, der einige Minuten bis Stunden dauern kann, kann BigQuery Logs in Terabyte-Dimensionen in nur 10 bis 20 Sekunden abfragen, damit Sie schnell zu den Antworten gelangen, die Sie für die Instandsetzung oder Verbesserung Ihrer Systeme benötigen.

Standardmäßig können Sie 10.000 Zeilen mit Log-Daten pro Sekunde in jede BigQuery-Tabelle streamen. Dieses Limit lässt sich auf Anfrage auf 100.000 Zeilen pro Sekunde erhöhen. Durch die Fragmentierung des Datenstroms auf mehrere BigQuery-Tabellen und die Verwendung eines Fluentd-to-BigQuery-Plug-ins können Sie Logs nahezu in Echtzeit von Tausenden von Servern mit über einer Million Zeilen pro Sekunde direkt in BigQuery laden. Diese Daten lassen sich anschließend leicht visualisieren, indem Sie ein Dashboard erstellen, das jede Minute oder Stunde in einer Google-Tabelle aktualisiert wird.

Ziele

  • Einen nginx-Webserver in einer Google Compute Engine-Instanz ausführen.
  • Browser-Traffic mithilfe von Fluentd auf diesem Server protokollieren.
  • Die protokollierten Daten mithilfe der BigQuery Webbenutzeroberfläche abfragen und Google Apps Script aus einer Google-Tabelle heraus verwenden.
  • Die Abfrageergebnisse in einem Diagramm innerhalb einer Google-Tabelle, die automatisch aktualisiert wird, visualisieren.

Voraussetzungen

Beispielcode klonen

Um das GitHub-Repository auf Ihren Computer zu klonen, führen Sie folgenden Befehl aus:

git clone https://github.com/GoogleCloudPlatform/bigquery-fluentd-docker-sample

Datensatz und BigQuery-Tabelle erstellen

Erstellen Sie einen Datensatz namens bq_test, indem Sie folgenden Befehl ausführen:

bq mk bq_test

Ändern Sie Verzeichnisse zu dem Verzeichnis, in das Sie das GitHub-Repository geklont haben:

cd bigquery-fluentd-docker-sample

Führen Sie folgenden Befehl aus, um die BigQuery-Tabelle access_log mit Datennamen und -typen zu erstellen, die in der bereitgestellten Schemadatei schema.json definiert sind:

bq mk -t bq_test.access_log ./schema.json

Öffnen Sie die BigQuery-Web-UI, wählen Sie Ihren Projektnamen aus, klicken Sie auf das Dataset bq_test und wählen Sie die Tabelle access_log aus. Vergewissern Sie sich, dass die Tabelle mit dem angegebenen Schema erstellt wurde.

Google Compute Engine-Instanz erstellen

Führen Sie folgenden Befehl aus, um eine Google Compute Engine-Instanz mit dem Namen bq-test-instance zu erstellen:

gcloud compute instances create "bq-test-instance" \
  --zone "us-central1-a"  \
  --machine-type "n1-standard-1"  \
  --scopes storage-ro,bigquery \
  --image-family=container-vm \
  --image-project=google-containers

nginx und Fluentd in einem Docker-Container ausführen

Melden Sie sich in der soeben erstellten Compute Engine-Instanz an:

gcloud compute ssh bq-test-instance --zone=us-central1-a

Führen Sie in der Compute Engine-Instanz folgenden Befehl aus und ersetzen Sie <YOUR_PROJECT_ID> durch Ihre Projekt-ID:

sudo docker run -e GCP_PROJECT="<YOUR_PROJECT_ID>" -p 80:80 -t -i -d google/fluentd-bigquery-sample

Dieser Befehl startet den Download des Docker-Images google/fluentd-bigquery-sample, das einen Docker-Container startet und ausführt, der mit nginx und Fluentd vorkonfiguriert ist.

Generieren Sie als Nächstes einige Seitenaufrufe, um zu überprüfen, ob Fluentd Daten an BigQuery sendet:

  1. Suchen Sie in der Liste von VM-Instanzen nach bq-test-instance und klicken Sie in der entsprechenden Spalte EXTERNE IP-ADRESSE auf den Link. Wählen Sie im Dialogfeld die Option HTTP-Verkehr zulassen und klicken Sie auf Übernehmen, um die Firewallregel hinzuzufügen. In der unteren rechten Fensterecke sollte das Dialogfeld „Aktivitäten“ mit der Meldung „Instanz-Tags für bq-test-instance aktualisieren“ erscheinen. Beachten Sie, dass Tags verwendet werden, um Firewallregeln mit Instanzen zu verknüpfen.
  2. Nachdem das Update abgeschlossen ist, klicken Sie noch einmal auf den Link zur externen IP-Adresse, um den nginx-Server auf der Compute Engine-Instanz von Ihrem Browser aus aufzurufen. Sie sollten eine Webseite mit der Meldung „Willkommen bei nginx!“ sehen. Laden Sie die Seite mehrmals neu, um einige Browseranfragen zu generieren.

Abfragen mit der Webbenutzeroberfläche von BigQuery ausführen

Öffnen Sie die BigQuery-Web-UI, klicken Sie auf COMPOSE QUERY (ABFRAGE ERSTELLEN) und führen Sie folgende Abfrage aus:

 SELECT * FROM [bq_test.access_log] LIMIT 1000

Sie sollten die Browseranfragen sehen, die Sie gerade an den in der Tabelle access_log aufgezeichneten Webserver gesendet haben. Beachten Sie, dass es einige Minuten dauern kann, bis die ersten Log-Einträge von Fluentd empfangen werden.

Das war's! Sie haben gerade nachgewiesen, dass Ereignisse des nginx-Zugriffs-Logs von Fluentd erfasst, nach BigQuery importiert und in der Webbenutzeroberfläche angezeigt werden. Im nächsten Abschnitt werden Sie das Apache Bench-Tool nutzen, um mehr Traffic an die Webseite zu senden, um zu sehen, wie Fluentd und BigQuery umfangreiche Logs (standardmäßig bis zu 10.000 Zeilen/Sek.) in Echtzeit verarbeiten können.

Abfragen aus Google Tabellen ausführen

Neben Abfragen in der BigQuery-Webbenutzeroberfläche können Sie auch SQL-Anweisungen aus einer Google-Tabelle mit einer Kopie der in dieser Anleitung bereitgestellten Tabelle an BigQuery übermitteln. Die Tabelle enthält ein Apps Script, das die BigQuery-Abfragen ausführt, die Ergebnisse speichert und sie in einem eingebetteten Diagramm visualisiert. Sie können das Skript und die entsprechenden Diagramme so konfigurieren, dass sie automatisch in einem bestimmten Intervall aktualisiert werden, z. B. jede Minute, Stunde oder jeden Tag.

BigQuery-API in Google Tabellen aktivieren

Wenn Sie die Ausführung von SQL-Anweisungen an BigQuery aus Google Tabellen aktivieren möchten, folgen Sie diesen Anleitungen:

  1. Klicken Sie auf Beispiel für die Integration von BigQuery und Google Tabellen und wählen Sie Datei > Kopie erstellen... aus.
  2. Wählen Sie in Ihrer Kopie der Tabelle Tools > Skripteditor... aus.
  3. Öffnen Sie im Skripteditor bq_query.gs. Dies ist ein Skript, das BigQuery-Abfragen ausführt, Abfrageergebnisse in einem Tabellenblatt speichert und Diagramme generiert, um Abfrageergebnisse zu visualisieren.
  4. Ersetzen Sie den Platzhaltertext <<PUT YOUR SPREADSHEET URL HERE>> durch die URL zu Ihrer Kopie der Tabelle.
  5. Ersetzen Sie den Platzhaltertext <<PUT YOUR PROJECT ID HERE>> durch Ihre Projekt-ID. Wählen Sie Datei > Speichern.
  6. Wählen Sie im Skripteditor-Menü Ressourcen > Erweiterte Google-Dienste... Überprüfen Sie, ob die BigQuery-API aktiviert ist.
  7. Klicken Sie unten im Dialogfeld Erweiterte Google-Dienste auf den Link zur Google Cloud Platform Console. Es sollte eine Aufforderung eingeblendet werden, eine neue Projekt-ID zu erstellen, die mit der Tabelle verknüpft wird.
  8. Durchsuchen Sie die Liste der APIs nach der BigQuery-API und schalten Sie den Status von OFF auf ON. BigQuery-API sollte nun oben in der Liste der aktivierten APIs angezeigt werden.
  9. Schließen Sie die Konsole und klicken Sie im Dialogfeld Erweiterte Google-Dienste auf OK.

Öffentliches Dataset abfragen

Versuchen Sie nun, eine BigQuery-Beispielabfrage über Ihre Tabelle auszuführen:

  1. Öffnen Sie in Ihrer Kopie der Tabelle das Tabellenblatt BQ-Abfragen, die eine BigQuery-Abfrage mit dem Namen „gsod_temperature_LINE“ enthält. Diese Abfrage stellt jährliche Temperaturdaten aus der öffentlichen GSOD-Klimadatenbank zusammen.

  2. Zeilen einer Tabelle, die eine Abfrage definieren
  3. Wählen Sie Dashboard > Alle BQ-Abfragen ausführen. Ein Dialogfenster mit der Meldung „Berechtigung erforderlich“ wird angezeigt, wenn BigQuery zum ersten Mal ausgeführt wird. Klicken Sie auf Weiter und Akzeptieren.
  4. Nachdem die Abfrage beendet ist, finden Sie ein neues Tabellenblatt mit dem Namen gsod_temperature. Öffnen Sie dieses Tabellenblatt und prüfen Sie, ob es Abfrageergebnisse enthält.
  5. Öffnen Sie das Tabellenblatt BigQuery Ergebnisvisualisierung und prüfen Sie, ob es das folgende eingebettete Liniendiagramm der Temperaturdaten enthält, die von der Abfrage ausgegeben wurden:

  6. Liniendiagramm der globalen Durchschnitts-, Min.- und Max.-Temperaturdaten

Fluentd-Daten abfragen

Im vorherigen Schritt haben Sie eine Beispielabfrage auf einem öffentlichen Datensatz ausgeführt. In diesem Abschnitt werden Sie die von Fluentd erfassten Daten für Browseranfragen pro Sekunde (rps) an Ihre Compute Engine-Instanz abfragen.

Öffnen Sie das Tabellenblatt BQ-Abfragen. Erstellen Sie in der nächsten leeren Zeile eine Abfrage mit dem Namen „access_log_LINE“ mit einem Intervall von 1 und fügen Sie Folgendes in der Abfragezelle ein:

SELECT
  STRFTIME_UTC_USEC(time * 1000000, "%Y-%m-%d %H:%M:%S") as tstamp,
  count(*) as rps
FROM bq_test.access_log
GROUP BY tstamp ORDER BY tstamp DESC;

Wählen Sie Dashboard > Alle BQ-Abfragen ausführen, wodurch die Ergebnisse aus der Abfrage in einem neuen Tabellenblatt mit dem Namen access_log gespeichert werden. Öffnen Sie access_log, um die abgefragten Log-Daten anzuzeigen, und öffnen Sie das Tabellenblatt BigQuery Ergebnisvisualisierung, um das entsprechende Liniendiagramm anzuzeigen. (Wenn das Liniendiagramm nicht angezeigt wird, stellen Sie sicher, dass der Name der Abfrage im Tabellenblatt BQ-Abfragen das Suffix „_LINE“ enthält.) Da Ihre Compute Engine-Instanz noch nicht viele Browserbesuche hat, enthält dieses Diagramm nur wenige Daten. Im nächsten Abschnitt simulieren Sie eine größere Browser-Traffic-Last.

Last simulieren

Öffnen Sie ein lokales Terminal und führen Sie folgenden Befehl aus, um den Traffic an den nginx-Server mithilfe des Apache Bench-Tools zu simulieren. Ersetzen Sie <YOUR_EXTERNAL_IP> durch die externe IP-Adresse Ihrer Compute Engine-Instanz.

ab -c 100 -n 1000000 http://<YOUR_EXTERNAL_IP>/

Wählen Sie noch einmal Dashboard > Alle BQ-Abfragen ausführen. Öffnen Sie das Tabellenblatt access_log und Sie werden sehen, dass die Abfrageergebnisse nun die Spitze im simulierten Browser-Traffic umfassen und dass diese Spitze im Liniendiagramm im Tabellenblatt BigQuery Ergebnisvisualisierung angezeigt wird.

Automatische Abfrageausführung einrichten

Um diese Abfragen automatisch auszuführen und das Diagramm in regelmäßigen Abständen zu aktualisieren:

  1. Navigieren Sie zu Tools > Skripteditor und wählen Sie Ressourcen > Aktuelle Projekt-Trigger. Sie werden feststellen, dass noch keine Trigger eingerichtet wurden.
  2. Klicken Sie auf den Link, um einen Trigger hinzuzufügen.
  3. Wählen Sie im Ausführungsmenü die Option „runQueries“ und für Events die Option Zeitgesteuert, Minuten-Timer und Jede Minute. Klicken Sie auf Speichern. Dies löst das Skript bq_query.gs einmal pro Minute aus.
  4. Kehren Sie zum Tabellenblatt BigQuery Ergebnisvisualisierung zurück. Dort sehen Sie, wie die Grafik „access_log“ jede Minute aktualisiert wird.

Liniendiagramm der Browseranfragen pro Sekunde

Sie haben gerade die Schritte zur Einrichtung einer Google-Tabelle abgeschlossen, um BigQuery-Abfragen automatisch gegen einen von Fluentd erfassten Datensatz auszuführen und die Ergebnisse in Echtzeit zu visualisieren.

Nächste Schritte

Hier sind einige Nutzungshinweise, wenn Sie der Tabelle weitere Abfragen hinzufügen möchten:

  • Weitere Informationen zur Verwendung der BigQuery API in Apps Script finden Sie unter BigQuery-Dienst.
  • Wenn Sie dem Tabellenblatt BQ-Abfragen eine neue Abfrage hinzufügen, fügen Sie diese in die nächste leere Zeile ein. Lassen Sie keine leeren Zeilen zwischen den einzelnen Abfragen.
  • Wenn die Tabelle eine Abfrage mit einem neuen Abfragenamen ausführt, speichert sie die Abfrageergebnisse in einem neuen Tabellenblatt mit dem Namen der Abfrage als Titel.
  • Fügen Sie dem Abfragenamen das Suffix _AREA, _BAR, _COLUMN, _LINE, _SCATTER oder _TABLE hinzu, um ein neues Diagramm des angegebenen Typs auf dem Tabellenblatt mit der BigQuery-Ergebnisvisualisierung zu erstellen.
    • Verwenden Sie das Suffix _AREA_STACKED, _BAR_STACKED oder _COLUMN_STACKED, um ein gestapeltes Diagramm zu erstellen.
  • Die Tabelle speichert maximal 5 Ergebniszeilen für Abfragen des Typs BAR und COLUMN und maximal 100 Zeilen für alle anderen Typen. Sie können die Anzahl der ausgegebenen Ergebniszeilen explizit einschränken, indem Sie eine LIMIT-Klausel am Ende einer Abfrage hinzufügen, z. B. LIMIT 20.
  • Um ein chronologisches Diagramm zu erstellen, setzen Sie das erste Feld der Abfrage auf einen Zeitstempel oder einen Datumswert.

Um mehr über das Streaming von Daten nach BigQuery zu erfahren:

Bereinigen

  1. Deaktivieren Sie das Apache Bench-Tool, indem Sie den Befehl Strg + C auf Ihrem lokalen Terminal ausführen.

  2. Deaktivieren Sie die automatische Ausführung des Skripts bq_query.gs. Wählen Sie dazu im Skripteditor Ressourcen > Aktuelle Projekt-Trigger aus und löschen Sie den Trigger "runQueries".

  3. Löschen Sie das Dataset: Bewegen Sie den Mauszeiger in der BigQuery-Web-UI über das Dataset "bq_test" unter dem Projektnamen und wählen Sie im Drop-down-Menü die Option Dataset löschen aus.

  4. Löschen Sie die Google Compute Engine-Instanz:

    gcloud compute instances delete bq-test-instance --zone=us-central1-a
    
Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...