Esempi di query SQL

Questo documento contiene query di esempio sulle voci di log archiviate in bucket di log di cui è stato eseguito l'upgrade per l'utilizzo di Analisi dei log. Su questi bucket puoi eseguire query SQL dal pagina Analisi dei log nella console Google Cloud. Per altri esempi, consulta logging-analytics-samples e security-analytics repository GitHub.

Questo documento non descrive SQL o come indirizzare e archiviare le voci di log. Per informazioni su questi argomenti, consulta la sezione Passaggi successivi.

Prima di iniziare

  • Per utilizzare le query mostrate in questo documento nella pagina Analisi dei log, sostituisci TABLE con il nome della tabella corrispondente alla vista su cui vuoi eseguire la query. Il nome della tabella ha il formato project_ID.region.bucket_ID.view_ID. Puoi trovare il nome della tabella per nella pagina Analisi dei log; la query predefinita per un log visualizza indica i nomi della tabella nell'istruzione FROM. Per informazioni su come accedere alla query predefinita, consulta Eseguire query su una vista log.

  • Per utilizzare le query mostrate in questo documento nella Pagina BigQuery Studio, sostituisci TABLE con il percorso alla tabella nel set di dati collegato. Ad esempio, per eseguire query sulla vista _AllLogs sul set di dati collegato mydataset nel progetto myproject, imposta questo campo su myproject.mydataset._AllLogs:

    Nella console Google Cloud, vai alla pagina BigQuery:

    Vai a BigQuery Studio.

    Puoi trovare questa pagina anche utilizzando la barra di ricerca.

  • Per aprire la pagina Analisi dei log:

    1. Nella console Google Cloud, vai alla pagina Analisi dei log:

      Vai ad Analisi dei log

      Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

    2. (Facoltativo) Per identificare lo schema della tabella per la visualizzazione log: Nell'elenco Viste log, trova la vista e poi seleziona nome della vista.

    Viene visualizzato lo schema della tabella. Puoi utilizzare il campo Filtro per individuare campi specifici. Non puoi modificare lo schema.

Filtra log

Le query SQL determinano quali righe della tabella elaborare, quindi raggruppano le righe ed eseguire operazioni di aggregazione. Quando nessun raggruppamento e aggregazione vengono visualizzate, il risultato della query include le righe selezionate l'operazione di filtro. Gli esempi in questa sezione illustrano l'applicazione di filtri.

Filtra per ora

Per impostare l'intervallo di tempo della query, ti consigliamo di: utilizza il selettore dell'intervallo di tempo. Questo selettore viene utilizzato automaticamente quando una query non specifica un campo timestamp nella clausola WHERE. Ad esempio, per visualizzare i dati relativi alla settimana precedente, seleziona Ultimi 7 giorni da il selettore dell'intervallo di tempo. Puoi anche usare l'intervallo di tempo selettore per specificare un'ora di inizio e di fine, specificare un'ora in cui guardare il video e cambiare i fusi orari.

Se includi un campo timestamp nella clausola WHERE, l'intervallo di tempo non viene utilizzata l'impostazione del selettore. L'esempio seguente filtra i dati per utilizzando la funzione TIMESTAMP_SUB, che consente di specificare intervallo dall'ora corrente:

WHERE
  timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Per ulteriori informazioni su come filtrare per data, vedi Funzioni temporali e funzioni timestamp.

Filtra per risorsa

Per filtrare in base alla risorsa, aggiungi una restrizione resource.type.

Ad esempio, la seguente query legge l'ora di dati più recente, quindi conserva le righe il cui tipo di risorsa corrisponde a gce_instance e poi ordina e visualizza fino a 100 voci:

SELECT
  timestamp, log_name, severity, json_payload, resource, labels
FROM
  `TABLE`
WHERE
  resource.type = "gce_instance"
ORDER BY timestamp ASC
LIMIT 100

Filtra per gravità

Puoi filtrare in base a una gravità specifica con una restrizione come severity = 'ERROR'. Un'altra opzione è utilizzare l'istruzione IN e specificare un insieme di valori validi.

Ad esempio, la seguente query legge l'ora di dati più recente e e conserva solo le righe che contengono un campo severity il cui valore è 'INFO' o 'ERROR':

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

La query precedente filtra in base al valore del campo severity. Tuttavia, puoi anche scrivere query che filtrano in base al valore numerico della gravità del log. Ad esempio, se sostituisci le righe severity con le seguenti, la query restituisce tutte le voci di log con un livello di gravità minimo pari a NOTICE:

  severity_number IS NOT NULL AND
  severity_number > 200

Per informazioni sui valori enumerati, consulta LogSeverity

Filtra per nome log

Per filtrare in base al nome di log, puoi aggiungere una restrizione al valore della variabile log_name o il campo log_id. Il campo log_name include la risorsa del tuo percorso di apprendimento. Questo significa che questo campo ha valori quali projects/myproject/logs/mylog. Nel campo log_id viene memorizzato solo il nome del log, ad esempio mylog.

Ad esempio, la seguente query legge l'ora di dati più recente, quindi conserva le righe in cui il valore nel campo log_id è cloudaudit.googleapis.com/data_access, quindi ordina e visualizza i risultati:

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

Filtra per etichetta della risorsa

La maggior parte dei descrittori risorsa monitorata definisce le etichette utilizzate per identificare risorsa specifica. Ad esempio, il descrittore per un'istanza Compute Engine include le etichette per la zona, l'ID progetto e l'ID istanza. Quando viene scritta, i valori vengono assegnati a ciascun campo. Quello che segue è come ad esempio:

{
   type: "gce_instance"
   labels: {
      instance_id: "1234512345123451"
      project_id: "my-project"
      zone: "us-central1-f"
   }
}

Poiché il tipo di dati del campo labels è in formato JSON, include una restrizione come resource.labels.zone = "us-centra1-f" in una query genera una sintassi . Per ottenere il valore di un campo con un tipo di dati JSON, utilizza la funzione JSON_VALUE

Ad esempio, la seguente query legge i dati più recenti e quindi conserva nelle righe in cui la risorsa è un'istanza Compute Engine situato nella zona us-central1-f:

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

Per informazioni su tutte le funzioni che possono recuperare e trasformare JSON vedi Funzioni JSON.

Filtra per richiesta HTTP

Per filtrare la tabella in modo da includere solo le righe che corrispondono a una richiesta HTTP o rispondi, aggiungi una limitazione di tipo http_request IS NOT NULL:

SELECT
  timestamp, log_name, severity, http_request, resource, labels
FROM
  `TABLE`
WHERE
  http_request IS NOT NULL
ORDER BY timestamp
LIMIT 100

La seguente query include solo le righe che corrispondono a GET o POST richieste:

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

Filtra per stato HTTP

Per filtrare in base allo stato HTTP, modifica la clausola WHERE in modo che richieda il http_request.status campo da definire:

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

Per determinare il tipo di dati archiviati in un campo, visualizza lo schema o mostra campo. I risultati della query precedente mostrano che Il campo http_request.status memorizza valori interi.

Filtra per un campo con un tipo JSON

Per estrarre un valore da una colonna il cui tipo di dati è JSON, utilizza la funzione JSON_VALUE

Prendi in considerazione le seguenti query:

SELECT
  json_payload
FROM
  `TABLE`
WHERE
  json_payload.status IS NOT NULL

e

SELECT
  json_payload
FROM
  `TABLE`
WHERE
  JSON_VALUE(json_payload.status) IS NOT NULL

Le query precedenti verificano il valore della colonna json_payload. i contenuti di questa colonna è determinato dai contenuti di una voce di log. Entrambe le query ignora le righe che non contengono una colonna con l'etichetta json_payload. La differenza tra queste due query è l'ultima riga, che definisce di ciò che viene testato rispetto a NULL. Consideriamo ora una tabella con due righe. In uno riga, la colonna json_payload ha il seguente formato:

{
    status: {
        measureTime: "1661517845"
    }
}

Nell'altra riga, la colonna json_payload ha una struttura diversa:

{
    @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"
}

Entrambe le righe precedenti soddisfano la limitazione json_payload.status IS NOT NULL. In altre parole, il risultato della query include entrambe le righe. Tuttavia, quando la limitazione è JSON_VALUE(json_payload.status) IS NOT NULL, solo la seconda riga è inclusa nel risultato.

Filtra per espressione regolare

Per restituire la sottostringa che corrisponde a un'espressione regolare, utilizza la funzione REGEXP_EXTRACT Il tipo restituito di questa funzione è STRING o BYTES.

La seguente query mostra le voci di log ricevute più di recente, conserva queste voci con un campo json_payload.jobName, quindi visualizza parte del nome che inizia con test:

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

Per ulteriori esempi, consulta Documentazione di REGEXP_EXTRACT. Per esempi di altre espressioni regolari che che puoi utilizzare, consulta Funzioni, operatori e condizionali.

La query mostrata in questo esempio non è efficace. Per una corrispondenza di sottostringhe, ad esempio quella illustrata, utilizza la funzione CONTAINS_SUBSTR.

Raggruppa e aggrega le voci di log

Questa sezione si basa sugli esempi precedenti e illustra come puoi raggruppare e aggregare le righe delle tabelle. Se non specifichi un raggruppamento, specifica un'aggregazione, viene stampato un singolo risultato perché SQL tratta tutti righe che soddisfano la clausola WHERE come singolo gruppo.

Ogni espressione SELECT deve essere inclusa nei campi del gruppo o essere aggregata.

Raggruppa per ora

Per raggruppare i dati in base all'ora, utilizza la funzione TIMESTAMP_TRUNC, che tronca un timestamp a una granularità specificata come MINUTE. Per ad esempio un timestamp di 15:30:11, formattato come hours:minutes:seconds, diventa 15:30:00 quando la granularità è impostata su MINUTE.

La seguente query legge i dati ricevuti nell'intervallo specificato il selettore dell'intervallo di tempo e poi conserva le righe in cui il valore del campo json_payload.status non è NULL. La query tronca il timestamp su ogni riga per ora, quindi raggruppa righe in base al timestamp e allo stato troncati:

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

Per ulteriori esempi, consulta Documentazione di TIMESTAMP_TRUNC. Per informazioni sulle altre funzioni basate sul tempo, vedi Funzioni data/ora:

Raggruppa per risorsa

La seguente query legge l'ora più recente di dati, quindi raggruppa righe in base al tipo di risorsa. Quindi conteggia il numero di righe per ogni tipo, e restituisce una tabella con due colonne. Nella prima colonna sono elencate le risorse mentre la seconda colonna indica il numero di righe per quel tipo di risorsa:

SELECT
   resource.type, COUNT(*) AS count
FROM
  `TABLE`
GROUP BY resource.type
LIMIT 100

Raggruppa per gravità

La seguente query legge l'ora più recente di dati e poi conserva le righe con un campo di gravità. La query raggruppa quindi le righe per gravità conteggia il numero di righe per ogni gruppo:

SELECT
  severity, COUNT(*) AS count
FROM
  `TABLE`
WHERE
  severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100

Raggruppa per log_id

Il risultato della seguente query è una tabella con due colonne. Il primo colonna elenca i nomi log e la seconda colonna elenca il numero scritte nel log. La query ordina i risultati in base al conteggio delle voci:

SELECT
  log_id, COUNT(*) AS count
FROM
  `TABLE`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100

Latenza media di calcolo per richiesta HTTP

La seguente query illustra il raggruppamento in base a più colonne e il calcolo un valore medio. La query raggruppa le righe in base all'URL contenuto nella richiesta richiesta e dal valore del campo labels.checker_location. Dopo il giorno raggruppando le righe, la query calcola la latenza media per ogni gruppo:

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

Nell'espressione precedente, JSON_VALUE è necessario per estrarre il valore del campo labels.checker_location perché il tipo di dati labels è un file JSON. Tuttavia, non puoi utilizzare questa funzione per estrarre il valore dal campo http_request.latency.seconds. Quest'ultimo campo ha un tipo di dati numero intero.

Media di byte di calcolo inviati per un test della subnet

La seguente query illustra come potresti visualizzare il numero medio di byte inviati per località.

La query legge l'ora di dati più recente e poi conserva solo le righe in questione la cui colonna del tipo di risorsa è gce_subnetwork e la cui json_payload non è NULL. Successivamente, la query raggruppa le righe in base alla posizione risorsa. A differenza dell'esempio precedente, in cui i dati sono archiviati come numeri , il valore del campo bytes_sent è una stringa e pertanto devi converti il valore in FLOAT64 prima di calcolare la media:

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

Il risultato della query precedente è una tabella in cui ogni riga elenca una località e i byte medi inviati per quella località.

Per informazioni su tutte le funzioni che possono recuperare e trasformare JSON vedi Funzioni JSON.

Per informazioni su CAST e altre funzioni di conversione, consulta Funzioni di conversione.

Conta le voci di log con un campo corrispondente a un pattern

Per restituire la sottostringa che corrisponde a un'espressione regolare, utilizza la funzione REGEXP_EXTRACT Il tipo restituito di questa funzione è STRING o BYTES.

La seguente query conserva le voci di log per le quali il valore del campo json_payload.jobName non è NULL. Poi raggruppa le voci in base al suffisso del nome che inizia con test. Infine, la query conteggia il numero di voci in ogni gruppo:

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

Per ulteriori esempi, consulta Documentazione di REGEXP_EXTRACT. Per esempi di altre espressioni regolari che che puoi utilizzare, consulta Funzioni, operatori e condizionali.

Questa sezione descrive due diversi approcci che puoi utilizzare per cercare più colonne di una tabella.

Per cercare voci corrispondenti a un insieme di termini di ricerca in una tabella, utilizza la funzione SEARCH. Questa funzione richiede due parametri: dove effettuare la ricerca e la query di ricerca. Poiché la funzione SEARCH ha regole specifiche su come viene eseguita la ricerca nei dati, ti consigliamo di leggere la documentazione relativa all'SEARCH.

La seguente query conserva solo le righe che hanno un campo che corrisponde esattamente a "35.193.12.15":

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

Nella query precedente, gli apici inversi aggregano il valore da cercare. Questo Garantisce che la funzione SEARCH cerchi una corrispondenza esatta tra il valore del campo e il valore tra gli accenti inversi.

Quando gli apici inversi vengono omessi nella stringa di query, quest'ultima viene divisa in base alle regole definite nella documentazione di SEARCH. Ad esempio, quando viene eseguita la seguente istruzione, la stringa di query è suddivisa in quattro token: "35", "193", "12" e "15":

  SEARCH(t,"35.193.12.15")

L'istruzione SEARCH precedente corrisponde a una riga quando un singolo campo corrisponde a tutti e quattro i token. L'ordine dei token non è importante.

Puoi includere più istruzioni SEARCH in una query. Ad esempio, nel una query precedente, potresti sostituire il filtro sull'ID log con una come la seguente:

  SEARCH(t,"`cloudaudit.googleapis.com/data_access`")

L'istruzione precedente cerca nell'intera tabella, mentre l'istruzione originale cerca solo nella colonna log_id.

Per eseguire più ricerche in una colonna, separa le singole stringhe con uno spazio. Ad esempio, la seguente istruzione corrisponde alle righe in cui un campo contiene "Hello World", "happy" e "days":

  SEARCH(t,"`Hello World` happy days")

Infine, puoi cercare colonne specifiche di una tabella anziché cercare un l'intera tabella. Ad esempio, la seguente istruzione cerca solo le colonne denominate text_payload e json_payload:

   SEARCH((text_payload, json_payload) ,"`35.222.132.245`")

Per informazioni su come vengono elaborati i parametri della funzione SEARCH, consulta la pagina di riferimento di BigQuery Funzioni di ricerca.

Eseguire un test senza distinzione tra maiuscole e minuscole per determinare se esiste un valore in un utilizza la funzione CONTAINS_SUBSTR. Questa funzione restituisce TRUE quando il valore esiste e FALSE negli altri casi. Il valore di ricerca deve essere un valore letterale STRING, ma non il valore letterale NULL.

Ad esempio, la seguente query recupera tutte le voci del log di controllo di accesso ai dati con un indirizzo IP specifico i cui timestamp sono compresi in un determinato intervallo di tempo. Infine, la query ordina i risultati e mostra i 20 risultati meno recenti:

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

La query precedente esegue un test delle sottostringhe. Pertanto, una riga che contiene "35.193.12.152" corrisponde all'istruzione CONTAINS_SUBSTR.

Combinare dati da più origini

Le istruzioni di query analizzano una o più tabelle o espressioni e restituiscono il valore e le righe di risultati calcolate. Ad esempio, puoi utilizzare le istruzioni di query per unire risultati di istruzioni SELECT su tabelle o set di dati diversi in un in vari modi e poi selezionare le colonne dai dati combinati.

Combinare i dati di due tabelle con i join

Per combinare le informazioni di due tabelle, utilizza l'opzione join . Il tipo di join e la clausola condizionale utilizzata determinano come vengono combinate ed eliminate le righe.

La seguente query restituisce i campi json_payload delle righe in diverse tabelle scritte dallo stesso intervallo di traccia. La query esegue inner JOIN su due tabelle per le righe in cui i valori di le colonne span_id e trace in entrambe le tabelle corrispondono. Da questo risultato, la query seleziona quindi i campi timestamp, severity e json_payload proveniente da TABLE_1, il campo json_payload di TABLE_2 e i valori di span_id e trace campi su cui sono state unite le due tabelle e restituisce fino a 100 righe:

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

Combina più selezioni con le unioni

Per combinare i risultati di due o più istruzioni SELECT e ignorare righe duplicate, utilizza l'operatore UNION. Per conservare i duplicati di righe, utilizza l'operatore UNION ALL.

La seguente query legge l'ora più recente di dati da TABLE_1, unisce il risultato con l'ora più recente di provenienti da TABLE_2, ordina i dati uniti aumentando timestamp, quindi mostra le 100 voci meno recenti:

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

Passaggi successivi

Per informazioni su come instradare e archiviare le voci di log, consulta i seguenti documenti:

Per la documentazione di riferimento su SQL, consulta i seguenti documenti: