En este documento, se incluyen consultas de muestra sobre entradas de registro que se almacenan en
buckets de registros que se actualizaron para usar Log Analytics.
En estos buckets, puedes ejecutar consultas en SQL desde la página Estadísticas de registros en la consola de Google Cloud. Para obtener más muestras, consulta los repositorios de GitHub de logging-analytics-samples
y security-analytics
.
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.
Antes de comenzar
En esta sección, se describen los pasos que debes completar antes de poder usar Log Analytics.
Configura buckets de registros
Asegúrate de que tus buckets de registros se hayan actualizado para usar el Análisis de registros:
-
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 registros que deseas consultar, asegúrate de que la columna Log Analytics disponible muestre Abierto. Si aparece Upgrade, haz clic en Upgrade y completa el diálogo.
Configura roles y permisos de IAM
En esta sección, se describen los roles o los permisos de IAM necesarios para usar Log Analytics:
-
Para obtener los permisos que necesitas para usar Log Analytics y consultar 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
_Required
y_Default
, usa el Visualizador de registros (roles/logging.viewer
). -
Para consultar todas las vistas de registro de un proyecto, usa el Descriptor de acceso de vista de registros (
roles/logging.viewAccessor
).
Puedes restringir un principal a una vista de registro específica agregando una condición de IAM a la concesión de rol de Acceso a la 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 registro. Para obtener más información, consulta Controla el acceso a una vista de registro.
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 los roles adicionales que necesitas para consultar vistas en buckets definidos por el usuario o para consultar la vista
_AllLogs
del bucket de registros_Default
, consulta Roles de Cloud Logging. -
Para consultar los buckets de registros
Cómo usar estas consultas
Para usar las consultas que se muestran en este documento en la página Log Analytics, reemplaza TABLE_NAME_OF_LOG_VIEW por el nombre de la tabla de la vista de registro que deseas consultar.
Para consultar una vista de registro, en la cláusula FROM
, usa el siguiente formato:
FROM `PROJECT_ID.LOCATION.BUCKET_ID.VIEW_ID`
A continuación, se describe el significado de los campos de las expresiones anteriores:
- PROJECT_ID: Es el identificador del proyecto.
- LOCATION: Es la ubicación de la vista de registro.
- BUCKET_ID: Es el nombre o el ID del bucket de registros.
- VIEW_ID: Es el identificador de la vista de registro.
Si creaste un conjunto de datos vinculado a BigQuery, puedes consultarlo desde la página BigQuery Studio.
En esa página, reemplaza TABLE_NAME_OF_LOG_VIEW por la
ruta de acceso a la tabla en el conjunto de datos vinculado.
Por ejemplo, para consultar la vista _AllLogs
en el conjunto de datos vinculado mydataset
que se encuentra en el proyecto myproject
, establece este campo en myproject.mydataset._AllLogs
.
Ve a la página Log Analytics.
Para abrir la página Log Analytics, haz lo siguiente:
-
En la consola de Google Cloud, ve a la página Análisis de registros:
Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Logging.
Opcional: Para identificar el esquema de la vista de registro, en la lista Vistas de registro, busca la vista y, luego, selecciona su nombre.
Se mostrará el esquema. Puedes usar el campo Filtro para ubicar campos específicos. No puedes modificar el esquema.
Para obtener información sobre cómo acceder a la consulta predeterminada de una vista de registro, consulta Consulta y analiza registros con el Análisis de registros.
Filter logs
Las consultas de SQL determinan qué entradas de la vista de registro se deben procesar y, luego, agrupan estas entradas y realizan operaciones de agregación. Cuando no se enumera ninguna operación de agrupación ni agregación, el resultado de la consulta incluye las filas seleccionadas por la operación de filtro. En los ejemplos de esta sección, se ilustra el filtrado.
Filtrar por hora
Para establecer el intervalo de tiempo de tu consulta, te recomendamos que use el selector de intervalo de tiempo. Este selector se usa automáticamente cuando una consulta no especifica un campo timestamp
en la cláusula WHERE
.
Por ejemplo, para ver los datos de la semana anterior, selecciona Últimos 7 días en el selector de período. También puedes usar el selector de intervalo de tiempo para especificar una hora de inicio y de finalización, una hora para ver los datos y cambiar las zonas horarias.
Si incluyes un campo timestamp
en la cláusula WHERE
, no se usará la configuración del selector de intervalo de tiempo. En el siguiente ejemplo, se filtran los datos con la función TIMESTAMP_SUB
, que te permite especificar un intervalo de visualización a partir de la hora actual:
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 por recurso, agrega una restricción resource.type
.
Por ejemplo, la siguiente consulta lee la hora más reciente de datos, luego retiene aquellas filas cuyo tipo de recurso coincide con gce_instance
y, luego, ordena y muestra hasta 100 entradas:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
resource.type = "gce_instance"
ORDER BY timestamp ASC
LIMIT 100
Filtrar por gravedad
Puedes filtrar por una gravedad específica con una restricción como severity = 'ERROR'
. Otra opción es usar la sentencia IN
y especificar un conjunto de valores válidos.
Por ejemplo, la siguiente consulta lee la hora más reciente de datos y, luego, retiene solo aquellas filas que contienen un campo severity
cuyo valor es 'INFO'
o 'ERROR'
:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
severity IS NOT NULL AND
severity IN ('INFO', 'ERROR')
ORDER BY timestamp ASC
LIMIT 100
La consulta anterior filtra por el valor del campo severity
. Sin embargo, también puedes escribir consultas que filtren por el valor numérico de la gravedad del registro.
Por ejemplo, si reemplazas las líneas severity
por las siguientes,
la consulta muestra todas las entradas de registro cuyo nivel de gravedad es de al menos NOTICE
:
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 por un nombre de registro, puedes agregar una restricción en el valor del campo log_name
o log_id
. El campo log_name
incluye la ruta de acceso del recurso. Es decir, este campo tiene valores como projects/myproject/logs/mylog
.
El campo log_id
solo almacena el nombre del registro, como mylog
.
Por ejemplo, la siguiente consulta lee la hora más reciente de datos, luego, retiene aquellas filas en las que el valor del campo log_id
es cloudaudit.googleapis.com/data_access
y, luego, ordena y muestra los resultados:
SELECT
timestamp, log_id, severity, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
log_id = "cloudaudit.googleapis.com/data_access"
ORDER BY timestamp ASC
LIMIT 100
Filtrar por etiqueta de recurso
La mayoría de los descriptores de recurso supervisado definen etiquetas que se usan para identificar el recurso específico. Por ejemplo, el descriptor de una instancia de Compute Engine incluye etiquetas para la zona, el ID del proyecto y el ID de la instancia. Cuando se escribe la entrada de registro, se asignan valores a cada campo. El siguiente es un ejemplo de este tipo:
{
type: "gce_instance"
labels: {
instance_id: "1234512345123451"
project_id: "my-project"
zone: "us-central1-f"
}
}
Debido a que el tipo de datos del campo labels
es JSON, incluir una restricción como resource.labels.zone = "us-centra1-f"
en una consulta genera un error de sintaxis. Para obtener el valor de un campo con un tipo de datos de JSON, usa la función JSON_VALUE
.
Por ejemplo, la siguiente consulta lee los datos más recientes y, luego, retiene aquellas filas en las que el recurso es una instancia de Compute Engine que se encuentra en la zona us-central1-f
:
SELECT
timestamp, log_name, severity, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
resource.type = "gce_instance" AND
JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC
LIMIT 100
Para obtener información sobre todas las funciones que pueden recuperar y transformar datos JSON, consulta Funciones de JSON.
Filtrar por solicitud HTTP
Para filtrar la vista de registro de modo que solo incluya entradas de registro que correspondan a una solicitud o respuesta HTTP, agrega una restricción http_request IS NOT NULL
:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
http_request IS NOT NULL
ORDER BY timestamp
LIMIT 100
La siguiente consulta solo incluye filas que corresponden a solicitudes GET
o POST
:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
http_request IS NOT NULL AND
http_request.request_method IN ('GET', 'POST')
ORDER BY timestamp ASC
LIMIT 100
Filtrar por estado HTTP
Para filtrar por estado HTTP, modifica la cláusula WHERE
para que se requiera que se defina el campo http_request.status
:
SELECT
timestamp, log_name, http_request.status, http_request, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
http_request IS NOT NULL AND
http_request.status IS NOT NULL
ORDER BY timestamp ASC
LIMIT 100
Para determinar el tipo de datos almacenados en un campo, consulta el esquema o muestra el campo. Los resultados de la consulta anterior muestran que el campo http_request.status
almacena valores enteros.
Cómo filtrar por un campo con un tipo JSON
Para extraer un valor de una columna cuyo tipo de datos es JSON, usa la función JSON_VALUE
.
Ten en cuenta las siguientes consultas:
SELECT
json_payload
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
json_payload.status IS NOT NULL
y
SELECT
json_payload
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
JSON_VALUE(json_payload.status) IS NOT NULL
Las consultas anteriores prueban el valor del campo json_payload
en la entrada de registro. Ambas consultas descartan las entradas de registro que no contienen un campo etiquetado como json_payload
.
La diferencia entre estas dos consultas es la línea final, que define lo que se prueba en NULL
. Ahora, considera una vista de registro que tenga
dos entradas de registro. Para una entrada de registro, el campo json_payload
tiene el siguiente formato:
{
status: {
measureTime: "1661517845"
}
}
En el caso de 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"
}
Ambas entradas de registro anteriores satisfacen la restricción json_payload.status IS NOT NULL
.
Es decir, el resultado de la primera consulta incluye ambas entradas de registro.
Sin embargo, cuando la restricción es JSON_VALUE(json_payload.status) IS NOT NULL
, solo se incluye la segunda entrada de registro en el resultado de la consulta.
Cómo filtrar por expresión regular
Para mostrar la substring que coincide con una expresión regular, usa la función REGEXP_EXTRACT
. El tipo de datos que se muestra de esta función es STRING
o BYTES
.
La siguiente consulta muestra las entradas de registro más recientes recibidas, retiene esas entradas con un campo json_payload.jobName
y, luego, muestra la parte del nombre que comienza con test
:
SELECT
timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
json_payload.jobName IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20
Para obtener más ejemplos, consulta la documentación de REGEXP_EXTRACT
.
Para ver ejemplos de otras expresiones regulares que puedes usar, consulta Funciones, operadores y condicionales.
La consulta que se muestra en este ejemplo no es eficiente. Para una coincidencia de subcadena, como la que se ilustra, usa la función CONTAINS_SUBSTR
.
Agrupa y agrega entradas de registro
En esta sección, se basan en 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 solo resultado porque SQL trata todas las filas que satisfacen la cláusula WHERE
como un solo grupo.
Cada expresión SELECT
debe incluirse en los campos de grupo o agregarse.
Agrupar por hora
Para agrupar datos por tiempo, usa la función TIMESTAMP_TRUNC
, que trunca una marca de tiempo a un nivel de detalle especificado, como MINUTE
. Por ejemplo, una marca de tiempo de 15:30:11
, que tiene el formato hours:minutes:seconds
, se convierte en 15:30:00
cuando el nivel de detalle se establece en MINUTE
.
La siguiente consulta lee los datos recibidos en el intervalo especificado por el selector de período y, luego, retiene aquellas filas en las que el valor del campo json_payload.status
no es NULL.
La consulta trunca la marca de tiempo de cada fila por hora y, luego, agrupa las filas por la marca de tiempo y el estado truncados:
SELECT
TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
JSON_VALUE(json_payload.status) AS status,
COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
json_payload IS NOT NULL AND
JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY hour,status
ORDER BY hour ASC
Para obtener muestras adicionales, consulta la documentación de TIMESTAMP_TRUNC
.
Para obtener información sobre otras funciones basadas en el tiempo, consulta Funciones de fecha y hora.
Agrupar por recurso
La siguiente consulta lee la hora más reciente de datos y, luego, agrupa las entradas de registro por el tipo de recurso. Luego, cuenta la cantidad de filas para cada tipo de recurso y muestra una tabla con dos columnas. En la primera columna, se indica el tipo de recurso, mientras que la segunda columna es la cantidad de filas de ese tipo de recurso:
SELECT
resource.type, COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
GROUP BY resource.type
LIMIT 100
Agrupar por gravedad
La siguiente consulta lee la hora más reciente de datos y, luego, retiene las filas que tienen un campo de gravedad. Luego, la consulta agrupa las filas por gravedad y cuenta la cantidad de filas de cada grupo:
SELECT
severity, COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100
Agrupar por log_id
El resultado de la siguiente consulta es una tabla con dos columnas. La primera columna enumera los nombres de los registros y la segunda, la cantidad de entradas de registro que se escribieron en el registro. La consulta ordena los resultados según el recuento de entradas:
SELECT
log_id, COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100
Cómo calcular la latencia promedio de una solicitud HTTP
En la siguiente consulta, se ilustra la agrupación por varias columnas y el cálculo de un valor promedio. La consulta agrupa las filas por la URL contenida en la solicitud HTTP y por el valor del campo labels.checker_location
. Después de agrupar las filas, la consulta calcula la latencia promedio de cada grupo:
SELECT
JSON_VALUE(labels.checker_location) AS location,
AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
`TABLE_NAME_OF_LOG_VIEW`
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
En la expresión anterior, se requiere JSON_VALUE
para extraer el valor
del campo labels.checker_location
porque el tipo de datos de
labels
es JSON.
Sin embargo, no usas esta función para extraer el valor del campo http_request.latency.seconds
. El último campo tiene un tipo de datos de número entero.
Cómo calcular los bytes promedio enviados para una prueba de subred
En la siguiente consulta, se muestra cómo puedes mostrar la cantidad promedio de bytes enviados por ubicación.
La consulta lee la hora más reciente de datos y, luego, retiene solo aquellas filas cuya columna de tipo de recurso es gce_subnetwork
y cuya columna json_payload
no es NULL. A continuación, la consulta agrupa las filas por la ubicación del recurso. A diferencia del ejemplo anterior, en el que los datos se almacenan como un valor numérico, el valor del campo bytes_sent
es una cadena y, por lo tanto, debes convertirlo en un FLOAT64
antes de calcular el promedio:
SELECT JSON_VALUE(resource.labels.location) AS location,
AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
`TABLE_NAME_OF_LOG_VIEW`
WHERE
resource.type = "gce_subnetwork" AND
json_payload IS NOT NULL
GROUP BY location
LIMIT 100
El resultado de la consulta anterior es una tabla en la que cada fila muestra una ubicación y los bytes promedio enviados a esa ubicación.
Para obtener información sobre todas las funciones que pueden recuperar y transformar datos JSON, consulta Funciones de JSON.
Para obtener información sobre CAST
y otras funciones de conversión, consulta
Funciones de conversión.
Cuenta 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
. El tipo de datos que se muestra de esta función es STRING
o BYTES
.
La siguiente consulta conserva las entradas de registro para las que el valor del campo json_payload.jobName
no es NULL.
Luego, agrupa las entradas por el sufijo de nombre que comienza con test
. Por último, la consulta cuenta la cantidad de entradas en cada grupo:
SELECT
REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
COUNT(*) AS count
FROM
`TABLE_NAME_OF_LOG_VIEW`
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
.
Para ver ejemplos de otras expresiones regulares que puedes usar, consulta Funciones, operadores y condicionales.
Búsqueda en columnas cruzadas
En esta sección, se describen dos enfoques diferentes que puedes usar para buscar en varias columnas de una tabla.
Búsqueda basada en tokens
Para buscar entradas que coincidan con un conjunto de términos de búsqueda en una vista de registro, usa la función SEARCH
. Esta función requiere dos parámetros: dónde buscar y la búsqueda.
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
.
La siguiente consulta retiene solo aquellas 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
`TABLE_NAME_OF_LOG_VIEW` 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
En la consulta anterior, los acentos graves unen el valor que se debe buscar. Esto garantiza que la función SEARCH
busque una coincidencia exacta entre un valor de campo y el valor entre las virgulillas.
Cuando se omiten los acentos graves 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 sentencia 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, puedes reemplazar el filtro en el ID de registro por una
sentencia como la siguiente:
SEARCH(t,"`cloudaudit.googleapis.com/data_access`")
La sentencia anterior busca en todos los campos de las entradas de registro en la vista de registro, mientras que la sentencia 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 una tabla completa. Por ejemplo, la siguiente sentencia solo busca las columnas 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 substring
Para realizar una prueba que no distingue mayúsculas de minúsculas para determinar si existe un valor en una expresión, usa la función CONTAINS_SUBSTR
.
Esta función muestra TRUE
cuando el valor existe y FALSE
en caso contrario. El valor de búsqueda debe ser un literal STRING
, pero no el literal NULL
.
Por ejemplo, la siguiente consulta recupera todas las entradas del registro de auditoría de acceso a los datos con una dirección IP específica cuyas marcas de tiempo se encuentran en un intervalo de tiempo específico. Por último, la consulta ordena los resultados y, luego, muestra los 20 más antiguos:
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`TABLE_NAME_OF_LOG_VIEW` 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 consulta anterior realiza una prueba de substring. Por lo tanto, una fila que contenga "35.193.12.152" coincide con la sentencia CONTAINS_SUBSTR
.
Combina datos de varias fuentes
Las instrucciones de consulta analizan una o más tablas o expresiones y muestran las filas de resultados calculados. Por ejemplo, puedes usar sentencias de consulta para combinar los resultados de las sentencias SELECT
en diferentes tablas o conjuntos de datos de varias maneras y, luego, seleccionar las columnas de los datos combinados.
Combina datos de dos tablas con uniones
Para combinar información de dos tablas, usa uno de los operadores de unión. El tipo de unión y la cláusula condicional que usas determinan cómo se combinan y descartan las filas.
La siguiente consulta te proporciona los campos json_payload
de las filas de
dos tablas diferentes escritas por el mismo intervalo de seguimiento. La consulta realiza una JOIN
interna en dos tablas para las filas en las que coinciden los valores de las columnas span_id
y trace
de ambas tablas. A partir de este resultado, la consulta selecciona los campos timestamp
, severity
y json_payload
que provienen de TABLE_NAME_OF_LOG_VIEW_1, el campo json_payload
de TABLE_NAME_OF_LOG_VIEW_2 y los valores de los campos span_id
y trace
en los que se unieron las dos tablas, y muestra hasta 100 filas:
SELECT
a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM `TABLE_NAME_OF_LOG_VIEW_1` a
JOIN `TABLE_NAME_OF_LOG_VIEW_2` b
ON
a.span_id = b.span_id AND
a.trace = b.trace
LIMIT 100
Combina varias selecciones con uniones
Para combinar los resultados de dos o más sentencias SELECT
y descartar filas duplicadas, usa el operador UNION
. Para conservar las filas duplicadas, usa el operador UNION ALL
.
La siguiente consulta lee la hora más reciente de datos de TABLE_NAME_OF_LOG_VIEW_1, combina el resultado con la hora más reciente de datos de TABLE_NAME_OF_LOG_VIEW_2, ordena los datos combinados por marca de tiempo creciente y, luego, muestra las 100 entradas más antiguas:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM(
SELECT * FROM `TABLE_NAME_OF_LOG_VIEW_1`
UNION ALL
SELECT * FROM `TABLE_NAME_OF_LOG_VIEW_2`
)
ORDER BY timestamp ASC
LIMIT 100
Cómo quitar entradas de registro duplicadas
Log Analytics no quita las entradas de registro duplicadas antes de que se ejecute una consulta. Este comportamiento es diferente al que se produce 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 Soluciona problemas: Hay entradas de registro duplicadas en mis resultados de Log Analytics.
Limitaciones
Las consultas que se usan en la página Análisis de registros admiten funciones de GoogleSQL, con algunas excepciones.
Los siguientes comandos de SQL no son compatibles con las consultas de SQL que se emiten con la página Análisis de registros:
- Comandos DDL y DML
- Funciones definidas por el usuario de JavaScript
- Funciones de BigQuery ML
- Variables de SQL
Los siguientes elementos solo se admiten cuando consultas un conjunto de datos vinculado con las páginas de BigQuery Studio y Looker Studio, y la herramienta de línea de comandos bq:
- Funciones definidas por el usuario de JavaScript
- Funciones de BigQuery ML
- Variables de SQL
¿Qué sigue?
Para obtener información sobre cómo enrutar y almacenar entradas de registro, consulta los siguientes documentos:
- Cómo crear un bucket de registros
- Actualiza un bucket para usar el Análisis de registros
- 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: