Logs in Echtzeit mit Fluentd und BigQuery analysieren

In dieser Anleitung wird gezeigt, wie der Browsertraffic protokolliert und in Echtzeit analysiert wird. Dies ist hilfreich, wenn Sie viele Logs aus verschiedenen Quellen haben und Fehler beheben oder aus den Daten aktuelle Statistiken erstellen möchten.

Außerdem wird beschrieben, wie von einem NGINX-Webserver generierte Loginformationen mit Fluentd an BigQuery gesendet und anschließend dort analysiert werden. Dabei werden Grundkenntnisse in Google Cloud, Linux-Befehlszeilen, der Erfassung von Anwendungslogs und der Loganalyse vorausgesetzt.

Einführung

Logs sind ein effektives Mittel, um einen Einblick in die Leistung umfangreicher Systeme und Anwendungen zu erhalten. Mit steigendem Umfang und zunehmender Komplexität dieser Systeme wird es jedoch schwierig, verschiedene Logs zu verwalten, die über mehrere Compute-Ressourcen verteilt sind.

Fluentd ist ein beliebter Open-Source-Log-Collector, der dazu dient, die Logsammlung über viele Datenquellen und Systeme hinweg in einer einheitlichen Logging-Ebene zusammenzufassen. Da es schwierig ist, im Voraus zu wissen, welche Daten für die Analyse nützlich sein könnten, besteht ein gängiger Ansatz darin, alles zu protokollieren und später zu sortieren. Das Erfassen und Speichern all dieser Daten kann jedoch sehr aufwendig werden, wodurch es lange dauert, die gewünschten Antworten zu erhalten.

Hier erweisen sich die Stärken von BigQuery für die Gewinnung von Erkenntnissen aus Logs als sehr nützlich. BigQuery ist Googles vollständig verwaltetes, hoch skalierbares Cloud-Data-Warehouse und Analysemodul. Es kann Abfragen von Logs in Terabyte-Dimensionen in weniger als einer Minute durchführen. Dank dieser Leistung erhalten Sie schnell die Antworten, die Sie zum Reparieren oder Verbessern Ihrer Systeme benötigen.

Standardmäßig lassen sich 100.000 Zeilen an Logdaten pro Sekunde in BigQuery streamen. Sie können jedoch ein zusätzliches Kontingent anfordern, um dieses Limit zu erhöhen.

Fluentd hat ein Ausgabe-Plug-in, das BigQuery als Ziel zum Speichern der erfassten Logs verwenden kann. Mit diesem Plug-in können Sie Logs von vielen Servern nahezu in Echtzeit direkt in BigQuery laden. Die Daten lassen sich dann einfach visualisieren, indem Sie ein Dashboard erstellen, das in Google Tabellen oder Google Data Studio regelmäßig aktualisiert wird.

Ziele

  • NGINX-Webserver auf einer Compute Engine-Instanz ausführen
  • Fluentd-Logerfassungs-Agent installieren
  • Fluentd für Folgendes konfigurieren:
    • Erfassen von NGINX-Traffic-Logs
    • Weiterleiten der Logs an BigQuery
  • Lognachrichten mit der BigQuery-Web-UI abfragen
  • Mit BigQuery Analyseabfragen für die Logs ausführen

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

  • Compute Engine
  • BigQuery

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung erstellen.

Hinweise

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

Nach Abschluss dieser Anleitung können Sie weitere Kosten durch Löschen von erstellten Ressourcen vermeiden. Weitere Informationen finden Sie im Abschnitt Bereinigen.

NGINX-Webserver-VM erstellen

In dieser Anleitung verwenden Sie Cloud Marketplace, um eine Compute Engine-Instanz zu erstellen, die für die Ausführung des NGINX-Webservers vorkonfiguriert ist.

  1. Öffnen Sie in der Cloud Console die Seite VM-Instanzen.

    Zu „VM-Instanzen“

  2. Wählen Sie das zu verwendende Google Cloud-Projekt aus, wenn Sie dazu aufgefordert werden.

  3. Klicken Sie auf Instanz erstellen.

  4. Geben Sie der VM den Namen nginx.

  5. Wählen Sie eine Zone aus, die sich entweder in einer US-Region oder einer europäischen Region befindet.

  6. Wählen Sie unter Identität und API-Zugriff die Option Zugriff für jede API festlegen aus.

  7. Stellen Sie den BigQuery-Zugriff auf Aktiviert.

  8. Achten Sie darauf, dass im Abschnitt Netzwerke unter Firewall die Option HTTP-Traffic zulassen ausgewählt ist.

  9. Wählen Sie Erstellen.

Warten Sie, bis die Bereitstellung abgeschlossen ist, bevor Sie fortfahren und den NGINX-Webserver installieren.

  1. Klicken Sie auf der Seite "VM-Instanzdetails" auf die Schaltfläche "SSH", um eine Verbindung zur Instanz herzustellen.
  2. Verwenden Sie APT, um den NGINX-Webserver zu installieren.

    sudo apt-get update && sudo apt-get -y upgrade
    sudo apt-get install -y nginx
    

Lassen Sie das SSH-Fenster für den nächsten Abschnitt geöffnet, um Fluentd und BigQuery-Connector zu installieren.

Fluentd und BigQuery-Connector installieren

In diesem Abschnitt der Anleitung installieren Sie den Fluentd-Log-Collector und das Fluentd-Ausgabe-Plug-in für BigQuery auf der VM.

  1. Ermitteln Sie im Shell-Fenster die Version von Debian auf der VM:

    lsb_release -rdc
    

    Das Ergebnis zeigt die Debian-Version, die auf der VM läuft, und ihren Codenamen:

    Description:    Debian GNU/Linux 10 (buster)
    Release:        10
    Codename:       buster
    
  2. Gehen Sie zur Fluentd-Downloadseite für Debian und suchen Sie die Installationsbefehlszeile für die Debian-Version mit dem entsprechenden Codenamen.

    Für Debian Buster finden Sie beispielsweise den folgenden Befehl:

    curl -L
       https://toolbelt.treasuredata.com/sh/install-debian-buster-td-agent4.sh
       | sh
    
  3. Kopieren Sie den Befehl in das Shell-Fenster Ihrer VM.

    Durch diesen Befehl wird das Paket td-agent auf der VM installiert. Es enthält die Fluentd-Verteilung.

  4. Fügen Sie der Gruppe adm auf der VM das Nutzerkonto td-agent für den Fluentd-Agent hinzu.

    sudo usermod -aG adm td-agent
    
  5. Installieren Sie das Fluentd-to-BigQuery-Plug-in:

    sudo /usr/sbin/td-agent-gem install fluent-plugin-bigquery
    

BigQuery-Dataset und -Tabelle als Logziel erstellen

Fluentd verwendet Eingabe-Plug-ins, um Logs zu erfassen, die von anderen Anwendungen und Diensten erstellt wurden. Diese Daten werden in strukturierte JSON-Datensätze geparst, die dann an alle konfigurierten Ausgabe-Plug-ins weitergeleitet werden.

Der Fluentd-NGINX-Zugriffslog-Parser liest die NGINX-access.log-Dateien. Nachstehend sehen Sie einen Beispieldatensatz mit Feldern und Beispielwerten:

time: 1362020400
record:
{
  "remote"              : "127.0.0.1",
  "host"                : "192.168.0.1",
  "user"                : "-",
  "method"              : "GET",
  "path"                : "/",
  "code"                : "200",
  "size"                : "777",
  "referer"             : "-",
  "agent"               : "Opera/12.0",
  "http_x_forwarded_for": "-"
}

Wenn Sie in BigQuery eine Logzieltabelle erstellen, müssen die Spaltennamen genau mit den Feldnamen im Logeintrag übereinstimmen. Verwenden Sie daher in den folgenden Schritten unbedingt die vorgeschlagenen Namen, damit die Tabellenspaltennamen für die spätere Nutzung korrekt sind.

  1. Öffnen Sie die Webbenutzeroberfläche von BigQuery:

    Öffnen Sie die BigQuery-Web-UI

  2. Klicken Sie im Navigationsbereich unter Ressourcen auf den Namen Ihres Projekts.

  3. Klicken Sie im Detailbereich unter dem Abfrageeditor auf Dataset erstellen.

  4. Geben Sie unter Dataset ID fluentd ein.

  5. Wählen Sie als Speicherort der Daten den multiregionalen Standort (USA oder Europa) aus, an dem Sie die NGINX-Instanz erstellt haben.

  6. Klicken Sie auf Dataset erstellen.

  7. Klicken Sie im Navigationsbereich unter Ressourcen auf das Dataset fluentd.

  8. Klicken Sie im Detailbereich unter dem Abfrageeditor auf Tabelle erstellen.

  9. Geben Sie nginx_access als Tabellennamen ein.

  10. Wählen Sie die Option Als Text bearbeiten aus.

  11. Kopieren Sie die folgende JSON-Spaltendefinition in das Textfeld:

    [  { "type": "TIMESTAMP", "name": "time" },
       { "type": "STRING",    "name": "remote" },
       { "type": "STRING",    "name": "host" },
       { "type": "STRING",    "name": "user" },
       { "type": "STRING",    "name": "method" },
       { "type": "STRING",    "name": "path" },
       { "type": "STRING",    "name": "code" },
       { "type": "INTEGER",   "name": "size" },
       { "type": "STRING",    "name": "referer" },
       { "type": "STRING",    "name": "agent" },
       { "type": "STRING",    "name": "http_x_forwarded_for" } ]
    

    Die Spaltennamen stimmen genau mit den Feldnamen im Fluentd-Logeintrag überein. Der Spaltenwert time wird durch Umwandlung des Zeitstempels des Logeintrags in einen BigQuery-kompatiblen Zeitstempelstring zu dem Eintrag hinzugefügt.

  12. Wählen Sie in der Liste Partitionierung die Option Nach Feld partitionieren: Zeit aus.

    Durch das Partitionieren von Tabellen werden große Tabellen in kleinere Segmente unterteilt, um die Abfrageleistung zu verbessern und die Kosten zu kontrollieren. So wird die von einer Abfrage gelesene Datenmenge verringert. Weitere Informationen dazu finden Sie unter Einführung in partitionierte Tabellen in der BigQuery-Dokumentation.

  13. Klicken Sie unten auf Tabelle erstellen.

    Die BigQuery-Tabelle fluentd.nginx_access kann jetzt Logeinträge empfangen.

  14. Klicken Sie zum Anzeigen der Tabellendetails unter Ressourcen > Details auf den Tabellennamen.

    In den Details finden Sie beispielsweise Informationen dazu, wie viele Zeilen es gibt und wie viel Speicher die Tabelle belegt.

Logerfassung und -weiterleitung zu BigQuery einrichten

In der Fluentd-Konfigurationsdatei /etc/td-agent/td-agent.conf sind die Quellen, aus denen Logdaten erfasst werden, die Ausgaben für die erfassten Logs und alle Filter definiert. Außerdem können Sie Tags auf die erfassten Logs anwenden, um festzulegen, wie sie verarbeitet werden und an welches Ausgabe-Plug-in sie gesendet werden sollen.

In den folgenden Schritten konfigurieren Sie Fluentd für Folgendes:

So richten Sie die Logerfassung und -weiterleitung ein:

  1. Stellen Sie mit SSH eine Verbindung zu der VM her, auf der NGINX installiert ist.
  2. Öffnen Sie im Shell-Fenster einen Texteditor als Rootnutzer (z. B. Vim oder Nano) und bearbeiten Sie die Fluentd-Agent-Konfigurationsdatei /etc/td-agent/td-agent.conf. Verwenden Sie beispielsweise den folgenden Befehl, um die Datei in Vim zu öffnen:

    sudo vim /etc/td-agent/td-agent.conf
    
  3. Hängen Sie am Ende der Datei die folgenden Zeilen an, um das Endeingabe-Plug-in so zu konfigurieren, dass es die NGINX-Logs liest, sie mit dem NGINX-Parser parst und mit nginx.access kennzeichnet.

    <source>
      @type tail
      @id input_tail
      <parse>
        @type nginx
      </parse>
      path /var/log/nginx/access.log
      pos_file /var/log/td-agent/httpd-access.log.pos
      tag nginx.access
    </source>
    
  4. Fügen Sie die folgenden Zeilen hinzu, um das BigQuery-Ausgabe-Plug-in zu konfigurieren. Ersetzen Sie [MY_PROJECT_ID] durch die ID Ihres Google Cloud-Projekts.

    <match nginx.access>
      @type bigquery_insert
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_ID]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    Dadurch wird Fluentd für Folgendes konfiguriert:

    • Für jeden Logeintrag mit dem Tag nginx.access verwendet Fluentd das Plug-in bigquery_insert, um den Eintrag in die BigQuery-Tabelle zu schreiben.
    • Die Authentifizierung erfolgt über das Dienstkonto der VM.
    • Der ursprüngliche Zeitstempel wird dem Eintrag als String hinzugefügt, der so formatiert ist, dass BigQuery ihn wieder in einen Zeitstempel konvertieren kann.
  5. Speichern Sie die Datei und beenden Sie den Editor.

  6. Starten Sie den Fluentd-Agent neu, um die neue Konfiguration anzuwenden.

    sudo systemctl restart td-agent
    

Weitere Informationen zu diesen Konfigurationsdatei-Parametern, einschließlich alternativer Authentifizierungsmethoden, finden Sie auf der BigQuery Fluentd-Plug-in-Website und in der Dokumentation zum Fluentd-Plug-in.

Logs in BigQuery ansehen

Nachdem Sie Fluentd konfiguriert haben, können Sie NGINX-Logdaten generieren und mit BigQuery ansehen.

  1. Öffnen Sie in der Cloud Console die Seite "Compute Engine-VM-Instanzen":

    Zur Seite "VM-Instanzen"

  2. Kopieren Sie die externe IP-Adresse der VM-Instanz nginx-vm.

  3. Fügen Sie in einem separaten Browsertab die IP-Adresse in das Adressfeld ein.

    Sie sehen die Standardseite Willkommen bei nginx!.

  4. Rufen Sie in der Cloud Console die BigQuery-Seite auf.

  5. Kopieren Sie die folgende Abfrage in den Bereich Abfrageeditor und klicken Sie auf Ausführen:

    SELECT * FROM `fluentd.nginx_access`
    

    Sie sehen im Bereich Abfrageergebnisse eine Zeile, die den Zugriffslogeintrag aus dem Browser enthält. Da auf Ihre VM über das Internet zugegriffen werden kann, werden möglicherweise auch Zugriffslogzeilen von anderen Remote-Hosts angezeigt.

Last simulieren und Statistiken aus den Logs berechnen

In diesem Abschnitt führen Sie Beispiellasten aus und sehen sich dann die Messwerte für diese Lasten mit BigQuery an. Die folgenden Schritte zeigen, dass BigQuery nicht nur zum Lesen von Logs, sondern auch zum Analysieren verwendet werden kann.

  1. Starten Sie Cloud Shell in der Cloud Console.
  2. Installieren Sie das Webserver-Benchmarking-Tool ApacheBench (ab) sowie die zugehörigen Tools:

     sudo apt install -y apache2-utils
    
  3. Erstellen Sie in Cloud Shell eine Testlast, die auf dem NGINX-Server ausgeführt werden soll. Ersetzen Sie dabei [IP_ADDRESS] durch die IP-Adresse Ihrer VM:

    ab -t 20 -c 1 http://[IP_ADDRESS]/
    

    Durch diesen Befehl wird mit dem ApacheBench-Tool eine Last von 20 Sekunden Länge für den NGINX-Server generiert.

  4. Rufen Sie in der Cloud Console die Seite BigQuery auf.

    Zur Seite "BigQuery"

  5. Rufen Sie mit der folgenden Abfrage im Bereich Abfrageeditor eine Liste der ApacheBench-Anfragen ab:

    SELECT * FROM `fluentd.nginx_access` limit 100
    
  6. Führen Sie den folgenden SQL-Befehl aus, um die Anzahl der Anfragen pro Antwortcode und Sekunde zu berechnen:

    SELECT
      time_sec, code, COUNT(*) as count
    FROM (
      SELECT
        TIMESTAMP_TRUNC(time, SECOND)AS time_sec, code
      FROM
        `fluentd.nginx_access`)
    GROUP BY
      time_sec, code
    ORDER BY
      time_sec DESC
    

    Die Werte pro Sekunde sollten ungefähr der Zeile Anfragen pro Sekunde in der ApacheBench-Ausgabe entsprechen, die Sie sich zuvor angesehen haben.

Optional: Batch-Ladeverfahren für das Logging großer Datenmengen verwenden

Wie bereits erwähnt lassen sich durch BigQuery-Streaming-Insert-Anweisungen (wie in dieser Anleitung verwendet) Daten innerhalb weniger Sekunden für Abfragen zur Verfügung stellen. Für diese Methode fällt eine geringe Gebühr an und für die Größe und Häufigkeit der Einfügungen gelten Limits.

Für das Logging größerer Datenmengen können Sie das Batch-Ladeverfahren von BigQuery nutzen. Wie der Name schon sagt, werden die Daten hierbei durch einen Batchjob mit niedrigerer Priorität geladen. Beim Batch-Ladeverfahren dauert es länger als bei Streaming-Insert-Anweisungen, bis die Daten geladen und verfügbar sind. Dafür fallen hierfür jedoch keine Gebühren an.

Wie bei Streaming-Insert-Anweisungen gelten Limits für die Häufigkeit der Ladejobs: 1.000 Ladejobs pro Tabelle und Tag sowie 50.000 Ladejobs pro Projekt und Tag.

Mit dem Fluentd-Plug-in bigquery_load können Sie das Batch-Ladeverfahren implementieren. Dieses Plug-in verwendet einen Fluentd-Zwischenspeicher, um eine Reihe von Logs in Dateien bis zu einem festgelegten Zeit- oder Größenlimit zu erfassen, bevor sie als Batch an BigQuery gesendet werden.

Führen Sie die folgenden Schritte aus, um das Batch-Ladeverfahren zu verwenden:

  1. Bearbeiten Sie die Fluentd-Konfigurationsdatei /etc/td-agent/td-agent.conf als Root-Nutzer.
  2. Ersetzen Sie die zuvor definierte Konfiguration des BigQuery-Ausgabe-Plug-ins durch die folgenden Zeilen. Ersetzen Sie [MY_PROJECT_NAME] durch den Namen des Google Cloud-Projekts.

    <match nginx.access>
      @type bigquery_load
    
      <buffer>
        @type file
        path /var/log/bigquery_nginx_access.*.buffer
        flush_at_shutdown true
        timekey_use_utc
        total_limit_size 1g
        flush_interval 3600
      </buffer>
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    Durch diese Konfiguration legen Sie fest, dass das Ausgabe-Plug-in bigquery_load anstelle des Plug-ins bigquery_insert verwendet werden soll.

    Im Abschnitt buffer ist definiert, dass die Logdaten in der VM zwischengespeichert werden sollen, bis Logs mit einem Volumen von bis zu 1 GB erfasst wurden oder bis maximal eine Stunde vergangen ist. Die Daten werden dann in BigQuery geladen. Weitere Informationen zu den Konfigurationsparametern finden Sie in der Plug-in-Dokumentation.

Fehlerbehebung

Sollten Sie den Verdacht haben, dass der Agent keine Logs erfasst oder sendet, können Sie seinen Status überprüfen. Führen Sie dazu den folgenden Befehl im Shell-Fenster der Fluentd-VM aus:

sudo systemctl status td-agent

Die Ausgabe zeigt den Aktivitätsstatus und die letzten Logzeilen des Dienstes an:

Active: active (running) since [DATE]

Falls der Agent nicht gestartet wird, ist die wahrscheinlichste Ursache ein Fehler in der Fluentd-Konfigurationsdatei. Dies wird in der Fluentd-Logdatei aufgezeichnet, die Sie mit diesem Befehl im VM-Shell-Fenster aufrufen können:

sudo less /var/log/td-agent/td-agent.log

Die folgende Ausgabe zeigt beispielsweise einen Fehler, wenn der Name eines Plug-ins nicht korrekt ist:

[info]: parsing config file is succeeded path="/etc/td-agent/td-agent.conf"
[error]: config error file="/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error="Unknown output plugin 'bad_plugin'. Run 'gem search -rd fluent-plugin' to find plugins"

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte