Logbasierte Messwerte verwenden

Auf dieser Seite werden die Grundlagen zum Schreiben von Logs erläutert, die zur Erstellung von Verfügbarkeits- und Latenz-SLIs verwendet werden können. Außerdem werden Implementierungsbeispiele für die Definition von SLOs anhand logbasierter Messwerte angegeben.

Mit Datenelementen in Logeinträgen können Sie SLIs (Service Level Indicators) erstellen und vorhandene Lognutzlasten nutzen. Es ist auch möglich, vorhandenenen Diensten das Logging hinzuzufügen. Dies ist gegebenenfalls einfacher, als Messwertinstrumente zu erstellen.

Logs und Messwerte

Logs erfassen Datensätze, sogenannte Logeinträge, die bestimmte Ereignisse beschreiben, die in Computersystemen stattfinden. Logs werden durch Code geschrieben, und zwar von den Plattformdiensten, auf denen der Code ausgeführt wird (z. B. Dataflow) und der Infrastruktur, von der die Plattform abhängt (z. B. Compute Engine-Instanzen).

Da Logs in modernen Systemen von auf ein Laufwerk geschriebenen Texteinträgen abstammen (und manchmal noch Textdateien sind), stellt ein Logeintrag eine Zeile in einer Logdatei dar und kann als Quanteneinheit des Logging betrachtet werden.

Ein Logeintrag umfasst mindestens zwei Elemente:

  • Einen Zeitstempel, der angibt, wann das Ereignis eingetreten ist oder wann es in das Logging-System aufgenommen wurde.
  • Die Textnutzlast, entweder unstrukturierte Textdaten oder strukturierte Daten, meist in JSON.

Logs können auch zugehörige Metadaten enthalten, vor allem, wenn sie in Cloud Logging aufgenommen werden. Solche Metadaten können die Ressource, die das Log schreibt, den Lognamen sowie einen Schweregrad pro Eintrag umfassen.

Logs

Logs werden für zwei Hauptzwecke verwendet:

  • Ereignislogs beschreiben bestimmte Ereignisse, die im System stattfinden. Sie können Ereignislogs verwenden, um Nachrichten auszugeben, die Nutzer darüber informieren, dass alles gut funktioniert ("Aufgabe erfolgreich abgeschlossen") oder Informationen liefern, wenn etwas nicht funktioniert ("Ausnahme vom Server empfangen").
  • Transaktionslogs beschreiben die Details der von einem System oder einer Komponente verarbeiteten Transaktionen. Beispiel: Ein Load-Balancer protokolliert jede eingehende Anfrage, egal, ob sie erfolgreich abgeschlossen wurde oder nicht. Außerdem werden weitere Informationen aufgenommen, darunter die angeforderte URL, der HTTP-Antwortcode und eventuell Details wie das Back-End, über das die Anfrage gesendet wurde.

Messwerte

Im Gegensatz zu Logs beschreiben Messwerte normalerweise keine bestimmten Ereignisse. Normalerweise dienen Messwerte dazu, den Zustand oder die Gesundheit eines Systems im Zeitverlauf darzustellen. Ein Messwert besteht aus einer Reihe an Datenpunkten, die etwas im Zusammenhang mit Ihrem System messen. Jeder Datenpunkt enthält einen Zeitstempel und einen numerischen Wert.

Messwerten können auch Metadaten zugeordnet sein. Die Reihe an Datenpunkten, die als Zeitachsen bezeichnet werden, kann Informationen wie den Messwertnamen, eine Beschreibung und oft auch Labels enthalten, die angeben, welche Ressource die Daten schreibt. Informationen zum Monitoring-Messwertmodell finden Sie unter Messwerte, Zeitachsen und Ressourcen.

Logbasierte Messwerte

Logbasierte Messwerte sind aus Logeinträgen erstellte Messwerte. Dazu werden Informationen aus Logeinträgen extrahiert und in Zeitachsendaten umgewandelt. Cloud Logging bietet Mechanismen zur Erstellung von zwei Messwertarten aus Logeinträgen:

  • Zählermesswerte, mit denen die Logeinträge gezählt werden, die einem bestimmten Filter entsprechen. Beispielsweise können Sie mit einem Zählermesswert die Anzahl der im Log erfassten Anfragen oder Fehler erfassen.

  • Verteilungsmesswerte, die reguläre Ausdrücke verwenden, um die Nutzlast in den einzelnen Logeinträgen zu parsen und numerische Werte als Verteilung zu extrahieren.

Weitere Informationen zu logbasierten Messwerten in Cloud Logging finden Sie unter Logbasierte Messwerte verwenden.

Logbasierte Messwerte als SLIs verwenden

Mit logbasierten Messwerten können Sie Daten aus Logs in eine Form extrahieren, die zum Erstellen von SLIs in Monitoring verwendet werden kann:

  • Sie können logbasierte Messwerte für Zähler verwenden, um anfragebasierte Verfügbarkeits-SLIs auszudrücken.

  • Sie können logbasierte Ablaufmesswerte verwenden, um anfragebasierte Latenz-SLIs auszudrücken.

Beispiel für Logeinträge

Die Stack Doctor-Anwendung ist ein Beispiel für einen Dienst, der dazu dient, Lognachrichten auszugeben, die Informationen zu dienstrelevanten Anfragen, Fehlern und Latenzen enthalten. Der Code für den Dienst ist im GitHub-Repository stack-doctor verfügbar.

Der Dienst generiert Cloud Logging-Logeinträge im Log projects/stack-doctor/logs/bunyan_log. Der Logeintrag für die einzelnen Ereignistypen enthält einen anderen Wert für message. Die Logeinträge für verschiedene Ereignistypen sehen so aus:

  • Bei allen Anfragen:

    {
     "insertId": "..........iTRVT5MOK2VOsVe31bzrTD",
     "jsonPayload": {
       "pid": 81846,
       "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
       "hostname": "",
       "level": 30,
       "message": "request made",
       "v": 0,
       "name": "sli-log"
     },
       "resource": {
       "type": "global",
       "labels": {
         "project_id": "stack-doctor"
       }
     },
     "timestamp": "2020-09-01T03:30:49.263999938Z",
     "severity": "INFO",
     "logName": "projects/stack-doctor/logs/bunyan_log",
     "receiveTimestamp": "2020-09-01T03:30:50.003471183Z"
    }
    
  • Bei erfolgreichen Anfragen:

    {
     "insertId": "..........qTRVT5MOK2VOsVe31bzrTD",
     "jsonPayload": {
       "name": "sli-log",
       "v": 0,
       "pid": 81846,
       "level": 30,
       "hostname": "",
       "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
       "message": "success!"
     },
     "resource": {
       "type": "global",
       "labels": {
         "project_id": "stack-doctor"
       }
     },
     "timestamp": "2020-09-01T03:30:49.874000072Z",
     "severity": "INFO",
     "logName": "projects/stack-doctor/logs/bunyan_log",
     "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • Bei abgeschlossenen Anfragen:

    {
     "insertId": "..........mTRVT5MOK2VOsVe31bzrTD",
     "jsonPayload": {
       "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
       "level": 30,
       "name": "sli-log",
       "message": "slept for 606 ms",
       "hostname": "",
       "pid": 81846,
       "v": 0
     },
     "resource": {
       "type": "global",
       "labels": {
         "project_id": "stack-doctor"
       }
     },
     "timestamp": "2020-09-01T03:30:49.874000072Z",
     "severity": "INFO",
     "logName": "projects/stack-doctor/logs/bunyan_log",
     "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • Bei Fehlern:

    {
     "insertId": "..........DTRVT5MOK2VOsVe31bzrTD",
     "jsonPayload": {
       "hostname": "",
       "level": 50,
       "pid": 81846,
       "message": "failure!",
       "name": "sli-log",
       "time": "Mon Aug 31 2020 20:30:44 GMT-0700 (Pacific Daylight Time)",
       "v": 0
     },
     "resource": {
       "type": "global",
       "labels": {
         "project_id": "stack-doctor"
       }
     },
     "timestamp": "2020-09-01T03:30:44.414999961Z",
     "severity": "ERROR",
     "logName": "projects/stack-doctor/logs/bunyan_log",
     "receiveTimestamp": "2020-09-01T03:30:46.182157077Z"
    }
    

Anhand dieser Einträge können Sie logbasierte Messwerte erstellen, die Anfragen und Fehler zählen und die Anfragenlatenz verfolgen. Anschließend können Sie die logbasierten Messwerte verwenden, um Verfügbarkeits- und Latenz-SLIs zu erstellen.

Logbasierte Messwerte für SLIs erstellen

Um SLIs für logbasierte Messwerte zu erstellen, müssen Sie zuerst die logbasierten Messwerte erstellen.

  • Verwenden Sie für Verfügbarkeits-SLIs für Anforderungs- und Fehlerzmengen logbasierter Zählermesswerte.
  • Verwenden Sie für Latenz-SLIs logbasierte Messwerte für die Verteilung.

Nachdem Sie die logbasierten Messwerte erstellt haben, können Sie sie in Monitoring im Metrics Explorer suchen. In Monitoring haben logbasierte Messwerte das Präfix logging.googleapis.com/user.

Messwerte für Verfügbarkeits-SLIs

Um anfragebasierte Verfügbarkeits-SLIs in der Cloud Monitoring API auszudrücken verwenden Sie die Struktur TimeSeriesRatio, um ein Verhältnis von "guten" zu "schlechten" Anfragen einzurichten. Dieses Verhältnis wird im Feld goodTotalRatio einer RequestBasedSli-Struktur verwendet.

Sie müssen logbasierte Messwerte erstellen, um dieses Verhältnis zu erzeugen. Es müssen mindestens zwei der folgenden Elemente erstellt werden:

  1. Ein Messwert, mit dem alle Ereignisse gezählt werden. Verwenden Sie diesen Messwert im totalServiceFilter des Verhältnisses.

    Für das Beispiel "Stack-Doctor" können Sie einen logbasierten Messwert erstellen, mit dem Logeinträge gezählt werden, in denen der Nachrichtenstring "Anfrage gesendet" erscheint.

  2. Verwenden Sie diesen Messwert im badServiceFilter des Verhältnisses, um "schlechte" Ereignisse zu zählen.

    Für das Beispiel "Stack-Doctor" können Sie einen logbasierten Messwert erstellen, um Logeinträge zu zählen, in denen der Nachrichtenstring "Fehlgeschlagen!" erscheint.

  3. Verwenden Sie diesen Messwert im goodServiceFilter des Verhältnisses, um "gute" Ereignisse zu zählen.

    Für das Beispiel "Stack-Doctor" können Sie einen logbasierten Messwert erstellen, um Logeinträge zu zählen, in denen der Nachrichtenstring "Erfolg!" erscheint.

Der in diesem Beispiel beschriebene SLI basiert auf einem Messwert für die Gesamtzahl der Anfragen mit dem Namen log_based_total_requests und einem Messwert für Fehler namens log_based_errors.

Sie können logbasierte Messwerte mit der Google Cloud Console, der Cloud Logging API oder dem gcloud-Befehlszeilentools erstellen. Gehen Sie so vor, um logbasierte Messwerte mit der Cloud Console zu erstellen:

  1. Wählen Sie in der Cloud Console Logging und anschließend Logbasierte Messwerte aus.

    Weiter zu logbasierten Messwerten

    Die Seite der logbasierten Messwerte zeigt eine Tabelle mit benutzerdefinierten Messwerten und eine Tabelle mit systemdefinierten Messwerten.

  2. Klicken Sie über der Tabelle der benutzerdefinierten Messwerte auf Messwert erstellen.

  3. Wählen Sie im Bereich Messwerttyp die Option Zähler aus.

  4. Geben Sie im Bereich Details einen Namen für den neuen Messwert ein. Geben Sie für das Beispiel "stack-doctor" log_based_total_requests oder log_based_errors ein.

    Sie können die anderen Felder für dieses Beispiel ignorieren.

  5. Erstellen Sie im Bereich Filterauswahl eine Abfrage, mit der nur die Logeinträge abgerufen werden, die Sie mit Ihrem Messwert zählen möchten.

    Für das Beispiel "Stack-Doctor" kann die log_based_total_requests-Abfrage Folgendes enthalten:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="request made"
    

    Durch die logs_based_errors-Abfrage wird der Nachrichtenstring geändert:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="failure!"
    
  6. Klicken Sie auf Vorschau der Logs anzeigen, um den Filter zu prüfen und ggf. anzupassen.

  7. Ignorieren Sie den Bereich Labels für dieses Beispiel.

  8. Klicken Sie auf Messwert erstellen, um den Vorgang abzuschließen.

Weitere Informationen zum Erstellen logbasierter Zählermesswerte finden Sie unter Zählermesswert erstellen.

Messwerte für Latenz-SLIs

Zum Ausdrücken einer anfragebasierten Latenz-SLI in der Cloud Monitoring API nutzen Sie eine DistributionCut-Struktur, die im Feld distributionCut einer RequestBasedSli-Struktur verwendet wird. Sie müssen einen logbasierten Verteilungsmesswert erstellen, um Latenz-SLIs zu definieren. In diesem Beispiel wird ein logbasierter Verteilungsmesswert mit dem Namen log_based_latency. erstellt.

Sie können logbasierte Messwerte mit der Google Cloud Console, der Cloud Logging API oder dem gcloud-Befehlszeilentools erstellen. Gehen Sie so vor, um logbasierte Verteilungs-Messwerte mit der Cloud Console zu erstellen:

  1. Wählen Sie in der Cloud Console Logging und anschließend Logbasierte Messwerte aus.

    Weiter zu logbasierten Messwerten

    Die Seite der logbasierten Messwerte zeigt eine Tabelle mit benutzerdefinierten Messwerten und eine Tabelle mit systemdefinierten Messwerten.

  2. Klicken Sie über der Tabelle der benutzerdefinierten Messwerte auf Messwert erstellen.

  3. Wählen Sie im Bereich Messwerttyp die Option Verteilung aus.

  4. Geben Sie im Bereich Details einen Namen für den neuen Messwert ein. Geben Sie für das Beispiel "stack-doctor" log_based_latency ein.

    Sie können die anderen Felder für dieses Beispiel ignorieren.

  5. Erstellen Sie im Bereich Filterauswahl eine Abfrage, mit der nur die Logeinträge abgerufen werden, die Sie mit Ihrem Messwert zählen möchten.

    Für das Beispiel "Stack-Doctor" kann die log_based_latency-Abfrage Folgendes enthalten:

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="slept for"
    

    Geben Sie folgende Felder für die Filterabfrage an:

    • Feldname: json.message
    • Regulärer Ausdruck: \s(\d*)\s

      Der Nachrichtenstring für abgeschlossene Anfragen hat die Form "über n ms im Ruhemodus". Der reguläre Ausdruck extrahiert den Latenzwert n aus dem String.

  6. Ignorieren Sie den Bereich Labels für dieses Beispiel.

  7. Klicken Sie auf Messwert erstellen, um den Vorgang abzuschließen.

Weitere Informationen zum Erstellen logbasierter Verteilungsmesswerte finden Sie unter Verteilungsmesswerte erstellen.

Verfügbarkeits-SLIs

In Cloud Monitoring geben Sie anfragebasierte Verfügbarkeits-SLIs mit einer TimeSeriesRatio-Struktur an. Das folgende Beispiel zeigt ein SLO, das die Messwerte log_based_total_requests und log_based_errors im Verhältnis verwendet. Dieses SLO erwartet, dass das Verhältnis von "guten" zu allen Anfragen in einem gleitenden 24-Stunden-Zeitraum mindestens 98 % beträgt:

{
 "serviceLevelIndicator": {
   "requestBased": {
     "goodTotalRatio": {
       "totalServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_total_requests\"
          resource.type=\"global\"",
       "badServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_errors\"
          resource.type=\"global\""
     }
   }
 },
 "goal": 0.98,
 "rollingPeriod": "86400s",
 "displayName": "Log-Based Availability"
}

Latenz-SLIs

In Cloud Monitoring geben Sie anfragebasierte Latenz-SLIs mit einer DistributionCut-Struktur an. Folgendes Beispiel zeigt ein SLO, das den Messwert log_based_latency verwendet und erwartet, dass 98 % der Anfragen innerhalb eines rollierenden 24-Stunden-Zeitraums unter 500 ms liegen:

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"logging.googleapis.com/user/log_based_latency\"
          resource.type=\"global\"",
        "range": {
          "min": 0,
          "max": 500
        }
      }
    }
  },
  "goal": 0.98,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 500 ms"
}

Weitere Informationen