Este documento contém exemplos de consultas em entradas de registro armazenadas em
buckets de registros que foram atualizados para usar o Observability Analytics.
Nesses buckets, é possível executar consultas SQL na página
Observability Analytics no Google Cloud console. Para mais exemplos, consulte os
logging-analytics-samples e os
security-analytics repositórios do GitHub.
Este documento não descreve o SQL nem como rotear e armazenar entradas de registro. Para informações sobre esses tópicos, consulte a seção A seguir.
Os exemplos nesta página consultam visualizações de registro. Para consultar uma
visualização de análise, use o seguinte formato de caminho:
`analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`.
Na expressão anterior, PROJECT_ID é o ID do projeto, e LOCATION e ANALYTICS_VIEW_ID são o local e o nome da visualização de análise.
Suporte à linguagem SQL
As consultas usadas na página Observability Analytics oferecem suporte a funções do GoogleSQL com algumas exceções.
Os comandos SQL a seguir não são aceitos para consultas SQL emitidas usando a página Observability Analytics:
- Comandos DDL e DML
- Funções definidas pelo usuário do JavaScript
- Funções do BigQuery ML
- Variáveis SQL
Os comandos a seguir são aceitos apenas quando você consulta um conjunto de dados vinculado usando as páginas BigQuery Studio e Looker Studio ou a ferramenta de linha de comando bq:
- Funções definidas pelo usuário do JavaScript
- Funções do BigQuery ML
- Variáveis SQL
Práticas recomendadas
Para definir o período da consulta, recomendamos que você use o seletor de período. Por exemplo, para visualizar os dados da semana passada, selecione Últimos 7 dias no seletor de período. Também é possível usar o seletor de período para especificar um horário de início e término, especificar um horário para visualizar e mudar os fusos horários.
Se você incluir um campo timestamp na cláusula WHERE, a configuração do seletor de período não será usada. O exemplo a seguir ilustra como filtrar por carimbo de data/hora:
-- Matches log entries whose timestamp is within the most recent 1 hour.
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
Para mais informações sobre como filtrar por horário, consulte Funções de horário e Funções de carimbo de data/hora.
Antes de começar
Esta seção descreve as etapas que você precisa concluir antes de usar o Observability Analytics.
configurar buckets de registros
Verifique se os buckets de registros foram atualizados para usar o Observability Analytics:
-
No Google Cloud console, acesse a página Armazenamento de registros:
Acessar o armazenamento de registros
Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Logging.
- Para cada bucket de registros que tenha uma visualização de registro que você quer consultar, verifique se a Observability Analytics disponível coluna mostra Abrir. Se Fazer upgrade for mostrado, clique em Fazer upgrade e conclua a caixa de diálogo.
Configurar papéis e permissões do IAM
Esta seção descreve os papéis ou permissões do IAM necessários para usar o Observability Analytics:
-
Para receber as permissões necessárias para usar o Observability Analytics e consultar visualizações de registro, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
-
Para consultar os buckets de registro
_Requirede_Default: Leitor de registros (roles/logging.viewer) -
Para consultar todas as visualizações de registro em um projeto:
Acessador de visualização de registros (
roles/logging.viewAccessor)
É possível restringir um principal a uma visualização de registro específica adicionando uma condição do IAM à concessão de papel do Acessador de visualização de registros feita no nível do projeto ou adicionando uma vinculação do IAM ao arquivo de política da visualização de registro. Para mais informações, consulte Controlar o acesso a uma visualização de registro.
Essas são as mesmas permissões necessárias para visualizar entradas de registro na página Análise de registros. Para informações sobre outros papéis necessários para consultar visualizações em buckets definidos pelo usuário ou para consultar a visualização
_AllLogsdo_Defaultbucket de registros, consulte Papéis do Cloud Logging. -
Para consultar os buckets de registro
-
Para receber as permissões necessárias para consultar visualizações de análise, peça ao administrador para conceder a você o papel do IAM Usuário do Observability Analytics (
roles/observability.analyticsUser) no projeto.
Como usar as consultas nesta página
-
No Google Cloud console, acesse a manage_search Análise de dados de registros página:
Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Logging.
No painel Consulta, clique em code SQL e copie e cole uma consulta no painel de consulta SQL.
Antes de copiar uma consulta, na cláusula
FROM, substitua os seguintes campos:- PROJECT_ID: o identificador do projeto.
- LOCATION: o local da visualização de registro ou da visualização de análise.
- BUCKET_ID: o nome ou ID do bucket de registros.
- LOG_VIEW_ID: o identificador da visualização de registro, que é limitado a 100 caracteres e pode incluir apenas letras, dígitos, sublinhados e hifens.
A seguir, mostramos o formato da cláusula
FROMpara uma visualização de registro:FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`Os exemplos de registro nesta página consultam uma visualização de registro. Para consultar uma visualização de análise, use o seguinte formato de caminho:
`analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. Na expressão anterior,PROJECT_IDé o ID do projeto, eLOCATIONeANALYTICS_VIEW_IDsão o local e o nome da visualização de análise.
Para usar as consultas mostradas neste documento na página BigQuery Studio ou
usar a ferramenta de linha de comando bq, edite a cláusula FROM e insira o
caminho para o conjunto de dados vinculado.
Por exemplo, para consultar a _AllLogs
visualização no conjunto de dados vinculado chamado mydataset
que está no projeto myproject, o caminho é
myproject.mydataset._AllLogs.
Casos de uso comuns
Esta seção lista vários casos de uso comuns que podem ajudar você a criar consultas personalizadas.
Mostrar entradas de registro no bucket de registros padrão
Para consultar o bucket _Default, execute a seguinte 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
Extrair o valor do campo por expressão regular
Para extrair um valor de uma string usando uma expressão regular, use a função
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 mais informações, consulte a
REGEXP_EXTRACT documentação.
Para correspondências de substrings, como a consulta anterior, o uso da
CONTAINS_SUBSTR função resulta em uma consulta mais eficiente.
Filtrar entradas de registro
Para aplicar um filtro à consulta, adicione uma cláusula WHERE. A sintaxe usada nessa cláusula depende do tipo de dados do campo. Esta seção fornece vários exemplos para diferentes tipos de dados.
Filtrar entradas de registro por tipo de payload
As entradas de registro podem ter um destes três tipos de payload. Para filtrar entradas de registro por tipo de payload, use uma das seguintes cláusulas:
Payloads de texto
-- Matches log entries that have a text payload. WHERE text_payload IS NOT NULLPayloads JSON
-- Matches log entries that have a JSON payload. WHERE json_payload IS NOT NULLPayloads Proto
-- 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
Nos resultados da consulta, os campos json_payload e proto_payload são renderizados em JSON, que você pode navegar.
Filtrar dados de registro por carimbo de data/hora
Para filtrar entradas de registro pelo carimbo de data/hora, recomendamos que você use o seletor de período. No entanto, também é possível especificar o timestamp na cláusula WHERE:
-- Matches log entries whose timestamp is within the most recent hour
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
Para mais informações sobre como filtrar por horário, consulte Funções de horário e Funções de carimbo de data/hora.
Filtrar por recurso
Para filtrar os dados de registro por recurso, adicione uma instrução resource.type à cláusula WHERE:
-- Matches log entries whose resource type is gce_instance
WHERE resource.type = "gce_instance"
Filtrar por gravidade
Para filtrar os dados de registro por gravidade, adicione uma instrução severity à cláusula WHERE:
-- Matches log entries whose severity is INFO or ERROR
WHERE severity IS NOT NULL AND severity IN ('INFO', 'ERROR')
Também é possível filtrar as entradas de registro pelo severity_number, que é um número inteiro. Por exemplo, a cláusula a seguir corresponde a todas as entradas de registro cujo nível de gravidade seja pelo menos NOTICE:
-- Matches log entries whose severity level is at least NOTICE
WHERE severity_number IS NOT NULL AND severity_number > 200
Para informações sobre os valores enumerados, consulte
LogSeverity.
Filtrar por nome do registro
Para filtrar os dados de registro por nome de registro, adicione uma instrução log_name ou log_id à cláusula WHERE:
O nome do registro especifica o caminho do recurso:
-- Matches log entries that have the following log ID. WHERE log_name="projects/cloud-logs-test-project/logs/cloudaudit.googleapis.com%2Factivity"O ID do registro omite o caminho do recurso:
-- Matches log entries that have the following log id. WHERE log_id = "cloudaudit.googleapis.com/data_access"
Filtrar entradas de registro por rótulo de recurso
Os rótulos de recursos são armazenados como uma estrutura JSON. Para filtrar pelo valor de
um campo em uma estrutura JSON, use a função
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
A consulta anterior depende do formato dos rótulos de recursos, conforme armazenados em uma entrada de registro. Confira abaixo um exemplo do campo de recurso:
{
type: "gce_instance"
labels: {
instance_id: "1234512345123451"
project_id: "my-project"
zone: "us-central1-f"
}
}
Para informações sobre todas as funções que podem recuperar e transformar dados JSON, consulte Funções JSON.
Filtrar por solicitação HTTP
Para consultar apenas entradas de registro que tenham um campo de solicitação HTTP, use a seguinte 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
Também é possível usar a instrução IN:
-- Matches log entries whose HTTP request_method is GET or POST.
WHERE http_request.request_method IN ('GET', 'POST')
Filtrar por status HTTP
Para consultar apenas entradas de registro que tenham um status HTTP, use a seguinte cláusula:
-- Matches log entries that have an http_request.status field.
WHERE http_request.status IS NOT NULL
Filtrar por um campo em um tipo de dados JSON
Para consultar apenas entradas de registro quando o subcampo de um campo com um tipo de dados JSON
tem um valor específico, extraia o valor usando a função
JSON_VALUE:
-- Compare the value of the status field to NULL.
WHERE JSON_VALUE(json_payload.status) IS NOT NULL
A cláusula anterior é sutilmente diferente da seguinte:
-- Compare the status field to NULL.
WHERE json_payload.status IS NOT NULL
A primeira cláusula testa se o valor do campo de status é NULL. A segunda cláusula testa se o campo de status existe. Suponha que uma visualização de registro contenha duas entradas de registro. Para uma entrada de registro, o campo json_payload tem o seguinte formato:
{
status: {
measureTime: "1661517845"
}
}
Para a outra entrada de registro, o campo json_payload tem uma estrutura 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"
}
A cláusula WHERE json_payload.status IS NOT NULL corresponde a ambas as entradas de registro.
No entanto, a cláusula WHERE JSON_VALUE(json_payload.status) IS NOT NULL corresponde apenas à segunda entrada de registro.
Agrupar e agregar entradas de registro
Esta seção se baseia nos exemplos anteriores e ilustra como agrupar e agregar entradas de registro. Se você não especificar um agrupamento, mas especificar uma agregação, um resultado será impresso porque o SQL trata todas as linhas que atendem à cláusula WHERE como um grupo.
Toda expressão SELECT precisa ser incluída nos campos de grupo ou agregada.
Agrupar entradas de registro por carimbo de data/hora
Para agrupar dados por carimbo de data/hora, use a função
TIMESTAMP_TRUNC,
que trunca um carimbo de data/hora para uma granularidade 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 mais informações, consulte a documentação TIMESTAMP_TRUNC
e Funções de data e hora.
Agrupar entradas de registro por recurso
A consulta a seguir mostra como agrupar entradas de registro pelo tipo de recurso e, em seguida, contar o número de entradas de registro em 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 gravidade
A consulta a seguir mostra como agrupar entradas de registro pela gravidade e, em seguida, contar o número de entradas de registro em 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 pelo log_id
A consulta a seguir mostra como agrupar entradas de registro pelo ID do registro e, em seguida, contar o número de entradas de registro em 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 a latência média de solicitações HTTP por URL
A consulta a seguir ilustra como agrupar entradas de registro pelo URL e local da solicitação HTTP e, em seguida, contar o número de entradas de registro em 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 a média de bytes enviados para um teste de sub-rede
A consulta a seguir mostra como agrupar entradas de registro pelo local especificado nos rótulos de recursos e, em seguida, calcular o número de entradas de registro em 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 mais informações, consulte Funções JSON e Funções de conversão.
Contar as entradas de registro com um campo que corresponde a um padrão
Para retornar a substring que corresponde a uma expressão regular, use a função
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 outros exemplos, consulte a
REGEXP_EXTRACT documentação.
Pesquisa entre colunas
Esta seção descreve duas abordagens que podem ser usadas para pesquisar várias colunas da visualização que você está consultando:
Pesquisas baseadas em token: você especifica o local da pesquisa, uma consulta de pesquisa e usa a
SEARCHfunção. Como a funçãoSEARCHtem regras específicas sobre como os dados são pesquisados, recomendamos que você leia a documentaçãoSEARCH.Pesquisas baseadas em substrings: você fornece o local da pesquisa, um literal de string, e usa a função
CONTAINS_SUBSTR. O sistema realiza um teste que não diferencia maiúsculas de minúsculas para determinar se o literal de string existe em uma expressão. A funçãoCONTAINS_SUBSTRretornaTRUEquando o literal de string existe eFALSEcaso contrário. O valor da pesquisa precisa ser um literalSTRING, mas não oNULL.
Pesquisa baseada em token em uma visualização de registro
A consulta a seguir retém apenas as linhas que têm um campo que corresponde exatamente a "35.193.12.15":
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
-- Search data access audit logs for the IP address that matches 35.193.12.15.
-- The use of backticks prevents the string from being tokenized.
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
SEARCH(t,"`35.193.12.15`")
ORDER BY timestamp ASC
LIMIT 20
Quando as aspas invertidas são omitidas na string de consulta, a string de consulta é dividida
com base nas regras definidas na documentação SEARCH.
Por exemplo, quando a instrução a seguir é executada, a string de consulta é dividida em quatro tokens: "35", "193", "12" e "15":
SEARCH(t,"35.193.12.15")
A instrução SEARCH anterior corresponde a uma linha quando um único campo corresponde a todos os quatro tokens. A ordem dos tokens não importa.
É possível incluir várias instruções SEARCH em uma consulta. Por exemplo, na consulta anterior, você pode substituir o filtro no ID do registro por uma instrução como a seguinte:
SEARCH(t,"`cloudaudit.googleapis.com/data_access`")
A instrução anterior pesquisa todos os campos das entradas de registro na visualização de registro, enquanto a instrução original pesquisa apenas o campo log_id das entradas de registro.
Para realizar várias pesquisas em vários campos, separe as strings individuais com um espaço. Por exemplo, a instrução a seguir corresponde a linhas em que um campo contém "Hello World", "happy" e "days":
SEARCH(t,"`Hello World` happy days")
Por fim, é possível pesquisar campos específicos em vez de pesquisar uma tabela inteira. Por exemplo, a instrução a seguir pesquisa apenas as colunas chamadas text_payload e json_payload:
SEARCH((text_payload, json_payload) ,"`35.222.132.245`")
Para informações sobre como os parâmetros da função SEARCH são processados,
consulte a página de referência do BigQuery Funções de pesquisa.
Pesquisa de substrings em uma visualização de registro
Por exemplo, a consulta a seguir busca todas as entradas de registro de auditoria de acesso a dados com um endereço IP específico cujos carimbos de data/hora estejam em um período específico. Por fim, a consulta classifica os resultados e mostra os 20 resultados mais antigos:
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 várias visualizações
As instruções de consulta verificam uma ou mais tabelas ou expressões e retornam as linhas de resultados calculadas. Por exemplo, é possível usar instruções de consulta para mesclar os resultados de instruções SELECT em diferentes tabelas ou conjuntos de dados de várias maneiras e, em seguida, selecionar as colunas dos dados combinados.
Para mesclar visualizações, as seguintes restrições se aplicam:
-
Os locais das visualizações atendem a um dos seguintes requisitos:
- Todas as visualizações têm o mesmo local.
- Todas as visualizações estão no local
globalouus.
-
Quando os recursos de armazenamento usam chaves de criptografia gerenciadas pelo cliente (CMEK), uma das seguintes condições é verdadeira:
- Os recursos de armazenamento que usam CMEK usam a mesma chave do Cloud KMS.
- Os recursos de armazenamento que usam CMEK têm um ancestral comum, e esse ancestral especifica uma chave padrão Cloud KMS que está no mesmo local que os recursos de armazenamento.
Quando um ou mais recursos de armazenamento usam CMEK, o sistema criptografa os dados temporários gerados por a mescla com a chave comum do Cloud KMS ou a chave padrão do Cloud KMS do ancestral.
Por exemplo, suponha que você tenha duas visualizações que residam no mesmo local. Em seguida, é possível mesclar essas visualizações quando uma das seguintes condições for verdadeira:
- Os recursos de armazenamento não usam CMEK.
- Um recurso de armazenamento usa CMEK e o outro não.
- Ambos os recursos de armazenamento usam CMEK e ambos usam a mesma chave do Cloud KMS.
Ambos os recursos de armazenamento usam CMEK, mas usam chaves diferentes. No entanto, os recursos compartilham um ancestral que especifica uma chave padrão do Cloud KMS que está no mesmo local que os recursos de armazenamento.
Por exemplo, suponha que a hierarquia de recursos de um bucket de registros e um bucket de observabilidade inclua a mesma organização. É possível mesclar visualizações nesses buckets quando, para essa organização, você tiver configurado as configurações de recursos padrão para o Cloud Logging e para buckets de observabilidade com a mesma chave padrão do Cloud KMS para o local de armazenamento.
Mesclar duas visualizações de registro pelo ID do trace
Para combinar informações de duas tabelas, use um dos operadores de mescla:
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 duas visualizações de registro com uma instrução de união
Para combinar os resultados de duas ou mais instruções SELECT e descartar
linhas duplicadas, use o operador UNION. Para manter linhas duplicadas, use o 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
Remover entradas de registro duplicadas
O Observability Analytics não remove entradas de registro duplicadas antes da execução de uma consulta. Esse comportamento é diferente de quando você consulta entradas de registro usando a Análise de registros, que remove entradas duplicadas comparando os nomes de registro, carimbos de data/hora e campos de ID de inserção.
É possível usar a validação no nível da linha para remover entradas de registro duplicadas.
Para mais informações, consulte Solução de problemas: há entradas de registro duplicadas nos resultados do Observability Analytics.
A seguir
Para informações sobre como rotear e armazenar entradas de registro, consulte os seguintes documentos:
- Criar um bucket de registros
- Fazer upgrade de um bucket para usar o Observability Analytics
- Vincular um bucket de registros a um conjunto de dados do BigQuery
- Configurar e gerenciar coletores
Para a documentação de referência do SQL, consulte os seguintes documentos: