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. Es wird davon ausgegangen, dass Sie mit Google Cloud Platform (GCP), der Linux-Befehlszeile, der Erfassung von Anwendungslogs sowie der Loganalyse vertraut sind.

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 der Google Cloud Platform 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 in Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, registrieren Sie sich hier für ein neues Konto.

  2. Wählen Sie ein Google Cloud Platform-Projekt aus oder erstellen Sie eines.

    Zur Seite "Ressourcen verwalten"

  3. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Platform-Projekt aktiviert ist.

    Informationen zum Aktivieren der Abrechnung

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 den GCP Marketplace, um eine Compute Engine-Instanz zu erstellen, die für die Ausführung des NGINX-Webservers vorkonfiguriert ist.

  1. Rufen Sie in der GCP Console die Seite mit den Marketplace-Details für das Image Nginx (Google Click-to-Deploy) auf:

    Zur NGINX-Detailseite

  2. Klicken Sie auf In Compute Engine starten.

  3. Wenn Sie dazu aufgefordert werden, wählen Sie das zu verwendende GCP-Projekt aus.

  4. Warten Sie, bis die erforderlichen APIs aktiviert sind.

  5. Nennen Sie die Bereitstellung nginx.

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

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

  8. Lesen Sie die Informationen unter Nutzungsbedingungen.

  9. Wenn Sie den Bedingungen zustimmen, klicken Sie auf Bereitstellen.

    Im Bildschirm mit den Bereitstellungsdetails sehen Sie, dass eine neue VM in der von Ihnen angegebenen Zone erstellt und der NGINX-Webserver installiert wird.

  10. Warten Sie, bis die Bereitstellung abgeschlossen ist, bevor Sie fortfahren.

Berechtigungen gewähren

Die virtuelle Maschine benötigt zusätzliche Berechtigungen, um in BigQuery schreiben zu können. Zum Ändern der Berechtigungen müssen Sie zuerst die VM herunterfahren.

  1. Wechseln Sie in der GCP Console unter "Compute Engine" zur Seite "VM-Instanzen".

    Zur Seite "VM-Instanzen"

    Sie sehen eine neue VM-Instanz namens nginx-vm.

  2. Klicken Sie auf den VM-Namen, um die Detailseite für die VM zu öffnen.

  3. Klicken Sie oben auf der Seite auf Beenden.

    Es dauert einige Augenblicke, bis die VM heruntergefahren ist.

  4. Klicken Sie oben auf der Seite auf Bearbeiten.

  5. Scrollen Sie nach unten und ändern Sie den BigQuery-Zugriff in Aktiviert.

  6. Klicken Sie unten auf der Seite auf Speichern.

  7. Klicken Sie oben auf der Seite auf Starten, um die VM mit den geänderten Berechtigungen neu zu starten.

Schließen Sie diese Seite noch nicht. Sie arbeiten darauf im nächsten Abschnitt weiter.

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. Klicken Sie auf der Seite "VM-Instanzdetails" auf die Schaltfläche "SSH", um eine Verbindung zur Instanz herzustellen.
  2. 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 9.6 (stretch)
    Release:        9.6
    Codename:       stretch
    
  3. 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 Stretch finden Sie beispielsweise den folgenden Befehl:

    curl -L
       https://toolbelt.treasuredata.com/sh/install-debian-stretch-td-agent3.sh
       | sh
    
  4. 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.

  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:

    Zur 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 als 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 als Tabellenname nginx_access 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 Root-Nutzer (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. Fügen Sie am Ende der Datei die folgenden Zeilen hinzu, um das Tail-Eingabe-Plug-in zum Lesen der NGINX-Logs zu konfigurieren, sie mit dem NGINX-Parser zu parsen und sie mit dem Tag nginx.access zu versehen:

    <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 dabei [MY_PROJECT_NAME] durch den Namen Ihres GCP-Projekts:

    <match nginx.access>
      @type bigquery_insert
    
      # 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>
    

    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. Wechseln Sie in der GCP Console unter "Compute Engine" zur Seite "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 GCP Console die Seite BigQuery 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 GCP 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 GCP 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 dabei [MY_PROJECT_NAME] durch den Namen Ihres GCP-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

So vermeiden Sie, dass Ihrem Google Cloud Platform-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

  1. Rufen Sie in der GCP Console die Seite Projekte auf.

    Zur Seite Projekte

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

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...