Este documento contiene consultas de muestra sobre entradas de registro almacenadas en
buckets de registros que se actualizan para usar el Análisis de registros.
En estos buckets, puedes ejecutar consultas SQL desde
Página de Análisis de registros en la consola de Google Cloud. Para obtener más muestras, consulta la
logging-analytics-samples
y
security-analytics
repositorios de GitHub.
En este documento, no se describe SQL ni cómo enrutar y almacenar entradas de registro. Para para obtener información sobre esos temas, consulta la sección Próximos pasos.
Antes de comenzar
Para usar las consultas que se muestran en este documento en la página Análisis de registros, sigue estos pasos: reemplaza TABLE por el nombre de la tabla que corresponda. a la vista que quieres consultar. El nombre de la tabla tiene el siguiente formato:
project_ID.region.bucket_ID.view_ID
. Puedes encontrar el nombre de la tabla de un ver en la página Análisis de registros; la consulta predeterminada para un registro lista el nombre de la tabla en la sentenciaFROM
. Para información sobre cómo acceder a la consulta predeterminada, visita Consulta una vista de registro.Para usar las consultas que se muestran en este documento en el Página de BigQuery Studio, reemplazar TABLE con 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 vinculadomydataset
que se encuentra en el proyectomyproject
, establece este campo enmyproject.mydataset._AllLogs
:En la consola de Google Cloud, ve a la página de BigQuery:
También puedes usar la barra de búsqueda para encontrar esta página.
Para abrir la página Análisis de registros, 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: Si quieres identificar el esquema de tabla para la vista de registro, en la lista Vistas de registro, busca la vista y, luego, selecciona nombre de la vista.
Se muestra el esquema de la tabla. Puedes usar el campo Filtro para ubicar campos específicos. No puedes modificar el esquema.
-
Filtrar registros
Las consultas en SQL determinan qué filas de la tabla procesar y, luego, agrupan las filas y realizar operaciones de agregación. Cuando no hay agrupación ni agregación una lista, el resultado de la consulta incluye las filas que seleccionó el operación del filtro. En los ejemplos de esta sección, se muestra el filtrado.
Filtrar por hora
Para establecer el intervalo de tiempo de tu consulta, te recomendamos que elijas
usa 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 pasada, seleccione Últimos 7 días de
el selector de intervalo de tiempo. También puedes usar el intervalo de tiempo
selector para especificar una hora de inicio y de finalización, especificar una hora para ver los alrededores y
cambiar zonas horarias.
Si incluyes un campo timestamp
en la cláusula WHERE
, entonces el intervalo de tiempo
no se usa la configuración del selector. En el siguiente ejemplo, se filtran los datos por
con la función TIMESTAMP_SUB
, que te permite especificar una 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 tiempo, consulta Funciones de tiempo 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 los datos de la hora más reciente y, luego,
retiene las 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`
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 especifica un conjunto de valores válidos.
Por ejemplo, la siguiente consulta lee la hora más reciente de los datos y
luego retiene solo las filas que contienen un campo severity
cuyo valor es
'INFO'
o 'ERROR'
:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM
`TABLE`
WHERE
severity IS NOT NULL AND
severity IN ('INFO', 'ERROR')
ORDER BY timestamp ASC
LIMIT 100
La 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 de severity
por las siguientes líneas,
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
log_name
o el campo log_id
. El campo log_name
incluye el recurso
ruta de acceso. 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 los datos de la hora más reciente y, luego,
retiene las filas en las que el valor del campo log_id
es
cloudaudit.googleapis.com/data_access
y, luego, ordena y muestra
resultados:
SELECT
timestamp, log_id, severity, json_payload, resource, labels
FROM
`TABLE`
WHERE
log_id = "cloudaudit.googleapis.com/data_access"
ORDER BY timestamp ASC
LIMIT 100
Filtrar por etiqueta de recurso
La mayoría de los descriptores de recurso supervisado definen las etiquetas que se usan para identificar recurso específico. Por ejemplo, el descriptor de una instancia de Compute Engine incluye las etiquetas de la zona, el ID del proyecto y el ID de la instancia. Cuando se escribe una entrada de registro y se asignan valores a cada campo. Lo siguiente es ejemplo:
{
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, incluye una restricción.
como resource.labels.zone = "us-centra1-f"
, en una consulta genera una 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
ubicado en la zona us-central1-f
:
SELECT
timestamp, log_name, severity, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
`TABLE`
WHERE
resource.type = "gce_instance" AND
JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC
LIMIT 100
Para obtener información sobre todas las funciones que pueden recuperar y transformar JSON consulta Funciones JSON.
Filtrar por solicitud HTTP
Filtrar la tabla para que solo incluya filas que correspondan a una solicitud HTTP
o responder, agrega una restricción http_request IS NOT NULL
:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE`
WHERE
http_request IS NOT NULL
ORDER BY timestamp
LIMIT 100
La siguiente consulta solo incluye filas que corresponden a GET
o POST
solicitudes:
SELECT
timestamp, log_name, severity, http_request, resource, labels
FROM
`TABLE`
WHERE
http_request IS NOT NULL AND
http_request.request_method IN ('GET', 'POST')
ORDER BY timestamp ASC
LIMIT 100
Filtrar por estado HTTP
Para filtrar por estado HTTP, modifica la cláusula WHERE
de modo que solicite la
Se debe definir el campo http_request.status
:
SELECT
timestamp, log_name, http_request.status, http_request, resource, labels
FROM
`TABLE`
WHERE
http_request IS NOT NULL AND
http_request.status IS NOT NULL
ORDER BY timestamp ASC
LIMIT 100
Para determinar el tipo de datos almacenados en un campo, consulta el esquema o la visualización.
en el campo. Los resultados de la consulta anterior muestran que el
El campo http_request.status
almacena valores de número entero.
Filtra por un campo de tipo JSON
Para extraer un valor de una columna cuyo tipo de datos sea JSON, usa la función.
JSON_VALUE
.
Considera las siguientes consultas:
SELECT
json_payload
FROM
`TABLE`
WHERE
json_payload.status IS NOT NULL
y
SELECT
json_payload
FROM
`TABLE`
WHERE
JSON_VALUE(json_payload.status) IS NOT NULL
Las consultas anteriores prueban el valor de la columna json_payload
. el contenido
de esta columna está determinado por el contenido de una entrada de registro. Ambas consultas
descarta las filas que no contienen una columna etiquetada 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 tabla que tenga dos filas. En uno
la columna json_payload
tiene el siguiente formato:
{
status: {
measureTime: "1661517845"
}
}
En la otra fila, la columna 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"
}
Las dos filas anteriores cumplen con la restricción
json_payload.status IS NOT NULL
.
Es decir, el resultado de la consulta incluye ambas filas.
Sin embargo, cuando la restricción es JSON_VALUE(json_payload.status) IS NOT NULL
,
solo se incluye la segunda fila en el resultado.
Filtrar por expresión regular
Para que devuelva la subcadena que coincide con una expresión regular, usa la función
REGEXP_EXTRACT
. El tipo de datos que se devuelve de esta función es
STRING
o BYTES
.
La siguiente consulta muestra las entradas de registro más recientes recibidas, conserva
esas entradas con un campo json_payload.jobName
y, luego, muestra el
parte del nombre que comienza con test
:
SELECT
timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
`TABLE`
WHERE
json_payload.jobName IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20
Para ver más ejemplos, consulta el
Documentación de REGEXP_EXTRACT
Para ver ejemplos de otras expresiones regulares que
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 muestra en la ilustración, usa la función CONTAINS_SUBSTR
.
Agrupa y agrega entradas de registro
Esta sección se basa en los ejemplos anteriores y explica cómo puedes
agrupar y agregar filas de la tabla. Si no especificas una agrupación, pero sí
especificas una agregación, se imprime un solo resultado porque SQL trata todos
filas que satisfacen la cláusula WHERE
como un solo grupo.
Cada expresión SELECT
debe incluirse en los campos del grupo o agregarse.
Agrupar por tiempo
Para agrupar datos por tiempo, usa la función TIMESTAMP_TRUNC
.
que trunca una marca de tiempo a un nivel de detalle específico, como MINUTE
. Para
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 intervalo de tiempo y, luego, retiene
las filas en las que el valor del campo json_payload.status
no sea NULL.
La consulta trunca la marca de tiempo en cada fila por hora y, luego, agrupa los
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`
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 los datos y, luego, agrupa los filas por tipo de recurso. Luego, cuenta el número de filas de cada tipo, y devuelve una tabla con dos columnas. En la primera columna, se enumeran los recursos de tipo, mientras que la segunda columna es el número de filas para ese tipo de recurso:
SELECT
resource.type, COUNT(*) AS count
FROM
`TABLE`
GROUP BY resource.type
LIMIT 100
Agrupar por gravedad
La siguiente consulta lee la hora más reciente de los datos y, luego, retiene filas que tienen un campo de gravedad. Luego, la consulta agrupa las filas por gravedad cuenta el número de filas por cada grupo:
SELECT
severity, COUNT(*) AS count
FROM
`TABLE`
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 enumera los nombres de los registros y la segunda, el número de las entradas de registro que se escribieron en el registro. El consulta ordena los resultados según el recuento de entradas:
SELECT
log_id, COUNT(*) AS count
FROM
`TABLE`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100
Calcula la latencia promedio para las solicitudes HTTP
La siguiente consulta ilustra la agrupación por varias columnas y el cálculo
un valor promedio. La consulta agrupa filas según la URL que se encuentra en las
por solicitud y por el valor del campo labels.checker_location
. Después del
cuando agrupas 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`
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 para
labels
es JSON.
Sin embargo, no se usa esta función para extraer el valor del
http_request.latency.seconds
. El último campo tiene un tipo de datos que
entero.
Calcula el promedio de bytes enviados para una prueba de subred
La siguiente consulta ilustra cómo podrías mostrar la cantidad promedio de bytes enviados por ubicación.
La consulta lee la hora más reciente de los datos y, luego, retiene solo esas filas
cuya columna de tipo de recurso es gce_subnetwork
y cuyo json_payload
no sea NULL. Luego, la consulta agrupa las filas por la ubicación de
recurso. A diferencia del ejemplo anterior, en el que los datos se almacenan como valores
value, el valor del campo bytes_sent
es una cadena y, por lo tanto,
convierte el valor en 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`
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 indica una ubicación y el promedio de bytes enviados para esa ubicación.
Para obtener información sobre todas las funciones que pueden recuperar y transformar JSON consulta Funciones 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 que devuelva la subcadena que coincide con una expresión regular, usa la función
REGEXP_EXTRACT
. El tipo de datos que se devuelve de esta función es
STRING
o BYTES
.
La siguiente consulta retiene las entradas de registro para las cuales 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 el número de entradas en cada grupo:
SELECT
REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
COUNT(*) AS count
FROM
`TABLE`
WHERE
json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20
Para ver más ejemplos, consulta el
Documentación de REGEXP_EXTRACT
Para ver ejemplos de otras expresiones regulares que
que puedes usar, consulta Funciones, operadores y condicionales.
Búsqueda en varias columnas
En esta sección, se describen dos enfoques diferentes que puedes usar para realizar búsquedas varias columnas de una tabla.
Búsqueda basada en tokens
Para buscar entradas en una tabla que coincidan con un conjunto de términos de búsqueda, sigue estos pasos:
usa la función SEARCH
. Esta función requiere dos parámetros:
dónde buscar y la consulta de búsqueda.
Como 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 las filas que tienen un campo que coincida exactamente con “35.193.12.15”:
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`TABLE` AS t
WHERE
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
SEARCH(t,"`35.193.12.15`")
ORDER BY timestamp ASC
LIMIT 20
En la consulta anterior, las comillas simples encapsulan el valor que se va a buscar. Esta
garantiza que la función SEARCH
busque una coincidencia exacta entre
un valor de campo y el valor entre las comillas simples.
Cuando se omiten las comillas simples en la cadena de consulta, la cadena de consulta se divide.
según las reglas definidas en la documentación de SEARCH
.
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 sentencia 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 sentencias SEARCH
en una consulta. Por ejemplo, en la
consulta anterior, podrías reemplazar el filtro en el ID de registro con una
una declaración como la siguiente:
SEARCH(t,"`cloudaudit.googleapis.com/data_access`")
La instrucción anterior busca en toda la tabla, mientras que la instrucción original
solo busca en la columna log_id
.
Para realizar varias búsquedas en una columna, separa las cadenas individuales con un espacio. Por ejemplo, la siguiente instrucción coincide con filas en las que un campo contiene “Hello World”, “happy” y “days”:
SEARCH(t,"`Hello World` happy days")
Por último, puedes buscar columnas específicas de una tabla en lugar de buscar en
en toda la tabla. 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 lo siguiente:
consulta la página de referencia de BigQuery Funciones de búsqueda.
Búsqueda de subcadenas
Para realizar una prueba que no distingue mayúsculas de minúsculas para determinar si un valor existe en una
usa la función CONTAINS_SUBSTR
.
Esta función muestra TRUE
cuando el valor existe y
De lo contrario, FALSE
. El valor de búsqueda debe ser un literal de STRING
, pero no el
NULL
literal.
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 intervalo de tiempo específico. Por último, la consulta ordena los resultados y muestra los 20 más antiguos:
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`TABLE` AS t
WHERE
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
CONTAINS_SUBSTR(t,"35.193.12.15")
ORDER BY timestamp ASC
LIMIT 20
La consulta anterior realiza una prueba de subcadena. Por lo tanto, una fila que contiene
“35.193.12.152” coincide con la declaración CONTAINS_SUBSTR
.
Combinar 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 instrucciones de consulta para combinar
resultados de las sentencias SELECT
en diferentes tablas o conjuntos de datos de una
variedad de maneras y, luego, selecciona las columnas de los datos combinados.
Combinar datos de dos tablas con uniones
Para combinar información de dos tablas, usa la función join. operadores. 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 en
dos tablas diferentes escritas por el mismo intervalo de seguimiento. La consulta realiza una
interno JOIN
sobre dos tablas para las filas en las que los valores de
las columnas span_id
y trace
de ambas tablas coinciden. A partir de este resultado,
Luego, la consulta selecciona los campos timestamp
, severity
y json_payload
.
que provenían de TABLE_1, el campo json_payload
de
TABLE_2 y los valores de span_id
y trace
en los que se unieron las dos tablas, y devuelve hasta 100
filas:
SELECT
a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM `TABLE_1` a
JOIN `TABLE_2` b
ON
a.span_id = b.span_id AND
a.trace = b.trace
LIMIT 100
Cómo combinar varias selecciones con uniones
Para combinar los resultados de dos o más sentencias SELECT
y descartar
las filas duplicadas, usa el operador UNION
. Para conservar el duplicado
filas, usa el operador UNION ALL
.
La siguiente consulta lee los datos de la hora más reciente del TABLE_1, combina el resultado con la hora más reciente de datos de TABLE_2, ordena los datos combinados aumentando marca de tiempo y, luego, muestra las 100 entradas más antiguas:
SELECT
timestamp, log_name, severity, json_payload, resource, labels
FROM(
SELECT * FROM `TABLE_1`
UNION ALL
SELECT * FROM `TABLE_2`
)
ORDER BY timestamp ASC
LIMIT 100
¿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 el Análisis de registros
- Vincula un bucket de registros a un conjunto de datos de BigQuery
- Configurar y administrar receptores
Para obtener documentación de referencia de SQL, consulta los siguientes documentos: