Puedes usar consultas de SQL de muestra en Estadísticas de observabilidad para analizar entradas de registro,
extraer campos de carga útil y agregar datos de registro en tus servicios.
Estas consultas se ejecutan desde la página Estadísticas de observabilidad de la consola de Google Cloud en
buckets de registros que se actualizan para usar Estadísticas de observabilidad. Para
obtener más ejemplos, consulta los repositorios de GitHub logging-analytics-samples y
security-analytics. Para
obtener información sobre la sintaxis de SQL o cómo enrutar y almacenar entradas de registro, consulta la
sección ¿Qué sigue?.
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 con la página Estadísticas de observabilidad:
- Comandos DDL y DML
- Funciones definidas por el usuario de JavaScript
- Funciones de BigQuery ML
- Variables de SQL
Los siguientes solo se admiten cuando consultas un conjunto de datos de BigQuery vinculado con las páginas de BigQuery Studio y Looker Studio, o con la herramienta de línea de comandos de bq:
- Funciones definidas por el usuario de JavaScript
- Funciones de BigQuery ML
- Variables de SQL
Prácticas recomendadas
Para establecer el período de tu consulta, te recomendamos que uses el selector correspondiente. 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 de ese momento y cambiar las zonas horarias.
Si incluyes un campo timestamp en la cláusula WHERE, no se usará el parámetro de 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 las 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:
-
En la consola de Google Cloud , ve a la página Explorador 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.
- Para cada bucket de registros que tenga una vista de registro 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 las Estadísticas de observabilidad:
-
Para obtener los permisos que necesitas para usar las Estadísticas de observabilidad y consultar las vistas de registro, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Para consultar los buckets de registros
_Requiredy_Default, usa el Visualizador de registros (roles/logging.viewer). -
Para consultar todas las vistas de registros de un proyecto, usa el rol de descriptor de acceso de vista de registros (
roles/logging.viewAccessor).
Puedes restringir una principal a una vista de registro específica agregando una condición de IAM al otorgamiento del rol de descriptor de acceso a la vista de registros realizado a nivel del proyecto o agregando una vinculación de IAM al archivo de política de la vista de registro. 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 del Explorador de registros. Para obtener información sobre los roles adicionales que necesitas para consultar vistas en buckets definidos por el usuario o para consultar la vista
_AllLogsdel bucket de registros_Default, consulta Roles de Cloud Logging. -
Para consultar los buckets de registros
-
Para obtener los permisos que necesitas para consultar vistas de análisis, pídele a tu administrador que te otorgue el rol de IAM de Usuario de Estadísticas de observabilidad (
roles/observability.analyticsUser) en tu proyecto.
Cómo usar las consultas de esta página
-
En la Google Cloud consola, ve a la página manage_search Estadísticas de observabilidad:
Ir a Estadísticas de observabilidad
Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Logging.
En el panel Consulta, haz clic en code 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 registro o de la vista de análisis.
- BUCKET_ID: Es el nombre o el ID del bucket de registros.
- LOG_VIEW_ID: Es el identificador de la vista de registro, 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 cláusula
FROMpara una vista de registro:FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
Las muestras de registros de esta página consultan una vista de registro. Para consultar una vista de análisis, usa el siguiente formato de ruta de acceso:
`analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. En la expresión anterior,PROJECT_IDes el ID de tu proyecto, yLOCATIONyANALYTICS_VIEW_IDson la ubicación y el nombre de tu vista de análisis.
Para usar las consultas que se muestran en este documento en la página de 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 de BigQuery vinculado.
Por ejemplo, para consultar la
vista _AllLogs en el conjunto de datos de BigQuery 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 comunes que podrían ayudarte a crear tus consultas personalizadas.
Muestra las 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
Extrae el valor del campo por expresión regular
Para extraer un valor de una cadena 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
documentación de REGEXP_EXTRACT.
Para las coincidencias de subcadena, como en la consulta anterior, el uso de la función CONTAINS_SUBSTR 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.
Filtra las entradas de registro por tipo de carga útil
Las entradas de registro pueden tener uno de tres tipos de carga útil. Para filtrar las entradas de registro por el tipo de carga útil, usa una de las siguientes cláusulas:
Cargas útiles de tipo texto
-- Matches log entries that have a text payload. WHERE text_payload IS NOT NULLCargas útiles de JSON
-- Matches log entries that have a JSON payload. WHERE json_payload IS NOT NULLCargas ú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 exists. 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 el que puedes navegar.
Cómo filtrar datos de registro por marca de tiempo
Para filtrar las entradas de registro por su marca de tiempo, te recomendamos que uses el
selector de período. Sin embargo, también puedes especificar el 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 sentencia 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 los datos de registro por gravedad, agrega una sentencia 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 las 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.
Filtra por nombre de registro
Para filtrar los datos de registro por un nombre de registro, agrega una sentencia log_name o log_id
a la cláusula WHERE:
El nombre del registro especifica la ruta 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 al recurso:
-- Matches log entries that have the following log id. WHERE log_id = "cloudaudit.googleapis.com/data_access"
Filtra las 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 recurso:
{
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 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 sentencia 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
Filtra 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 sutilmente 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 registro 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.
Agrupa y agrega entradas de registro
En esta sección, se desarrollan los ejemplos anteriores y se ilustra 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 cumplen con la cláusula WHERE como un grupo.
Cada expresión SELECT debe incluirse en los campos de grupo o agregarse.
Agrupa las 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 un nivel de detalle especificado, 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 documentación de TIMESTAMP_TRUNC
y las funciones de fecha y hora.
Agrupa las entradas de registro por recurso
En la siguiente consulta, se muestra cómo agrupar las 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
Agrupa las entradas de registro por gravedad
En la siguiente consulta, se muestra cómo agrupar las 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
Agrupa las entradas de registro por su log_id
En la siguiente consulta, se muestra cómo agrupar las entradas de registro por el 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
Calcula la latencia promedio de las solicitudes HTTP por URL
En la siguiente consulta, se ilustra cómo agrupar las entradas de registro por la URL y la 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
Calcula el promedio de bytes enviados para una prueba de subred
En la siguiente consulta, se muestra cómo agrupar las 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 JSON y Funciones de conversión.
Cuenta las entradas de registro con un campo que coincida con un patrón
Para devolver 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 más ejemplos, consulta la
documentación de REGEXP_EXTRACT.
Búsqueda en varias columnas
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 la búsqueda, una consulta de búsqueda y, luego, usas la función
SEARCH. Dado que la funciónSEARCHtiene reglas específicas sobre cómo se buscan los datos, te recomendamos que leas la documentación deSEARCH.Búsquedas basadas en subcadenas: Proporcionas la ubicación de la 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ónCONTAINS_SUBSTRdevuelveTRUEcuando existe el literal de cadena yFALSEen caso contrario. El valor de búsqueda debe ser un literalSTRING, pero no el literalNULL.
Búsqueda basada en tokens en una vista de registro
La siguiente consulta conserva 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 simples en la cadena de consulta, esta se divide
según las reglas definidas en la documentación de SEARCH.
Por ejemplo, cuando se ejecuta la siguiente sentencia,
la cadena de consulta se divide en cuatro tokens: "35", "193", "12" y "15":
SEARCH(t,"35.193.12.15")
La declaración SEARCH anterior coincide con una fila cuando un solo campo
coincide con los cuatro tokens. El orden de los tokens no importa.
Puedes incluir varias declaraciones SEARCH en una consulta. Por ejemplo, en la
consulta anterior, podrías reemplazar el filtro en el ID de registro por una
declaración como la siguiente:
SEARCH(t,"`cloudaudit.googleapis.com/data_access`")
La instrucción anterior busca en todos los campos de las entradas de registro en la vista de registro,
mientras que la instrucción original solo busca en 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 sentencia 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 en
una tabla completa. Por ejemplo, la siguiente sentencia solo busca
en 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.
Búsqueda de subcadena en una vista de registro
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 determinado. 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
Cómo consultar varias vistas
Las instrucciones de consulta analizan una o más tablas o expresiones, y devuelven 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:
-
Las ubicaciones de las vistas cumplen con una de las siguientes condiciones:
- Todas las vistas tienen la misma ubicación.
- Todas las vistas se encuentran en la ubicación
globalous.
-
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 utilizan 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 que genera 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 la misma clave de Cloud KMS.
Ambos recursos de almacenamiento usan CMEK, pero con 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 de 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 la configuración de recursos predeterminada para Cloud Logging y para los buckets de observabilidad con la misma clave de Cloud KMS predeterminada para la ubicación de almacenamiento.
Une dos vistas de registro por el ID de seguimiento
Para combinar información de dos tablas, usa uno de los operadores 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
Consulta dos vistas de registro con una sentencia UNION
Para combinar los resultados de dos o más declaraciones SELECT y descartar
las 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
Quita las entradas de registro duplicadas
Las Estadísticas de observabilidad no quitan 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 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:
- Crea un bucket de registros
- Actualiza un bucket para usar Estadísticas de observabilidad
- Vincula un bucket de registros a un conjunto de datos de BigQuery
- Configurar y administrar receptores
Para ver la documentación de referencia de SQL, consulta los siguientes documentos: