Consultas en SQL de muestra

En este documento, se incluyen consultas de muestra sobre las entradas de registro que se almacenan en buckets de registros actualizados para usar Estadísticas de observabilidad. En estos buckets, puedes ejecutar consultas en SQL desde la Estadísticas de observabilidad página en la Google Cloud consola. Para obtener más muestras, consulta los logging-analytics-samples y los security-analytics repositorios de GitHub.

En este documento, no se describe SQL ni cómo enrutar y almacenar entradas de registro. Para obtener información sobre esos temas, consulta la sección Próximos pasos.

En los ejemplos de esta página, se consultan vistas de registros. Para consultar una vista de estadísticas, usa el siguiente formato de ruta de acceso: `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. En la expresión anterior, PROJECT_ID es el ID de tu proyecto, y LOCATION y ANALYTICS_VIEW_ID son la ubicación y el nombre de tu vista de estadísticas.

Compatibilidad con el lenguaje SQL

Las consultas que se usan en la página Estadísticas de observabilidad admiten funciones de GoogleSQL con algunas excepciones.

Los siguientes comandos de SQL no son compatibles con las consultas en SQL que se emiten mediante la página Estadísticas de observabilidad:

  • Comandos DDL y DML
  • Funciones de JavaScript definidas por el usuario
  • Funciones de BigQuery ML
  • Variables de SQL

Lo siguiente solo se admite cuando consultas un conjunto de datos vinculado mediante las páginas BigQuery Studio y Looker Studio o con la herramienta de línea de comandos de bq:

  • Funciones de JavaScript definidas por el usuario
  • Funciones de BigQuery ML
  • Variables de SQL

Prácticas recomendadas

Para establecer el período de tu consulta, te recomendamos que uses el selector de período. Por ejemplo, para ver los datos de la semana pasada, selecciona Últimos 7 días en el selector de período. También puedes usar el selector de período para especificar una hora de inicio y de finalización, especificar una hora para ver los datos y cambiar las zonas horarias.

Si incluyes un campo timestamp en la cláusula WHERE, no se usa la configuración del selector de período. En el siguiente ejemplo, se muestra cómo filtrar por marca de tiempo:

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

Para obtener más información sobre cómo filtrar por hora, consulta Funciones de hora y Funciones de marca de tiempo.

Antes de comenzar

En esta sección, se describen los pasos que debes completar antes de poder usar Estadísticas de observabilidad.

Configura buckets de registros

Asegúrate de que tus buckets de registros se hayan actualizado para usar Estadísticas de observabilidad:

  1. En la Google Cloud consola de, ve a la página Almacenamiento de registros:

    Ir al Almacenamiento de registros

    Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Logging.

  2. Para cada bucket de registros que tenga una vista de registros que quieras consultar, asegúrate de que la columna Estadísticas de observabilidad disponibles muestre Abrir. Si se muestra Actualizar, haz clic en Actualizar y completa el diálogo.

Configura roles y permisos de IAM

En esta sección, se describen los roles o permisos de IAM que se requieren para usar Estadísticas de observabilidad:

  • Para obtener los permisos que necesitas para usar Estadísticas de observabilidad y consultar vistas de registros, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

    Puedes restringir una principal a una vista de registros específica agregando una condición de IAM al otorgamiento del rol Descriptor de acceso de vista de registros que se realiza a nivel del proyecto o agregando una vinculación de IAM al archivo de política de la vista de registros. Para obtener más información, consulta Controla el acceso a una vista de registros.

    Estos son los mismos permisos que necesitas para ver las entradas de registro en la página Explorador de registros. Para obtener información sobre roles adicionales que necesitas para consultar vistas en buckets definidos por el usuario o para consultar la vista _AllLogs del _Default bucket de registros, consulta Roles de Cloud Logging.

  • Para obtener los permisos que necesitas para consultar vistas de estadísticas, pídele a tu administrador que te otorgue el rol de IAM Usuario de Estadísticas de observabilidad (roles/observability.analyticsUser) en tu proyecto.

Cómo usar las consultas de esta página

  1. En la Google Cloud consola de, ve a la Análisis de registros página:

    Ir a Análisis de registros

    Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Logging.

  2. En el panel Consulta, haz clic en  SQL y, luego, copia y pega una consulta en el panel de consulta en SQL.

    Antes de copiar una consulta, en la cláusula FROM, reemplaza los siguientes campos:

    • PROJECT_ID: Es el identificador del proyecto.
    • LOCATION: Es la ubicación de la vista de registros o la vista de estadísticas.
    • BUCKET_ID: Es el nombre o el ID del bucket de registros.
    • LOG_VIEW_ID: Es el identificador de la vista de registros, que está limitado a 100 caracteres y solo puede incluir letras, dígitos, guiones bajos y guiones.

    A continuación, se muestra el formato de la FROM cláusula para una vista de registros:

    FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
    

    En los ejemplos de registros de esta página, se consulta una vista de registros. Para consultar una vista de estadísticas, usa el siguiente formato de ruta de acceso: `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. En la expresión anterior, PROJECT_ID es el ID de tu proyecto, y LOCATION y ANALYTICS_VIEW_ID son la ubicación y el nombre de tu vista de estadísticas.

Para usar las consultas que se muestran en este documento en la página BigQuery Studio o para usar la herramienta de línea de comandos de bq, edita la cláusula FROM y, luego, ingresa la ruta de acceso al conjunto de datos vinculado. Por ejemplo, para consultar la _AllLogs vista en el conjunto de datos vinculado llamado mydataset que se encuentra en el proyecto myproject, la ruta de acceso es myproject.mydataset._AllLogs.

Casos de uso habituales

En esta sección, se enumeran varios casos de uso habituales que pueden ayudarte a crear tus consultas personalizadas.

Mostrar entradas de registro en el bucket de registros predeterminado

Para consultar el bucket _Default, ejecuta la siguiente consulta:

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

Extraer el valor de un campo mediante una expresión regular

Para extraer un valor de una cadena de texto con una expresión regular, usa la función 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

Para obtener más información, consulta la REGEXP_EXTRACT documentación.

Para las coincidencias de substring, como la consulta anterior, el uso de la CONTAINS_SUBSTR función genera una consulta más eficiente.

Filtra entradas de registro

Para aplicar un filtro a tu consulta, agrega una cláusula WHERE. La sintaxis que usas en esta cláusula depende del tipo de datos del campo. En esta sección, se proporcionan varios ejemplos para diferentes tipos de datos.

Filtrar entradas de registro por tipo de carga útil

Las entradas de registro pueden tener uno de tres tipos de carga útil. Para filtrar entradas de registro por tipo de carga útil, usa una de las siguientes cláusulas:

  • Cargas útiles de texto

    -- Matches log entries that have a text payload.
    WHERE text_payload IS NOT NULL
    
  • Cargas útiles de JSON

    -- Matches log entries that have a JSON payload.
    WHERE json_payload IS NOT NULL
    
  • Cargas útiles de tipo protocolo

    -- 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
    

En los resultados de la consulta, los campos json_payload y proto_payload se renderizan en JSON, por lo que puedes navegar por ellos.

Filtrar datos de registro por marca de tiempo

Para filtrar entradas de registro por su marca de tiempo, te recomendamos que uses el selector de período. Sin embargo, también puedes especificar la timestamp en la cláusula WHERE:

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

Para obtener más información sobre cómo filtrar por hora, consulta Funciones de hora y Funciones de marca de tiempo.

Filtrar por recurso

Para filtrar tus datos de registro por recurso, agrega una instrucción resource.type a la cláusula WHERE:

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

Filtrar por gravedad

Para filtrar tus datos de registro por gravedad, agrega una instrucción severity a la cláusula WHERE:

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

También puedes filtrar tus entradas de registro por severity_number, que es un número entero. Por ejemplo, la siguiente cláusula coincide con todas las entradas de registro cuyo nivel de gravedad es al menos NOTICE:

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

Para obtener información sobre los valores enumerados, consulta LogSeverity.

Filtrar por nombre de registro

Para filtrar tus datos de registro por nombre de registro, agrega una instrucción log_name o log_id a la cláusula WHERE:

  • El nombre de registro especifica la ruta de acceso del recurso:

    -- Matches log entries that have the following log ID.
    WHERE log_name="projects/cloud-logs-test-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  • El ID de registro omite la ruta de acceso del recurso:

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

Filtrar entradas de registro por etiqueta de recurso

Las etiquetas de recursos se almacenan como una estructura JSON. Para filtrar por el valor de un campo dentro de una estructura JSON, usa la función 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 consulta anterior se basa en el formato de las etiquetas de recursos, ya que se almacenan en una entrada de registro. A continuación, se muestra un ejemplo del campo de recursos:

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

Para obtener información sobre todas las funciones que pueden recuperar y transformar datos JSON, consulta Funciones de JSON.

Filtrar por solicitud HTTP

Para consultar solo las entradas de registro que tienen un campo de solicitud HTTP, usa la siguiente cláusula:

-- 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

También puedes usar la instrucción IN:

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

Filtrar por estado HTTP

Para consultar solo las entradas de registro que tienen un estado HTTP, usa la siguiente cláusula:

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

Filtrar por un campo dentro de un tipo de datos JSON

Para consultar solo las entradas de registro cuando el subcampo de un campo con un tipo de datos JSON tiene un valor específico, extrae el valor con la función JSON_VALUE:

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

La cláusula anterior es ligeramente diferente de la siguiente:

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

La primera cláusula prueba si el valor del campo de estado es NULL. La segunda cláusula prueba si existe el campo de estado. Supongamos que una vista de registros contiene dos entradas de registro. Para una entrada de registro, el campo json_payload tiene el siguiente formato:

{
    status: {
        measureTime: "1661517845"
    }
}

Para la otra entrada de registro, el campo json_payload tiene una estructura diferente:

{
    @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 cláusula WHERE json_payload.status IS NOT NULL coincide con ambas entradas de registro. Sin embargo, la cláusula WHERE JSON_VALUE(json_payload.status) IS NOT NULL solo coincide con la segunda entrada de registro.

Agrupar y agregar entradas de registro

En esta sección, se basa en los ejemplos anteriores y se muestra cómo puedes agrupar y agregar entradas de registro. Si no especificas una agrupación, pero sí una agregación, se imprime un resultado porque SQL trata todas las filas que satisfacen la cláusula WHERE como un grupo.

Cada expresión SELECT debe incluirse en los campos de grupo o agregarse.

Agrupar entradas de registro por marca de tiempo

Para agrupar datos por marca de tiempo, usa la función TIMESTAMP_TRUNC, que trunca una marca de tiempo a una granularidad especificada como 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

Para obtener más información, consulta la TIMESTAMP_TRUNC documentación y las funciones de fecha y hora.

Agrupar entradas de registro por recurso

En la siguiente consulta, se muestra cómo agrupar entradas de registro por tipo de recurso y, luego, contar la cantidad de entradas de registro en cada grupo:

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

Agrupar entradas de registro por gravedad

En la siguiente consulta, se muestra cómo agrupar entradas de registro por gravedad y, luego, contar la cantidad de entradas de registro en cada grupo:

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

Agrupar entradas de registro por su log_id

En la siguiente consulta, se muestra cómo agrupar entradas de registro por ID de registro y, luego, contar la cantidad de entradas de registro en cada grupo:

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

Calcular la latencia promedio de las solicitudes HTTP por URL

En la siguiente consulta, se muestra cómo agrupar entradas de registro por URL y ubicación de la solicitud HTTP y, luego, contar la cantidad de entradas de registro en cada grupo:

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

Calcular el promedio de bytes enviados para una prueba de subred

En la siguiente consulta, se muestra cómo agrupar entradas de registro por la ubicación especificada en las etiquetas de recursos y, luego, calcular la cantidad de entradas de registro en cada grupo:

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

Para obtener más información, consulta Funciones de JSON y Funciones de conversión.

Contar las entradas de registro con un campo que coincida con un patrón

Para mostrar la substring que coincide con una expresión regular, usa la función 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

Para obtener ejemplos adicionales, consulta la REGEXP_EXTRACT documentación.

En esta sección, se describen dos enfoques que puedes usar para buscar en varias columnas de la vista que consultas:

  • Búsquedas basadas en tokens: Especificas la ubicación de búsqueda, una consulta de búsqueda y, luego, usas la SEARCH función. Debido a que la función SEARCH tiene reglas específicas sobre cómo se buscan los datos, te recomendamos que leas la documentación de SEARCH.

  • Búsquedas basadas en substrings: Proporcionas la ubicación de búsqueda, un literal de cadena, y, luego, usas la función CONTAINS_SUBSTR. El sistema realiza una prueba que no distingue mayúsculas de minúsculas para determinar si el literal de cadena existe en una expresión. La función CONTAINS_SUBSTR muestra TRUE cuando existe el literal de cadena y FALSE en caso contrario. El valor de búsqueda debe ser un literal STRING, pero no el literal NULL.

La siguiente consulta retiene solo las filas que tienen un campo que coincide exactamente con "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

Cuando se omiten las comillas invertidas en la cadena de consulta, esta se divide según las reglas definidas en la SEARCH documentación. Por ejemplo, cuando se ejecuta la siguiente instrucción, la cadena de consulta se divide en cuatro tokens: "35", "193", "12" y "15":

  SEARCH(t,"35.193.12.15")

La instrucción SEARCH anterior coincide con una fila cuando un solo campo coincide con los cuatro tokens. No importa el orden de los tokens.

Puedes incluir varias instrucciones SEARCH en una consulta. Por ejemplo, en la consulta anterior, podrías reemplazar el filtro en el ID de registro por una instrucción como la siguiente:

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

La instrucción anterior busca cada campo de las entradas de registro en la vista de registros, mientras que la instrucción original solo busca el campo log_id de las entradas de registro.

Para realizar varias búsquedas en varios campos, separa las cadenas individuales con un espacio. Por ejemplo, la siguiente instrucción coincide con las filas en las que un campo contiene "Hello World", "happy" y "days":

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

Por último, puedes buscar campos específicos en lugar de buscar una tabla completa. Por ejemplo, la siguiente instrucción solo busca las columnas llamadas text_payload y json_payload:

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

Para obtener información sobre cómo se procesan los parámetros de la función SEARCH, consulta la página de referencia de BigQuery Funciones de búsqueda.

Por ejemplo, la siguiente consulta recupera todas las entradas de registro de auditoría de acceso a los datos con una dirección IP específica cuyas marcas de tiempo se encuentran en un período específico. Por último, la consulta ordena los resultados y, luego, muestra los 20 resultados más antiguos:

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

Consultar varias vistas

Las declaraciones de consulta analizan una o más tablas o expresiones y muestran las filas de resultados calculados. Por ejemplo, puedes usar declaraciones de consulta para combinar los resultados de las declaraciones SELECT en diferentes tablas o conjuntos de datos de varias maneras y, luego, seleccionar las columnas de los datos combinados.

Para unir vistas, se aplican las siguientes restricciones:

  1. Las ubicaciones de las vistas satisfacen una de las siguientes condiciones:

    • Todas las vistas tienen la misma ubicación.
    • Todas las vistas están en la ubicación global o us.
  2. Cuando los recursos de almacenamiento usan claves de encriptación administradas por el cliente (CMEK), se cumple una de las siguientes condiciones:

    • Los recursos de almacenamiento que usan CMEK usan la misma clave de Cloud KMS.
    • Los recursos de almacenamiento que usan CMEK tienen un ancestro común, y ese ancestro especifica una clave de Cloud KMS predeterminada que se encuentra en la misma ubicación que los recursos de almacenamiento.

    Cuando uno o más recursos de almacenamiento usan CMEK, el sistema encripta los datos temporales generados por la unión con la clave de Cloud KMS común o la clave de Cloud KMS predeterminada del ancestro.

Por ejemplo, supongamos que tienes dos vistas que residen en la misma ubicación. Luego, puedes unir estas vistas cuando se cumpla alguna de las siguientes condiciones:

  • Los recursos de almacenamiento no usan CMEK.
  • Un recurso de almacenamiento usa CMEK y el otro no.
  • Ambos recursos de almacenamiento usan CMEK y ambos usan la misma clave de Cloud KMS.
  • Ambos recursos de almacenamiento usan CMEK, pero usan claves diferentes. Sin embargo, los recursos comparten un ancestro que especifica una clave de Cloud KMS predeterminada que se encuentra en la misma ubicación que los recursos de almacenamiento.

    Por ejemplo, supongamos que la jerarquía de recursos para un bucket de registros y un bucket de observabilidad incluye la misma organización. Puedes unir vistas en esos buckets cuando, para esa organización, hayas configurado los parámetros de configuración de recursos predeterminados para Cloud Logging y para buckets de observabilidad con la misma clave de Cloud KMS predeterminada para la ubicación de almacenamiento.

Unir dos vistas de registros por el ID de seguimiento

Para combinar información de dos tablas, usa uno de los operadores de unión:

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

Consultar dos vistas de registros con una instrucción de unión

Para combinar los resultados de dos o más instrucciones SELECT y descartar filas duplicadas, usa el operador UNION. Para conservar las filas duplicadas, usa el operador 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

Quitar entradas de registro duplicadas

Estadísticas de observabilidad no quita las entradas de registro duplicadas antes de que se ejecute una consulta. Este comportamiento es diferente de cuando consultas entradas de registro con el Explorador de registros, que quita las entradas duplicadas comparando los nombres de registro, las marcas de tiempo y los campos de ID de inserción.

Puedes usar la validación a nivel de la fila para quitar las entradas de registro duplicadas.

Para obtener más información, consulta Solución de problemas: Hay entradas de registro duplicadas en mis resultados de Estadísticas de observabilidad.

¿Qué sigue?

Para obtener información sobre cómo enrutar y almacenar entradas de registro, consulta los siguientes documentos:

Para obtener documentación de referencia de SQL, consulta los siguientes documentos: