Esempi di query SQL

Questo documento contiene query di esempio che puoi utilizzare per eseguire query sui dati di log e traccia.

Supporto del linguaggio SQL

Le query utilizzate nella pagina Analisi dei log supportano le funzioni GoogleSQL con alcune eccezioni.

I seguenti comandi SQL non sono supportati per le query SQL emesse utilizzando la pagina Analisi dei log:

  • Comandi DDL e DML
  • Funzioni definite dall'utente JavaScript
  • Funzioni BigQuery ML
  • Variabili SQL

I seguenti elementi sono supportati solo quando esegui query su un set di dati collegato utilizzando le pagine BigQuery Studio e Looker Studio o utilizzando lo strumento a riga di comando bq:

  • Funzioni definite dall'utente JavaScript
  • Funzioni BigQuery ML
  • Variabili SQL

Best practice

Per impostare l'intervallo di tempo della query, ti consigliamo di utilizzare il selettore dell'intervallo di tempo. Ad esempio, per visualizzare i dati relativi all'ultima settimana, seleziona Ultimi 7 giorni dal selettore dell'intervallo di tempo. Puoi anche utilizzare il selettore dell'intervallo di tempo per specificare un'ora di inizio e di fine, specificare un'ora da visualizzare e modificare i fusi orari.

Dati di log

Se includi un campo timestamp nella clausola WHERE, l'impostazione del selettore dell'intervallo di tempo non viene utilizzata. Il seguente esempio mostra come filtrare in base al timestamp:

-- Matches log entries whose timestamp is within the most recent 1 hour.
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Dati di Trace

Se includi un campo start_time nella clausola WHERE, l'impostazione del selettore dell'intervallo di tempo non viene utilizzata. Il seguente esempio mostra come filtrare in base al timestamp:

-- Matches trace spans whose start_time is within the most recent 1 hour.
WHERE start_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Per saperne di più su come filtrare in base all'ora, vedi Funzioni temporali e Funzioni di timestamp.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Abilita l'API Observability.

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    Abilitare l'API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Abilita l'API Observability.

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    Abilitare l'API

  8. Per ottenere le autorizzazioni necessarie per caricare la pagina Log Analytics, scrivere, eseguire e salvare query private sui dati di traccia, chiedi all'amministratore di concederti i seguenti ruoli IAM:

    • Observability View Accessor (roles/observability.viewAccessor) sulle visualizzazioni di osservabilità che vuoi interrogare. Questo ruolo supporta le condizioni IAM, che ti consentono di limitare la concessione a una visualizzazione specifica. Se non colleghi una condizione alla concessione del ruolo, l'entità può accedere a tutte le visualizzazioni di osservabilità. Le visualizzazioni di osservabilità sono in Anteprima pubblica.
    • Observability Analytics User (roles/observability.analyticsUser) sul tuo progetto. Questo ruolo contiene le autorizzazioni necessarie per salvare ed eseguire query private ed eseguire query condivise.
    • Visualizzatore log (roles/logging.viewer) sul tuo progetto.
    • Logs View Accessor (roles/logging.viewAccessor) sul progetto che memorizza le visualizzazioni log su cui vuoi eseguire query.

    Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Come utilizzare le query in questa pagina

  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. Nel riquadro Query, fai clic su  SQL, poi copia e incolla una query nel riquadro Query SQL.

    Dati di log

    Prima di copiare una query, nella clausola FROM, sostituisci i seguenti campi

    • PROJECT_ID: l'identificatore del progetto.
    • LOCATION: la posizione della visualizzazione dei log o della visualizzazione di analisi.
    • BUCKET_ID: il nome o l'ID del bucket di log.
    • LOG_VIEW_ID: l'identificatore della visualizzazione dei log, che è limitato a 100 caratteri e può includere solo lettere, cifre, trattini bassi e trattini.

    Di seguito è riportato il formato della clausola FROM per una visualizzazione log:

    FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
    

    Gli esempi di log in questa pagina eseguono query su una visualizzazione di log. Per interrogare una vista Analytics, utilizza il seguente formato del percorso: `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. Nell'espressione precedente, PROJECT_ID è l'ID del tuo progetto e LOCATION e ANALYTICS_VIEW_ID sono la posizione e il nome della tua vista Analytics.

    Dati di Trace

    Di seguito è riportato il formato della causa FROM per l'interrogazione della visualizzazione _AllSpans:

    FROM `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
    

    La clausola FROM contiene i seguenti campi:

    • PROJECT_ID: l'identificatore del progetto.
    • LOCATION: la posizione del bucket di osservabilità.
    • _Trace è il nome del bucket osservabilità
    • Spans è il nome del set di dati.
    • _AllSpans è il nome della vista.

Per utilizzare le query mostrate in questo documento nella pagina BigQuery Studio o per utilizzare lo strumento a riga di comando bq, modifica la clausola FROM e inserisci il percorso del set di dati collegato.

Dati di log

Ad esempio, per eseguire una query sulla vista _AllLogs nel set di dati collegato denominato mydataset che si trova nel progetto myproject, il percorso è myproject.mydataset._AllLogs.

Dati di Trace

Ad esempio, per eseguire una query sulla visualizzazione _AllSpans nel set di dati collegato denominato my_linked_dataset che si trova nel progetto myproject, il percorso è `myproject.my_linked_dataset._AllSpans`.

Casi d'uso comuni

Questa sezione elenca diversi casi d'uso comuni che potrebbero aiutarti a creare le tue query personalizzate.

Mostra le voci di log nel bucket di log predefinito

Per eseguire una query sul bucket _Default, esegui la seguente query:

SELECT
  timestamp, severity, resource.type, log_name, text_payload, proto_payload, json_payload
FROM
  `PROJECT_ID.LOCATION._Default._AllLogs`
-- Limit to 1000 entries
LIMIT 1000

Estrai il valore del campo in base all'espressione regolare

Per estrarre un valore da una stringa utilizzando un'espressione regolare, utilizza la funzione REGEXP_EXTRACT:

SELECT
  -- Display the timestamp, and the part of the name that begins with test.
  timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Get the value of jobName, which is a subfield in a JSON structure.
  JSON_VALUE(json_payload.jobName) IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20

Per saperne di più, consulta la documentazione di REGEXP_EXTRACT.

Per le corrispondenze di sottostringa, come la query precedente, l'utilizzo della funzione CONTAINS_SUBSTR genera una query più efficiente.

Mostra tutti i dati di traccia

Per eseguire una query sulla visualizzazione _AllSpans, esegui la seguente query:

-- Display all data.
SELECT *
FROM `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
-- Limit to 10 entries.
LIMIT 10

Mostra informazioni sulla durata comune

Per mostrare le informazioni comuni dello span, come l'ora di inizio e la durata, esegui la seguente query:

SELECT
  start_time,
  -- Set the value of service name based on the first non-null value in the list.
  COALESCE(
    JSON_VALUE(resource.attributes, '$."service.name"'),
    JSON_VALUE(attributes, '$."service.name"'),
    JSON_VALUE(attributes, '$."g.co/gae/app/module"')) AS service_name,
  name AS span_name,
  duration_nano,
  status.code AS status,
  trace_id,
  span_id
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
LIMIT 10

Per saperne di più, consulta Espressioni condizionali.

Mostra il 50° e il 99° percentile della latenza dello span

Per mostrare il 50° e il 99° percentile della latenza per ogni servizio RPC, esegui la seguente query:

SELECT
  -- Compute 50th and 99th percentiles for each service
  STRING(attributes['rpc.service']) || '/' || STRING(attributes['rpc.method']) AS rpc_service_method,
  APPROX_QUANTILES(duration_nano, 100)[OFFSET(50)] AS duration_nano_p50,
  APPROX_QUANTILES(duration_nano, 100)[OFFSET(99)] AS duration_nano_p99
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
WHERE
  -- Matches spans whose kind field has a value of 2 (SPAN_KIND_SERVER).
  kind = 2
GROUP BY rpc_service_method

Per ulteriori informazioni sull'enumerazione, consulta la documentazione di OpenTelemetry: SpanKind.

Per visualizzare i risultati in formato grafico, puoi creare un grafico con la dimensione impostata su rpc_service_method. Potresti aggiungere due misure, una per la media del valore duration_nano_p50 e l'altra per la media del campo duration_nano_p99.

Filtrare le voci di log

Per applicare un filtro alla query, aggiungi una clausola WHERE. La sintassi che utilizzi in questa clausola dipende dal tipo di dati del campo. Questa sezione fornisce diversi esempi per diversi tipi di dati.

Filtrare le voci di log in base al tipo di payload

Le voci di log possono avere uno dei tre tipi di payload. Per filtrare le voci di log in base al tipo di payload, utilizza una delle seguenti clausole:

  • Payload di testo

    -- Matches log entries that have a text payload.
    WHERE text_payload IS NOT NULL
    
  • Payload JSON

    -- Matches log entries that have a JSON payload.
    WHERE json_payload IS NOT NULL
    
  • Payload protocollo

    -- Matches log entries that have a proto payload.
    -- Because proto_payload has a data type of RECORD, this statement tests
    -- whether a mandatory subfield exits.
    WHERE proto_payload.type IS NOT NULL
    

Nei risultati della query, i campi json_payload e proto_payload vengono visualizzati in formato JSON, che puoi esplorare.

Filtrare i dati di log in base al timestamp

Per filtrare le voci di log in base al timestamp, ti consigliamo di utilizzare il selettore intervallo di tempo. Tuttavia, puoi specificare anche timestamp nella clausola WHERE:

-- Matches log entries whose timestamp is within the most recent hour
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Per saperne di più su come filtrare in base all'ora, vedi Funzioni temporali e Funzioni timestamp.

Filtra per risorsa

Per filtrare i dati di log e traccia in base alla risorsa, aggiungi un'istruzione resource.type alla clausola WHERE:

-- Matches log entries whose resource type is gce_instance
WHERE resource.type = "gce_instance"

Filtra per gravità

Per filtrare i dati dei log in base a una gravità, aggiungi un'istruzione severity alla clausola WHERE:

-- Matches log entries whose severity is INFO or ERROR
WHERE severity IS NOT NULL AND severity IN ('INFO', 'ERROR')

Puoi anche filtrare le voci di log in base a severity_number, che è un numero intero. Ad esempio, la seguente clausola corrisponde a tutte le voci di log il cui livello di gravità è almeno NOTICE:

-- Matches log entries whose severity level is at least NOTICE
WHERE severity_number IS NOT NULL AND severity_number > 200

Per informazioni sui valori enumerati, consulta la sezione LogSeverity.

Filtra per nome del log

Per filtrare i dati dei log in base a un nome di log, aggiungi un'istruzione log_name o log_id alla clausola WHERE:

  • Il nome del log specifica il percorso della risorsa:

    -- Matches log entries that have the following log ID.
    WHERE log_name="projects/cloud-logs-test-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  • L'ID log omette il percorso della risorsa:

    -- Matches log entries that have the following log id.
    WHERE log_id = "cloudaudit.googleapis.com/data_access"
    

Filtra le voci di log in base all'etichetta della risorsa

Le etichette delle risorse vengono memorizzate come struttura JSON. Per filtrare in base al valore di un campo all'interno di una struttura JSON, utilizza la funzione JSON_VALUE:

SELECT
  timestamp, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries whose resource type is gce_instance and whose zone is
  -- us-central1-f. Because resource has data type JSON, you must use JSON_VALUE
  -- to get the value for subfields, like zone.
  resource.type = "gce_instance" AND
  JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC

La query precedente si basa sul formato delle etichette delle risorse, così come sono archiviate in una voce di log. Di seguito è riportato un esempio del campo risorsa:

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

Per informazioni su tutte le funzioni che possono recuperare e trasformare i dati JSON, consulta Funzioni JSON.

Filtra per richiesta HTTP

Per eseguire query solo sulle voci di log che hanno un campo di richiesta HTTP, utilizza la seguente clausola:

-- Matches log entries that have a HTTP request_method field.
-- Don't compare http_request to NULL. This field has a data type of RECORD.
WHERE http_request.request_method IS NOT NULL

Puoi anche utilizzare l'istruzione IN:

-- Matches log entries whose HTTP request_method is GET or POST.
WHERE http_request.request_method IN ('GET', 'POST')

Filtra per stato HTTP

Per eseguire query solo sulle voci di log con uno stato HTTP, utilizza la seguente clausola:

-- Matches log entries that have an http_request.status field.
WHERE http_request.status IS NOT NULL

Filtrare in base a un campo all'interno di un tipo di dati JSON

Per eseguire query solo sulle voci di log quando il sottocampo di un campo con un tipo di dati JSON ha un valore specifico, estrai il valore utilizzando la funzione JSON_VALUE:

-- Compare the value of the status field to NULL.
WHERE JSON_VALUE(json_payload.status) IS NOT NULL

La clausola precedente è leggermente diversa dalla seguente:

-- Compare the status field to NULL.
WHERE json_payload.status IS NOT NULL

La prima clausola verifica se il valore del campo stato è NULL. La seconda clausola verifica se esiste il campo dello stato. Supponiamo che una visualizzazione di log contenga due voci di log. Per una voce di log, il campo json_payload ha il seguente formato:

{
    status: {
        measureTime: "1661517845"
    }
}

Per l'altra voce di log, il campo 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"
}

La clausola WHERE json_payload.status IS NOT NULL corrisponde a entrambe le voci di log. Tuttavia, la clausola WHERE JSON_VALUE(json_payload.status) IS NOT NULL corrisponde solo alla seconda voce di log.

Filtra voci di traccia

Per applicare un filtro alla query, aggiungi una clausola WHERE. La sintassi che utilizzi in questa clausola dipende dal tipo di dati del campo. Questa sezione fornisce diversi esempi per diversi tipi di dati.

Filtrare per tipi di dati stringa

Il campo name viene memorizzato come String.

  • Per analizzare solo gli intervalli in cui è specificato name, utilizza la seguente clausola:

    -- Matches spans that have a name field.
    WHERE name IS NOT NULL
    
  • Per analizzare solo gli intervalli in cui name ha il valore "POST", utilizza la seguente clausola:

    -- Matches spans whose name is POST.
    WHERE STRPOS(name, "POST") > 0
    
  • Per analizzare solo gli intervalli in cui name contiene il valore "POST", utilizza l'operatore LIKE insieme ai caratteri jolly:

    -- Matches spans whose name contains POST.
    WHERE name LIKE "%POST%"
    

Filtra per tipi di dati interi

Il campo kind è un numero intero che può assumere valori compresi tra zero e cinque:

  • Per analizzare solo gli intervalli in cui è specificato kind, utilizza la seguente clausola:

    -- Matches spans that have field named kind.
    WHERE kind IS NOT NULL
    
  • Per analizzare gli intervalli il cui valore di kind è uno o due, utilizza la seguente clausola:

    -- Matches spans whose kind value is 1 or 2.
    WHERE kind IN (1, 2)
    

Filtra per tipi di dati RECORD

Alcuni campi nello schema di traccia hanno un tipo di dati RECORD. Questi campi possono archiviare una o più strutture di dati oppure voci ripetute della stessa struttura di dati.

Filtrare per stato o codice di stato

Il campo status è un esempio di campo il cui tipo di dati è RECORD. Questo campo memorizza una struttura di dati, con membri etichettati code e message.

  • Per analizzare gli intervalli solo quando il campo status.code ha un valore di 1, aggiungi la seguente clausola:

    -- Matches spans that have a status.code field that has a value of 1.
    WHERE status.code = 1
    

    Il campo status.code viene memorizzato come numero intero.

  • Per analizzare gli intervalli in cui il campo status non è EMPTY, aggiungi la seguente clausola:

    -- Matches spans that have status field. When the status field exists, it
    -- must contain a subfield named code.
    -- Don't compare status to NULL, because this field has a data type of RECORD.
    WHERE status.code IS NOT NULL
    

I campi events e links vengono archiviati con un tipo di dati RECORD, ma si tratta di campi ripetuti.

  • Per trovare intervalli con almeno un evento, utilizza la seguente clausola:

    -- Matches spans that have at least one event. Don't compare events to NULL.
    -- The events field has data type of RECORD and contains a repeated fields.
    WHERE ARRAY_LENGTH(events) > 0
    
  • Per trovare corrispondenze con gli intervalli che hanno un evento il cui campo name ha il valore message, utilizza la seguente clausola:

    WHERE
      -- Exists is true when any event in the array has a name field with the
      -- value of message.
      EXISTS(
        SELECT 1
        FROM UNNEST(events) AS ev
        WHERE ev.name = 'message'
      )
    

Filtrare per tipi di dati JSON

Il campo attributes è di tipo JSON. Ogni singolo attributo è una coppia chiave-valore.

  • Per analizzare solo gli intervalli in cui è specificato attributes, utilizza la seguente clausola:

    -- Matches spans where at least one attribute is specified.
    WHERE attributes IS NOT NULL
    
  • Per analizzare solo gli intervalli in cui la chiave dell'attributo denominata component ha un valore di "proxy", utilizza la seguente clausola:

    -- Matches spans that have an attribute named component with a value of proxy.
    WHERE attributes IS NOT NULL
          AND JSON_VALUE(attributes, '$.component') = 'proxy'
    

    Puoi anche utilizzare un'istruzione LIKE insieme ai caratteri jolly per eseguire un test di contenimento:

    -- Matches spans that have an attribute named component whose value contains proxy.
    WHERE attributes IS NOT NULL
          AND JSON_VALUE(attributes, '$.component') LIKE '%proxy%'
    

Raggruppare e aggregare le voci di log

Questa sezione si basa sugli esempi precedenti e mostra come raggruppare e aggregare le voci di log. Se non specifichi un raggruppamento, ma un'aggregazione, viene stampato un risultato perché SQL considera tutte le righe che soddisfano la clausola WHERE come un unico gruppo.

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

Raggruppa le voci di log per timestamp

Per raggruppare i dati in base al timestamp, utilizza la funzione TIMESTAMP_TRUNC, che tronca un timestamp a una granularità specificata, ad esempio HOUR:

SELECT
  -- Truncate the timestamp by hour.
  TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
  JSON_VALUE(json_payload.status) AS status,
  -- Count the number log entries in each group.
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries that have a status field whose value isn't NULL.
  json_payload IS NOT NULL AND JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY
  -- Group by hour and status
  hour,status
ORDER BY hour ASC

Per saperne di più, consulta la documentazione di TIMESTAMP_TRUNC e le funzioni di data e ora.

Raggruppa le voci di log per risorsa

La seguente query mostra come raggruppare le voci di log per tipo di risorsa e poi contare il numero di voci di log in ogni gruppo:

SELECT
   -- Count the number of log entries for each resource type
   resource.type, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY resource.type
LIMIT 100

Raggruppa le voci di log per gravità

La seguente query mostra come raggruppare le voci di log in base alla gravità e poi contare il numero di voci di log in ogni gruppo:

SELECT
  -- Count the number of log entries for each severity.
  severity, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100

Raggruppa le voci di log in base al relativo log_id

La seguente query mostra come raggruppare le voci di log in base all'ID log e quindi contare il numero di voci di log in ogni gruppo:

SELECT
  -- Count the number of log entries for each log ID.
  log_id, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100

Calcola la latenza media delle richieste HTTP per URL

La seguente query mostra come raggruppare le voci di log per URL e posizione della richiesta HTTP e poi contare il numero di voci di log in ogni gruppo:

SELECT
  -- Compute the average latency for each group. Because the labels field has a
  -- data type of JSON, use JSON_VALUE to get the value of checker_location.
  JSON_VALUE(labels.checker_location) AS location,
  AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries when the request_method field is GET.
  http_request IS NOT NULL AND http_request.request_method IN ('GET')
GROUP BY
  -- Group by request URL and location
  http_request.request_url, location
ORDER BY location
LIMIT 100

Calcola i byte medi inviati per un test della subnet

La seguente query mostra come raggruppare le voci di log in base alla località specificata nelle etichette delle risorse e quindi calcolare il numero di voci di log in ogni gruppo:

SELECT
  -- Compute the average number of bytes sent per location. Because labels has
  -- a data type of JSON, use JSON_VALUE to get the value of the location field.
  -- bytes_sent is a string. Must cast to a FLOAT64 before computing average.
  JSON_VALUE(resource.labels.location) AS location,
  AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  resource.type = "gce_subnetwork" AND json_payload IS NOT NULL
GROUP BY
  -- Group by location
  location
LIMIT 100

Per saperne di più, consulta Funzioni JSON e Funzioni di conversione.

Conta le voci di log con un campo che corrisponde a un pattern

Per restituire la sottostringa che corrisponde a un'espressione regolare, utilizza la funzione REGEXP_EXTRACT:

SELECT
  -- Extract the value that begins with test.
  -- Count the number of log entries for each name.
  REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20

Per altri esempi, consulta la documentazione di REGEXP_EXTRACT.

Raggruppare e aggregare i dati di traccia

Questa sezione illustra come raggruppare e aggregare gli span. Se non specifica un raggruppamento, ma specifica un'aggregazione, viene stampato un risultato perché SQL considera tutte le voci che soddisfano la clausola WHERE come un unico gruppo.

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

Raggruppa intervalli per ora di inizio

Per raggruppare i dati in base all'ora di inizio, utilizza la funzione TIMESTAMP_TRUNC, che tronca un timestamp a una granularità specificata, ad esempio HOUR:

SELECT
  -- Truncate the start time to the hour. Count the number of spans per group.
  TIMESTAMP_TRUNC(start_time, HOUR) AS hour,
  status.code AS code,
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
WHERE
  -- Matches spans shows start time is within the previous 12 hours.
  start_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 12 HOUR)
GROUP BY
  -- Group by hour and status code.
  hour, code
ORDER BY hour DESC

Per saperne di più, consulta la documentazione di TIMESTAMP_TRUNC e le funzioni di data e ora.

Conteggio degli intervalli per codice di stato

Per visualizzare il conteggio degli span con un codice di stato specifico, esegui la seguente query:

SELECT
  -- Count the number of spans for each status code.
  status.code,
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
WHERE status.code IS NOT NULL
GROUP BY status.code

Se sostituisci status.code con kind, la query precedente riporta il numero di intervalli per ogni valore dell'enumerazione kind. Analogamente, se sostituisci status.code con name, i risultati della query elencano il numero di voci per ogni nome di intervallo.

Calcola la durata media di tutti gli intervalli

Per visualizzare la durata media, dopo aver raggruppato i dati degli intervalli per nome dell'intervallo, esegui la seguente query:

SELECT
  -- Group by name, and then compute the average duration for each group.
  name,
  AVG(duration_nano) AS nanosecs,
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
GROUP BY name
ORDER BY nanosecs DESC

Calcola la durata media e i percentili per nome del servizio

La seguente query calcola il conteggio degli span e varie statistiche per ogni servizio:

SELECT
  -- Set the service name by the first non-null value.
  COALESCE(
    JSON_VALUE(resource.attributes, '$."service.name"'),
    JSON_VALUE(attributes, '$."service.name"'),
    JSON_VALUE(attributes, '$."g.co/gae/app/module"')) AS service_name,

  -- Count the number spans for each service name. Also compute statistics.
  COUNT(*) AS span_count,
  AVG(duration_nano) AS avg_duration_nano,
  MIN(duration_nano) AS min_duration_nano,
  MAX(duration_nano) AS max_duration_nano,

  -- Calculate percentiles for duration
  APPROX_QUANTILES(duration_nano, 100)[OFFSET(50)] AS p50_duration_nano,
  APPROX_QUANTILES(duration_nano, 100)[OFFSET(95)] AS p95_duration_nano,
  APPROX_QUANTILES(duration_nano, 100)[OFFSET(99)] AS p99_duration_nano,

  -- Count the number of unique trace IDs. Also, collect up to 5 unique
  -- span names and status codes.
  COUNT(DISTINCT trace_id) AS distinct_trace_count,
  ARRAY_AGG(DISTINCT name IGNORE NULLS LIMIT 5) AS sample_span_names,
  ARRAY_AGG(DISTINCT status.code IGNORE NULLS LIMIT 5) AS sample_status_codes
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans`
GROUP BY service_name
ORDER BY span_count DESC

Questa sezione descrive due approcci che puoi utilizzare per eseguire ricerche in più colonne della visualizzazione su cui stai eseguendo query:

  • Ricerche basate su token: specifichi la posizione di ricerca, una query di ricerca e poi utilizzi la funzione SEARCH. Poiché la funzione SEARCH ha regole specifiche per la ricerca dei dati, ti consigliamo di leggere la SEARCH documentazione.

  • Ricerche basate su sottostringhe: fornisci la posizione di ricerca, una stringa letterale e poi utilizza la funzione CONTAINS_SUBSTR. Il sistema esegue un test senza distinzione tra maiuscole e minuscole per determinare se il valore letterale stringa esiste in un'espressione. La funzione CONTAINS_SUBSTR restituisce TRUE quando esiste il valore letterale stringa e FALSE in caso contrario. Il valore di ricerca deve essere un valore letterale STRING, ma non il valore letterale NULL.

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
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
  -- Search data access audit logs for the IP address that matches 35.193.12.15.
  -- The use of backticks prevents the string from being tokenized.
  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

Quando gli apici inversi vengono omessi nella stringa di query, la stringa di query viene suddivisa in base alle regole definite nella documentazione di SEARCH. Ad esempio, quando viene eseguita la seguente istruzione, la stringa di query viene 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, nella query precedente puoi sostituire il filtro sull'ID log con un'istruzione come la seguente:

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

L'istruzione precedente esegue la ricerca in ogni campo delle voci di log nella visualizzazione log, mentre l'istruzione originale esegue la ricerca solo nel campo log_id delle voci di log.

Per eseguire più ricerche su più campi, 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 campi specifici anziché un'intera tabella. Ad esempio, la seguente istruzione esegue la ricerca solo nelle 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.

Ad esempio, la seguente query recupera tutte le voci di audit log degli accessi ai dati con un indirizzo IP specifico i cui timestamp rientrano in un intervallo di tempo specifico. Infine, la query ordina i risultati e mostra i 20 più vecchi:

SELECT
  timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
  -- Search data access audit logs for the IP address that matches 35.193.12.15.
  -- CONTAINS_SUBSTR performs a contains-test.
  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

Eseguire query su più viste

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

Per unire le visualizzazioni, si applicano le seguenti limitazioni:

  1. Le posizioni delle visualizzazioni soddisfano uno dei seguenti requisiti:

    • Tutte le visualizzazioni hanno la stessa posizione.
    • Tutte le visualizzazioni si trovano nella posizione global o us.
  2. Quando le risorse di archiviazione utilizzano le chiavi di crittografia gestite dal cliente (CMEK), deve essere vera una delle seguenti condizioni:

    • Le risorse di archiviazione che utilizzano CMEK utilizzano la stessa chiave Cloud KMS.
    • Le risorse di archiviazione che utilizzano CMEK hanno un antenato comune e questo antenato specifica una chiave Cloud KMS predefinita che si trova nella stessa località delle risorse di archiviazione.

    Quando una o più risorse di archiviazione utilizzano CMEK, il sistema cripta i dati temporanei generati dall'unione con la chiave Cloud KMS comune o con la chiave Cloud KMS predefinita dell'elemento principale.

Ad esempio, supponiamo di avere due viste che si trovano nella stessa posizione. Puoi unire queste visualizzazioni quando si verifica una delle seguenti condizioni:

  • Le risorse di archiviazione non utilizzano CMEK.
  • Una risorsa di archiviazione utilizza CMEK e l'altra no.
  • Entrambe le risorse di archiviazione utilizzano CMEK e la stessa chiave Cloud KMS.
  • Entrambe le risorse di archiviazione utilizzano CMEK, ma chiavi diverse. Tuttavia, le risorse condividono un antenato che specifica una chiave Cloud KMS predefinita che si trova nella stessa posizione delle risorse di archiviazione.

    Ad esempio, supponiamo che la gerarchia delle risorse per un bucket dei log e un bucket di osservabilità includa la stessa organizzazione. Puoi unire le visualizzazioni di questi bucket quando, per l'organizzazione, hai configurato le impostazioni predefinite delle risorse per Cloud Logging e per i bucket di osservabilità con la stessa chiave Cloud KMS predefinita per la posizione di archiviazione.

Unire due visualizzazioni log in base all'ID traccia

Per combinare le informazioni di due tabelle, utilizza uno degli operatori join:

SELECT
  -- Do an inner join on two tables by using the span ID and trace ID.
  -- Don't join only by span ID, as this field isn't globally unique.
  -- From the first view, show the timestamp, severity, and JSON payload.
  -- From the second view, show the JSON payload.
  a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1` a
JOIN  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2` b
ON
  a.span_id = b.span_id AND
  a.trace = b.trace
LIMIT 100

Esegui query su due visualizzazioni di log con un'istruzione union

Per combinare i risultati di due o più istruzioni SELECT ed eliminare le righe duplicate, utilizza l'operatore UNION. Per conservare le righe duplicate, utilizza l'operatore UNION ALL:

SELECT
  timestamp, log_name, severity, json_payload, resource, labels
-- Create a union of two log views
FROM(
  SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1`
  UNION ALL
  SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2`
)
-- Sort the union by timestamp.
ORDER BY timestamp ASC
LIMIT 100

Unire i dati di traccia e di log utilizzando l'ID traccia

La seguente query unisce i dati di log e traccia utilizzando gli ID span e traccia:

SELECT
  T.trace_id,
  T.span_id,
  T.name,
  T.start_time,
  T.duration_nano,
  L.log_name,
  L.severity,
  L.json_payload
FROM
  `PROJECT_ID.LOCATION._Trace.Spans._AllSpans` AS T
JOIN
  `PROJECT_ID.LOCATION._Default._AllLogs` AS L
ON
  -- Join log and trace data by both the span ID and trace ID.
  -- Don't join only on span ID, this field isn't globally unique.
  T.span_id = L.span_id
  -- A regular expression is required because the storage format of the trace ID
  -- differs between a log view and a trace view.
  AND T.trace_id = REGEXP_EXTRACT(L.trace, r'/([^/]+)$')
WHERE T.duration_nano > 1000000
LIMIT 10

La risposta della query elenca l'ID traccia e l'ID span, che ti consentono di eseguire query individualmente per raccogliere maggiori informazioni. Inoltre, i risultati elencano la gravità della voce di log e il payload JSON.

Rimuovere le voci di log duplicate

Log Analytics non rimuove le voci di log duplicate prima dell'esecuzione di una query. Questo comportamento è diverso da quello che si verifica quando esegui query sulle voci di log utilizzando Esplora log, che rimuove le voci duplicate confrontando i campi relativi a nomi log, timestamp e ID inserimento.

Puoi utilizzare la convalida a livello di riga per rimuovere le voci di log duplicate.

Per saperne di più, vedi Risoluzione dei problemi: nei risultati di Log Analytics sono presenti voci di log duplicate.

Passaggi successivi

Per la documentazione di riferimento di SQL o altri esempi, consulta i seguenti documenti: