Dieses Dokument enthält Beispielabfragen zu Logeinträgen, die in Log-Buckets gespeichert sind, die auf die Verwendung von Loganalysen aktualisiert wurden.
Für diese Buckets können Sie SQL-Abfragen über die Seite Loganalysen in der Google Cloud Console ausführen. Weitere Beispiele finden Sie in den GitHub-Repositories logging-analytics-samples
und security-analytics
.
In diesem Dokument wird weder SQL noch das Weiterleiten und Speichern von Logeinträgen beschrieben. Informationen zu diesen Themen finden Sie im Abschnitt Weitere Informationen.
Hinweise
Wenn Sie die in diesem Dokument gezeigten Abfragen auf der Seite Loganalysen verwenden möchten, ersetzen Sie TABLE durch den Namen der Tabelle, die der Ansicht entspricht, die Sie abfragen möchten. Der Tabellenname hat das Format
project_ID.region.bucket_ID.view_ID
. Sie finden den Tabellennamen für eine Ansicht auf der Seite Loganalysen. Bei der Standardabfrage für eine Logansicht wird der Tabellenname in derFROM
-Anweisung aufgeführt. Informationen zum Zugreifen auf die Standardabfrage finden Sie unter Logansicht abfragen.Wenn Sie die in diesem Dokument gezeigten Abfragen auf der Seite BigQuery Studio verwenden möchten, ersetzen Sie TABLE durch den Pfad zur Tabelle im verknüpften Dataset. Wenn Sie beispielsweise die Ansicht
_AllLogs
für das verknüpfte Datasetmydataset
im Projektmyproject
abfragen möchten, legen Sie dieses Feld aufmyproject.mydataset._AllLogs
fest:Wählen Sie im Navigationsbereich der Google Cloud Console BigQuery aus:
So öffnen Sie die Seite Loganalysen:
-
Wählen Sie im Navigationsbereich der Google Cloud Console Logging und dann Loganalysen aus:
Optional: Suchen Sie in der Liste Logansichten nach der gewünschten Ansicht und wählen Sie den Namen der Ansicht aus, um das Tabellenschema für die Logansicht zu ermitteln.
Das Schema für die Tabelle wird angezeigt. Mit dem Feld Filter können Sie nach bestimmten Feldern suchen. Sie können das Schema nicht ändern.
-
Logs filtern
SQL-Abfragen bestimmen, welche Zeilen der Tabelle verarbeitet werden sollen. Dann gruppieren sie die Zeilen und führen Aggregatvorgänge aus. Wenn keine Gruppierungs- und Aggregationsvorgänge aufgeführt sind, enthält das Ergebnis der Abfrage die Zeilen, die vom Filtervorgang ausgewählt wurden. Die Beispiele in diesem Abschnitt veranschaulichen das Filtern.
Nach Uhrzeit filtern
Um den Zeitraum der Abfrage festzulegen, empfehlen wir die Verwendung der Zeitraumauswahl. Dieser Selektor wird automatisch verwendet, wenn bei einer Abfrage kein timestamp
-Feld in der WHERE
-Klausel angegeben ist.
Wenn Sie beispielsweise die Daten für die vergangene Woche anzeigen möchten, wählen Sie in der Zeitraumauswahl die Option Letzte 7 Tage aus. Über die Zeitraumauswahl können Sie auch eine Start- und Endzeit sowie eine Uhrzeit für die Ansicht festlegen und die Zeitzone ändern.
Wenn Sie ein timestamp
-Feld in die WHERE
-Klausel aufnehmen, wird die Einstellung für die Zeitraumauswahl nicht verwendet. Im folgenden Beispiel werden die Daten mithilfe der Funktion TIMESTAMP_SUB
gefiltert, mit der Sie ein Lookback-Intervall für die aktuelle Zeit angeben können:
WHERE
timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
Weitere Informationen zum Filtern nach Zeit finden Sie unter Zeitfunktionen und Zeitstempelfunktionen.
Nach Ressource filtern
Fügen Sie eine resource.type
-Einschränkung hinzu, um nach Ressource zu filtern.
Die folgende Abfrage liest beispielsweise die Daten der letzten Stunde. Dann werden die Zeilen beibehalten, deren Ressourcentyp mit gce_instance
übereinstimmt. Anschließend werden bis zu 100 Einträge sortiert und angezeigt:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM
`TABLE`
WHERE
resource.type = "gce_instance"
ORDER BY timestamp ASC
LIMIT 100
Nach Schweregrad filtern
Mit einer Einschränkung wie severity = 'ERROR'
können Sie nach einem bestimmten Schweregrad filtern. Eine weitere Möglichkeit besteht darin, die Anweisung IN
zu verwenden und eine Reihe gültiger Werte anzugeben.
Die folgende Abfrage liest beispielsweise die letzte Stunde an Daten und behält nur die Zeilen bei, die ein severity
-Feld mit dem Wert 'INFO'
oder 'ERROR'
enthalten:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM
`TABLE`
WHERE
severity IS NOT NULL AND
severity IN ('INFO', 'ERROR')
ORDER BY timestamp ASC
LIMIT 100
Die vorherige Abfrage filtert nach dem Wert des Felds severity
. Sie können jedoch auch Abfragen schreiben, die nach dem numerischen Wert des Logschweregrads filtern.
Wenn Sie beispielsweise die Zeilen severity
durch die folgenden Zeilen ersetzen, gibt die Abfrage alle Logeinträge mit dem Schweregrad NOTICE
zurück:
severity_number IS NOT NULL AND
severity_number > 200
Informationen zu den Aufzählungswerten finden Sie unter LogSeverity
.
Nach Logname filtern
Wenn Sie nach einem Lognamen filtern möchten, können Sie eine Einschränkung für den Wert des Felds log_name
oder log_id
festlegen. Das Feld log_name
enthält den Ressourcenpfad. Das Feld enthält also Werte wie projects/myproject/logs/mylog
.
Im Feld log_id
wird nur der Logname gespeichert, z. B. mylog
.
Die folgende Abfrage liest beispielsweise die letzte Stunde an Daten. Dann werden die Zeilen beibehalten, in denen der Wert im Feld log_id
cloudaudit.googleapis.com/data_access
ist. Anschließend werden die Ergebnisse sortiert und angezeigt:
SELECT
timestamp, log_id, severity, json_payload, resource, labels
FROM
`TABLE`
WHERE
log_id = "cloudaudit.googleapis.com/data_access"
ORDER BY timestamp ASC
LIMIT 100
Nach Ressourcenlabel filtern
Die meisten überwachten Ressourcendeskriptoren definieren Labels, mit denen die jeweilige Ressource identifiziert wird. Beispielsweise enthält der Deskriptor für eine Compute Engine-Instanz Labels für die Zone, die Projekt-ID und die Instanz-ID. Wenn der Logeintrag geschrieben wird, werden jedem Feld Werte zugewiesen. Hier ein Beispiel:
{
type: "gce_instance"
labels: {
instance_id: "1234512345123451"
project_id: "my-project"
zone: "us-central1-f"
}
}
Da der Datentyp des Felds labels
JSON ist, führt eine Einschränkung wie resource.labels.zone = "us-centra1-f"
in einer Abfrageergebnisse zu einem Syntaxfehler. Verwenden Sie die Funktion JSON_VALUE
, um den Wert eines Felds mit dem Datentyp JSON abzurufen.
Die folgende Abfrage liest beispielsweise die neuesten Daten und behält dann die Zeilen bei, bei denen die Ressource eine Compute Engine-Instanz in der Zone us-central1-f
ist:
SELECT
timestamp, log_name, severity, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
`TABLE`
WHERE
resource.type = "gce_instance" AND
JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC
LIMIT 100
Informationen zu allen Funktionen zum Abrufen und Transformieren von JSON-Daten finden Sie unter JSON-Funktionen.
Nach HTTP-Anfrage filtern
Wenn Sie die Tabelle so filtern möchten, dass nur Zeilen enthalten sind, die einer HTTP-Anfrage oder -Antwort entsprechen, fügen Sie eine http_request IS NOT NULL
-Einschränkung hinzu:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE`
WHERE
http_request IS NOT NULL
ORDER BY timestamp
LIMIT 100
Die folgende Abfrage enthält nur Zeilen, die GET
- oder POST
-Anfragen entsprechen:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE`
WHERE
http_request IS NOT NULL AND
http_request.request_method IN ('GET', 'POST')
ORDER BY timestamp ASC
LIMIT 100
Nach HTTP-Status filtern
Wenn Sie nach HTTP-Status filtern möchten, ändern Sie die WHERE
-Klausel so, dass das Feld http_request.status
definiert werden muss:
SELECT
timestamp, log_name, http_request.status, http_request, resource, labels
FROM
`TABLE`
WHERE
http_request IS NOT NULL AND
http_request.status IS NOT NULL
ORDER BY timestamp ASC
LIMIT 100
Um den Typ der in einem Feld gespeicherten Daten zu bestimmen, rufen Sie das Schema auf oder zeigen Sie das Feld an. Die Ergebnisse der vorherigen Abfrage zeigen, dass im Feld http_request.status
Ganzzahlwerte gespeichert werden.
Nach einem Feld mit einem JSON-Typ filtern
Verwenden Sie die Funktion JSON_VALUE
, um einen Wert aus einer Spalte mit dem Datentyp JSON zu extrahieren.
Betrachten Sie die folgenden Abfragen:
SELECT
json_payload
FROM
`TABLE`
WHERE
json_payload.status IS NOT NULL
und
SELECT
json_payload
FROM
`TABLE`
WHERE
JSON_VALUE(json_payload.status) IS NOT NULL
Bei den vorherigen Abfragen wird der Wert der Spalte json_payload
getestet. Der Inhalt dieser Spalte wird durch den Inhalt eines Logeintrags bestimmt. In beiden Abfragen werden Zeilen verworfen, die keine Spalte mit der Bezeichnung json_payload
enthalten.
Der Unterschied zwischen diesen beiden Abfragen ist die letzte Zeile, die definiert, was gegen NULL
getestet wird. Betrachten wir nun eine Tabelle mit zwei Zeilen. In einer Zeile hat die Spalte json_payload
das folgende Format:
{
status: {
measureTime: "1661517845"
}
}
In der anderen Zeile hat die Spalte json_payload
eine andere Struktur:
{
@type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
jobName: "projects/my-project/locations/us-central1/jobs/test1"
relativeUrl: "/food=cake"
status: "NOT_FOUND"
targetType: "APP_ENGINE_HTTP"
}
Beide vorherigen Zeilen erfüllen die Einschränkung json_payload.status IS NOT NULL
.
Das heißt, das Ergebnis der Abfrage enthält beide Zeilen.
Lautet die Einschränkung jedoch JSON_VALUE(json_payload.status) IS NOT NULL
, wird nur die zweite Zeile in das Ergebnis aufgenommen.
Nach regulärem Ausdruck filtern
Verwenden Sie die Funktion REGEXP_EXTRACT
, um den Teilstring zurückzugeben, der einem regulären Ausdruck entspricht. Der Rückgabetyp dieser Funktion ist entweder STRING
oder BYTES
.
Die folgende Abfrage zeigt die zuletzt empfangenen Logeinträge an, behält diese im Feld json_payload.jobName
bei und zeigt dann den Teil des Namens an, der mit test
beginnt:
SELECT
timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
`TABLE`
WHERE
json_payload.jobName IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20
Weitere Beispiele finden Sie in der Dokumentation zu REGEXP_EXTRACT
.
Beispiele für andere reguläre Ausdrücke, die Sie verwenden können, finden Sie unter Funktionen, Operatoren und Bedingungen.
Die in diesem Beispiel gezeigte Abfrage ist nicht effizient. Verwenden Sie für eine Teilstring-Übereinstimmung, wie in der Abbildung dargestellt, die Funktion CONTAINS_SUBSTR
.
Logeinträge gruppieren und aggregieren
Dieser Abschnitt baut auf den vorherigen Beispielen auf und zeigt, wie Sie Tabellenzeilen gruppieren und aggregieren können. Wenn Sie keine Gruppierung, aber eine Aggregation angeben, wird ein einzelnes Ergebnis ausgegeben, da SQL alle Zeilen, die die WHERE
-Klausel erfüllen, als eine Gruppe behandelt.
Jeder SELECT
-Ausdruck muss in den Gruppenfeldern enthalten oder aggregiert werden.
Nach Zeit gruppieren
Um Daten nach Zeit zu gruppieren, verwenden Sie die Funktion TIMESTAMP_TRUNC
, die einen Zeitstempel auf einen bestimmten Detaillierungsgrad wie MINUTE
kürzt. Ein Zeitstempel von 15:30:11
, der als hours:minutes:seconds
formatiert ist, wird beispielsweise zu 15:30:00
, wenn der Detaillierungsgrad auf MINUTE
festgelegt ist.
Die folgende Abfrage liest die Daten, die in dem von der Zeitraumauswahl angegebenen Intervall empfangen wurden, und behält dann die Zeilen bei, bei denen der Wert des Felds json_payload.status
nicht NULL ist.
Die Abfrage kürzt den Zeitstempel jeder Zeile nach Stunde und gruppiert die Zeilen dann nach dem abgeschnittenen Zeitstempel und Status:
SELECT
TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
JSON_VALUE(json_payload.status) AS status,
COUNT(*) AS count
FROM
`TABLE`
WHERE
json_payload IS NOT NULL AND
JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY hour,status
ORDER BY hour ASC
Weitere Beispiele finden Sie in der Dokumentation zu TIMESTAMP_TRUNC
.
Informationen zu anderen zeitbasierten Funktionen finden Sie unter Datum/Uhrzeit-Funktionen.
Nach Ressource gruppieren
Die folgende Abfrage liest die letzte Stunde an Daten und gruppiert die Zeilen dann nach Ressourcentyp. Dann wird die Anzahl der Zeilen für jeden Typ gezählt und eine Tabelle mit zwei Spalten zurückgegeben. Die erste Spalte enthält den Ressourcentyp und die zweite Spalte die Anzahl der Zeilen für diesen Ressourcentyp:
SELECT
resource.type, COUNT(*) AS count
FROM
`TABLE`
GROUP BY resource.type
LIMIT 100
Nach Schweregrad gruppieren
Die folgende Abfrage liest die letzte Stunde an Daten und behält Zeilen mit einem Feld für den Schweregrad bei. Die Abfrage gruppiert dann die Zeilen nach Schweregrad und zählt die Anzahl der Zeilen für jede Gruppe:
SELECT
severity, COUNT(*) AS count
FROM
`TABLE`
WHERE
severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100
Nach log_id
gruppieren
Das Ergebnis der folgenden Abfrage ist eine Tabelle mit zwei Spalten. Die erste Spalte enthält die Lognamen und die zweite die Anzahl der Logeinträge, die in der letzten Stunde in dieses Log geschrieben wurden. Die Abfrage sortiert die Ergebnisse nach der Anzahl der Einträge:
SELECT
log_id, COUNT(*) AS count
FROM
`TABLE`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100
Durchschnittliche Latenz für HTTP-Anfrage berechnen
Die folgende Abfrage veranschaulicht die Gruppierung nach mehreren Spalten und die Berechnung eines Durchschnittswerts. Die Abfrage gruppiert Zeilen nach der in der HTTP-Anfrage enthaltenen URL und nach dem Wert des Felds labels.checker_location
. Nach dem Gruppieren der Zeilen berechnet die Abfrage die durchschnittliche Latenz für jede Gruppe:
SELECT
JSON_VALUE(labels.checker_location) AS location,
AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
`TABLE`
WHERE
http_request IS NOT NULL AND
http_request.request_method IN ('GET')
GROUP BY http_request.request_url, location
ORDER BY location
LIMIT 100
Im vorherigen Ausdruck ist JSON_VALUE
erforderlich, um den Wert des Feldes labels.checker_location
zu extrahieren, da der Datentyp für labels
JSON ist.
Sie verwenden diese Funktion jedoch nicht, um den Wert aus dem Feld http_request.latency.seconds
zu extrahieren. Das letzte Feld hat den Datentyp „Ganzzahl“.
Durchschnittliche Byte, die für einen Subnetzwerktest gesendet wurden, berechnen
Die folgende Abfrage zeigt, wie Sie die durchschnittliche Anzahl von Byte anzeigen können, die nach Standort gesendet wurden.
Die Abfrage liest die Daten der letzten Stunde und behält dann nur die Zeilen bei, deren Ressourcentypspalte gce_subnetwork
und deren Spalte json_payload
nicht NULL ist. Als Nächstes gruppiert die Abfrage die Zeilen nach dem Standort der Ressource. Im Gegensatz zum vorherigen Beispiel, bei dem die Daten als numerischer Wert gespeichert sind, ist der Wert des Feldes bytes_sent
ein String. Daher müssen Sie den Wert vor der Berechnung des Durchschnitts in einen FLOAT64
umwandeln:
SELECT JSON_VALUE(resource.labels.location) AS location,
AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
`TABLE`
WHERE
resource.type = "gce_subnetwork" AND
json_payload IS NOT NULL
GROUP BY location
LIMIT 100
Das Ergebnis der vorherigen Abfrage ist eine Tabelle, in der jede Zeile einen Standort und die durchschnittlich für diesen Standort gesendeten Byte auflistet.
Informationen zu allen Funktionen zum Abrufen und Transformieren von JSON-Daten finden Sie unter JSON-Funktionen.
Informationen zu CAST
und anderen Konvertierungsfunktionen finden Sie unter Konvertierungsfunktionen.
Logeinträge mit einem Feld zählen, das einem Muster entspricht
Verwenden Sie die Funktion REGEXP_EXTRACT
, um den Teilstring zurückzugeben, der einem regulären Ausdruck entspricht. Der Rückgabetyp dieser Funktion ist entweder STRING
oder BYTES
.
Die folgende Abfrage behält die Logeinträge bei, bei denen der Wert des Felds json_payload.jobName
nicht NULL ist.
Anschließend werden die Einträge nach dem Namenssuffix gruppiert, das mit test
beginnt. Schließlich zählt die Abfrage die Anzahl der Einträge in jeder Gruppe:
SELECT
REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
COUNT(*) AS count
FROM
`TABLE`
WHERE
json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20
Weitere Beispiele finden Sie in der Dokumentation zu REGEXP_EXTRACT
.
Beispiele für andere reguläre Ausdrücke, die Sie verwenden können, finden Sie unter Funktionen, Operatoren und Bedingungen.
Spaltenübergreifende Suche
In diesem Abschnitt werden zwei verschiedene Ansätze beschrieben, mit denen Sie mehrere Spalten einer Tabelle durchsuchen können.
Tokenbasierte Suche
Mit der Funktion SEARCH
können Sie in einer Tabelle nach Einträgen suchen, die mit einer Reihe von Suchbegriffen übereinstimmen. Für diese Funktion sind zwei Parameter erforderlich: Wo gesucht werden soll und die Suchanfrage.
Da für die SEARCH
-Funktion bestimmte Regeln dafür gelten, wie die Daten durchsucht werden, empfehlen wir, die SEARCH
-Dokumentation zu lesen.
Die folgende Abfrage behält nur die Zeilen bei, deren Feld genau mit „35.193.12.15“ übereinstimmt:
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`TABLE` AS t
WHERE
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
SEARCH(t,"`35.193.12.15`")
ORDER BY timestamp ASC
LIMIT 20
In der vorherigen Abfrage wird der zu suchende Wert durch Backticks (Gravis) umschlossen. Dadurch wird sichergestellt, dass die SEARCH
-Funktion nach einer genauen Übereinstimmung zwischen einem Feldwert und dem Wert zwischen den Graviszeichen sucht.
Wenn Backticks im Abfragestring weggelassen werden, wird der Abfragestring basierend auf den in der SEARCH
-Dokumentation definierten Regeln aufgeteilt.
Wenn beispielsweise die folgende Anweisung ausgeführt wird, wird der Abfragestring in vier Tokens aufgeteilt: "35", "193", "12" und "15":
SEARCH(t,"35.193.12.15")
Die vorherige SEARCH
-Anweisung entspricht einer Zeile, wenn ein einzelnes Feld mit allen vier Tokens übereinstimmt. Die Reihenfolge der Tokens spielt keine Rolle.
Sie können mehrere SEARCH
-Anweisungen in eine Abfrage aufnehmen. In der vorherigen Abfrage könnten Sie den Filter für die Log-ID beispielsweise durch eine Anweisung wie die folgende ersetzen:
SEARCH(t,"`cloudaudit.googleapis.com/data_access`")
Mit der vorherigen Anweisung wird die gesamte Tabelle durchsucht, mit der ursprünglichen Anweisung dagegen nur in der Spalte log_id
.
Wenn Sie mehrere Suchvorgänge in einer Spalte durchführen möchten, trennen Sie die einzelnen Strings durch ein Leerzeichen. Die folgende Anweisung entspricht beispielsweise Zeilen, bei denen ein Feld "Hello World", "healthy" und "days" enthält:
SEARCH(t,"`Hello World` happy days")
Und schließlich können Sie auch nur in bestimmten Spalten einer Tabelle suchen, anstatt in der gesamten Tabelle. Mit der folgenden Anweisung werden beispielsweise nur die Spalten text_payload
und json_payload
gesucht:
SEARCH((text_payload, json_payload) ,"`35.222.132.245`")
Informationen dazu, wie die Parameter der SEARCH
-Funktion verarbeitet werden, finden Sie auf der BigQuery-Referenzseite Suchfunktionen.
Nach Teilstrings suchen
Verwenden Sie die Funktion CONTAINS_SUBSTR
, um einen Test durchzuführen, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird. So lässt sich feststellen, ob ein Wert in einem Ausdruck vorhanden ist.
Diese Funktion gibt TRUE
zurück, wenn der Wert vorhanden ist, andernfalls FALSE
. Der Suchwert muss ein STRING
-Literal sein, nicht aber das Literal NULL
.
Die folgende Abfrage ruft beispielsweise alle Audit-Logeinträge zum Datenzugriff mit einer bestimmten IP-Adresse ab, deren Zeitstempel in einem bestimmten Zeitraum liegen. Zuletzt sortiert die Abfrage die Ergebnisse und zeigt dann die 20 ältesten Ergebnisse an:
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`TABLE` AS t
WHERE
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
CONTAINS_SUBSTR(t,"35.193.12.15")
ORDER BY timestamp ASC
LIMIT 20
Mit der vorherigen Abfrage wird ein Teilstringtest durchgeführt. Daher entspricht eine Zeile, die "35.193.12.152" enthält, der Anweisung CONTAINS_SUBSTR
.
Daten aus mehreren Quellen kombinieren
Abfrageanweisungen scannen eine oder mehrere Tabellen oder Ausdrücke und geben die berechneten Ergebniszeilen zurück. Beispielsweise können Sie Abfrageanweisungen verwenden, um die Ergebnisse von SELECT
-Anweisungen auf verschiedene Weise in verschiedenen Tabellen oder Datasets zusammenzuführen und dann die Spalten aus den kombinierten Daten auszuwählen.
Daten aus zwei Tabellen mit Joins kombinieren
Wenn Sie Informationen aus zwei Tabellen kombinieren möchten, verwenden Sie einen der join-Operatoren. Der Join-Typ und die verwendete Bedingungsklausel bestimmen, wie Zeilen kombiniert und verworfen werden.
Die folgende Abfrage gibt die json_payload
-Felder aus Zeilen in zwei verschiedenen Tabellen zurück, die vom selben Trace-Span geschrieben werden. Die Abfrage führt ein inneres JOIN
über zwei Tabellen für Zeilen aus, bei denen die Werte der Spalten span_id
und trace
in beiden Tabellen übereinstimmen. Aus diesem Ergebnis wählt die Abfrage dann die Felder timestamp
, severity
und json_payload
aus TABLE_1, das Feld json_payload
von TABLE_2 und die Werte der Felder span_id
und trace
aus, für die die beiden Tabellen verknüpft wurden. Es werden bis zu 100 Zeilen zurückgegeben:
SELECT
a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM `TABLE_1` a
JOIN `TABLE_2` b
ON
a.span_id = b.span_id AND
a.trace = b.trace
LIMIT 100
Mehrfachauswahl mit Unions kombinieren
Mit dem Operator UNION
können Sie die Ergebnisse von zwei oder mehr SELECT
-Anweisungen kombinieren und doppelte Zeilen verwerfen. Verwenden Sie den Operator UNION ALL
, um doppelte Zeilen beizubehalten.
Die folgende Abfrage liest die letzte Stunde an Daten aus TABLE_1, führt das Ergebnis mit der letzten Stunde an Daten aus TABLE_2 zusammen, sortiert die zusammengeführten Daten durch Erhöhung des Zeitstempels und zeigt dann die ältesten 100 Einträge an:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM(
SELECT * FROM `TABLE_1`
UNION ALL
SELECT * FROM `TABLE_2`
)
ORDER BY timestamp ASC
LIMIT 100
Nächste Schritte
Informationen zum Weiterleiten und Speichern von Logeinträgen finden Sie in den folgenden Dokumenten:
- Log-Bucket erstellen
- Bucket zur Verwendung von Log Analytics aktualisieren
- Log-Bucket mit einem BigQuery-Dataset verknüpfen
- Senken konfigurieren und verwalten
Eine SQL-Referenzdokumentation finden Sie in den folgenden Dokumenten: