Neste documento, descrevemos como o Google Cloud Observability determina os campos de um
LogEntry do registro de registro do OTLP, quando esse registro é enviado
para Google Cloud usando a API Telemetry.
Os exportadores do Google Cloud para o Cloud Logging convertem dados de registro formatados em OTLP
em objetos LogEntry. Em seguida, eles enviam esses dados para o projeto do Google Cloud usando a API Cloud Logging. No entanto, as regras padrão que o Google Cloud Observability e os
exportadores usam para criar entradas de registro são diferentes. Para mais informações, consulte
Configurar o Google Cloud Observability para usar os mapeamentos do exportador.
Estrutura geral dos dados de registro formatados em OTLP
Quando os dados de registro são enviados para o Google Cloud usando a API Telemetry, eles precisam estar em um formato consistente com o OTLP. A estrutura geral desses dados é mostrada aqui:
"resourceLogs": [
{
"resource": {
"attributes": [...]
},
"scopeLogs": [
{
"logRecords": [...]
}
]
}
]
O OpenTelemetry agrupa registros individuais, cada um representado por uma estrutura logRecord, com informações sobre a origem desses registros, que é representada pela estrutura resource.
Quando o Google Cloud Observability recebe um objeto resourceLogs, ele cria um
LogEntry para cada logRecord. Ao contrário do OTLP, que agrupa informações de origem com uma coleção de registros individuais, cada estrutura LogEntry contém informações sobre a origem do registro e o próprio registro.
Para saber mais sobre a estrutura dos dados de registro formatados em OTLP,
consulte o logs.proto do OpenTelemetry.
Como os campos LogEntry são definidos
O Google Cloud Observability usa as seguintes regras para determinar os valores dos campos LogEntry:
Campo LogEntry(nomes da referência HTTP) |
Como o sistema determina o valor do campo |
|---|---|
logName |
O sistema usa o valor do campo
Os nomes de registro precisam ser seguros para URL ou codificados para URL durante a ingestão. |
resource |
O sistema usa as informações definidas no campo resource
ou infere o recurso. Para mais detalhes, consulte
Mapeamento de atributos do OTLP para o tipo de recurso. |
timestamp |
O sistema usa a seguinte lista priorizada de campos de registro de log do OpenTelemetry para determinar o
O período de armazenamento do bucket de registros que armazena os dados determina o carimbo de data/hora mais antigo que pode ser ingerido. Para mais informações, consulte Cotas do Cloud Logging. |
receiveTimestamp |
Defina como o horário em que o LogEntry é ingerido. |
severity |
O sistema mapeia a gravidade do OpenTelemetry no registro para uma gravidade do Cloud Logging. Para mais detalhes, consulte Campo de gravidade. |
httpRequest |
O sistema mapeia os atributos |
labels |
O sistema define esse campo usando os valores dos atributos do registro. Para mais informações, consulte o campo Rótulos. |
trace |
O sistema define esse campo como o valor do campo traceId do registro. O valor precisa ser uma
string hexadecimal válida de 32 caracteres, ou a entrada será rejeitada. |
spanId |
O sistema define esse campo como o valor do campo spanId do registro. O valor precisa ser uma
string hexadecimal válida de 16 caracteres, ou a entrada será rejeitada. |
traceSampled |
O sistema define esse campo com base no bit menos significativo do campo flags do registro. Se o bit menos significativo
for igual a 1, esse campo será definido como
true. Caso contrário, ele permanecerá indefinido. |
sourceLocation |
O sistema define esse campo com os valores dos atributos Code do registro de registro. Para mais informações, consulte o campo SourceLocation. |
split |
Não definido. |
apphubapphubDestinationapphubSource |
Não definido. |
otel |
Para campos em dados de registro do OTLP que não têm um campo equivalente em um
LogEntry, o sistema converte os tipos de dados e adiciona
os dados convertidos ao campo otel. Para mais informações,
consulte Campo Otel. |
operation |
O sistema mapeia os atributos |
| Payload | O sistema define o payload convertendo o corpo de um registro de registro em um tipo de payload apropriado. Para mais informações, consulte Campo de payload. |
Campo HttpRequest
O Google Cloud Observability mapeia atributos OTLP que se aplicam a solicitações HTTP para campos LogEntry. As seções a seguir descrevem como o sistema mapeia
atributos simples e aninhados.
Atributos simples
A tabela a seguir descreve como o Google Cloud Observability mapeia atributos simples que se aplicam
a solicitações HTTP para campos LogEntry.
Por exemplo, o valor do atributo http.request.method: "GET", é definido
como o valor do campo httpRequest.requestMethod em uma entrada de registro:
Par de chave-valorLogRecord.attributedo OpenTelemetry. |
Valor armazenado no seguinte campoLogEntry campo(Nomes do referenciador de HTTP) |
Tipo aceito |
|---|---|---|
http.request.method
|
httpRequest.requestMethod |
string |
url.fullhttp.url
|
httpRequest.requestUrl |
string |
http.request.body.size |
httpRequest.requestSize |
string, int |
http.response.status_code |
httpRequest.status |
string, int |
http.response.body.size |
httpRequest.responseSize |
string, int |
user_agent.originalhttp.user_agent
|
httpRequest.userAgent |
string |
client.address |
remoteIp |
string |
server.address |
serverIp |
string |
referrer |
httpRequest.referer |
string |
latency |
httpRequest.latency |
string, int |
cacheLookup |
httpRequest.cacheLookup |
bool |
cacheHit |
httpRequest.cacheHit |
bool |
cacheValidatedWithOriginServer |
httpRequest.cacheValidatedWithOriginServer |
bool |
cacheFillBytes |
httpRequest.cacheFillBytes |
string, int |
network.protocol.versionprotocol
|
httpRequest.protocol |
string |
Atributos aninhados
Nesta seção, descrevemos como o Google Cloud Observability mapeia atributos OTLP aninhados que
se aplicam a solicitações HTTP para campos em um LogEntry. O exemplo a seguir
ilustra um registro de registro que contém dois atributos, cada um com
pelo menos um outro atributo:
log_record {
attributes: {
gcp.http_request {
"requestMethod": "GET",
"requestUrl": "some-URL",
}
http_request {
"requestMethod": "GET",
}
}
}
O formato do campo gcp.http_request pode ser de atributos aninhados estruturados
ou uma string JSON de atributos estruturados.
log_record {
attributes: {
gcp.http_request: "{\"requestMethod\": \"GET\", \"requestUrl\": \"some-URL\"}"
}
}
Na tabela, os atributos aninhados são mostrados usando chaves. Por exemplo,
gcp.http_request {requestMethod} significa que o atributo
gcp.http_request contém o atributo requestMethod. O valor do atributo mais interno é atribuído ao valor do campo da entrada de registro:
Par de chave-valorLogRecord.attributedo OpenTelemetry. |
Valor armazenado no seguinte campoLogEntry campo(Nomes do referenciador de HTTP) |
Tipo aceito |
|---|---|---|
gcp.http_request {requestMethod}http_request {requestMethod}
|
httpRequest.requestMethod |
string |
gcp.http_request {requestUrl}http_request {requestUrl}
|
httpRequest.requestUrl |
string |
gcp.http_request {requestSize}http_request {requestSize}
|
httpRequest.requestSize |
string, int |
gcp.http_request {status}http_request {status}
|
httpRequest.status |
string, int |
gcp.http_request {responseSize}http_request {responseSize}
|
httpRequest.responseSize |
string, int |
gcp.http_request {userAgent}http_request {userAgent}
|
httpRequest.userAgent |
string |
gcp.http_request {remoteIp}http_request {remoteIp}
|
httpRequest.remoteIp |
string |
gcp.http_request {serverIp}http_request {serverIp}
|
httpRequest.serverIp |
string |
gcp.http_request {referer}http_request {referrer}
|
httpRequest.referer |
string |
gcp.http_request {latency}http_request {latency}
|
httpRequest.latency |
string, int |
gcp.http_request {cacheLookup}http_request {cacheLookup}
|
httpRequest.cacheLookup |
bool |
gcp.http_request {cacheHit}http_request {cacheHit}
|
httpRequest.cacheHit |
bool |
gcp.http_request {http_request {
|
httpRequest.cacheValidatedWithOriginServer |
bool |
gcp.http_request {cacheFillBytes}http_request {cacheFillBytes}
|
httpRequest.cacheFillBytes |
string, int |
gcp.http_request {protocol}http_request {protocol}
|
httpRequest.protocol |
string |
Campo de rótulos
Para determinar quais rótulos anexar à entrada de registro, o sistema executa as seguintes ações:
Ele remove do registro do OTLP todos os atributos que foram mapeados para campos específicos do
LogEntry.Por exemplo, suponha que haja os atributos anexados a um registro de registro:
attributes: { "log_array_attr: ["value1", "value2"], "log_json_attr": {"json_key": "json_value"} "log-string-attr": "string", "code.file.path": "my-file.cc", "code.function.name: "my-func", "code.line.number": 123, "gcp.http_request": { "requestMethod": "GET", "requestUrl": "my-URL", }, }Depois de remover os campos mapeados para campos específicos do
LogEntry, os seguintes campos permanecem:attributes: { "log_array_attr: ["value1", "value2"], "log_json_attr": {"json_key": "json_value"} "log-string-attr": "string", }Se um atributo tiver uma matriz ou elementos JSON, o sistema vai converter o valor em uma string.
Por exemplo, o exemplo a seguir ilustra como o
LogEntryrepresenta os atributos anteriores:labels: { "log_array_attr": "[\"value1\",\"value2\"]", "log_json_attr": "{\"json_key\":\"json_value\"}", "log-string-attr": "string", }A profundidade máxima de aninhamento para atributos é cinco. Qualquer conteúdo com aninhamento mais profundo é truncado.
Campo de operação
O Google Cloud Observability mapeia os atributos do OTLP que se aplicam à operação para o campo operation de um LogEntry. As seções a seguir descrevem como
o sistema mapeia os atributos aninhados.
O atributo gcp.operation precisa conter tipos de chave-valor. Nomes de atributos
nivelados não são aceitos. O exemplo a seguir ilustra um registro de registro
em que o atributo gcp.operation contém quatro pares de chave-valor:
log_record {
attributes: {
gcp.operation {
"id": "abc123",
"producer": "my_producer",
"first": "true",
"last": "false",
}
}
}
A tabela a seguir descreve como o Google Cloud Observability mapeia o gcp.operation para o
LogEntry:
Par de chave-valorLogRecord.attribute.operationdo OpenTelemetry. |
Valor armazenado no seguinte campo de operaçãoLogEntry |
Tipo aceito |
|---|---|---|
id |
id |
string |
producer |
httpRequest.requestUrl |
string |
first |
first |
bool |
last |
last |
bool |
Campo Otel
Para campos em dados de registro do OTLP que não têm um campo equivalente em um
LogEntry, o sistema converte os tipos de dados e adiciona
os dados convertidos ao campo otel. Por exemplo, o campo otel
armazena atributos dos campos resource, scope e entity.
O sistema usa as seguintes regras para converter os
tipos de dados do OpenTelemetry
em tipos Value do protobuf:
| Tipo do OpenTelemetry | tipo de protobuf |
|---|---|
string |
string |
boolean |
bool |
integer |
double |
float |
double |
Array |
ListValues |
KeyValueList |
Struct |
Para evitar erros de precisão dupla, transmita números inteiros como strings.
Campo de payload
O tipo de dados do campo logRecord.body do OTLP determina a estrutura
do payload LogEntry:
string: o sistema copia a string para o campoLogEntry.textPayload.Array: o sistema cria uma string dos elementos da matriz, preservando as novas linhas. Em seguida, ela copia a string para o campoLogEntry.textPayload.KeyValueList: o sistema converte esses pares em JSON e preenche o campoLogEntry.jsonPayload, com as seguintes restrições:- Quando um registro OTLP contém chaves de atributo duplicadas, o sistema retém a primeira chave e descarta os atributos com chaves duplicadas.
- Quando a profundidade de aninhamento de um par JSON é maior que cinco, o sistema trunca o conteúdo para uma profundidade de cinco.
Campo de gravidade
Nesta seção, descrevemos como o Google Cloud Observability mapeia os campos de gravidade do OpenTelemetry
para os níveis de gravidade do Cloud Logging.
O OpenTelemetry define um número e um texto de gravidade. O
logs.proto define os números de gravidade.
O Google Cloud Observability determina a gravidade do Logging com base no
número de gravidade do OpenTelemetry, se definido. Caso contrário, ele usa o texto de gravidade. Se
nenhum deles estiver definido, a gravidade do Logging será definida como DEFAULT.
| Número de gravidade do OpenTelemetry Tipo enumerado (valor) |
Texto de gravidade do OpenTelemetry (os testes não diferenciam maiúsculas de minúsculas) |
Gravidade do Cloud Logging Tipo enumerado (valor) |
|---|---|---|
SEVERITY_NUMBER_UNSPECIFIED (0) |
"default" not set |
DEFAULT (0) |
SEVERITY_NUMBER_TRACE (1)SEVERITY_NUMBER_TRACE2 (2)SEVERITY_NUMBER_TRACE3 (3)SEVERITY_NUMBER_TRACE4 (4) |
"trace" "trace2" "trace3" "trace4" |
DEBUG (100) |
SEVERITY_NUMBER_DEBUG (5)SEVERITY_NUMBER_DEBUG2 (6)SEVERITY_NUMBER_DEBUG3 (7)SEVERITY_NUMBER_DEBUG4 (8) |
"debug" "debug2" "debug3" "debug4" |
DEBUG (100) |
SEVERITY_NUMBER_INFO (9)SEVERITY_NUMBER_INFO2 (10) |
"info" "info2" |
INFO (200) |
SEVERITY_NUMBER_INFO3 (11)SEVERITY_NUMBER_INFO4 (12) |
"notice" "info3" "info4" |
NOTICE (300) |
SEVERITY_NUMBER_WARN (13)SEVERITY_NUMBER_WARN2 (14)SEVERITY_NUMBER_WARN3 (15)SEVERITY_NUMBER_WARN4 (16) |
"warning" "warn" "warn2" "warn3" "warn4" |
WARNING (400) |
SEVERITY_NUMBER_ERROR (17)SEVERITY_NUMBER_ERROR2 (18)SEVERITY_NUMBER_ERROR3 (19)SEVERITY_NUMBER_ERROR4 (20) |
"error" "error2" "error3" "error4" |
ERROR (500) |
SEVERITY_NUMBER_FATAL (21)SEVERITY_NUMBER_FATAL2 (22) |
"critical" "fatal" "fatal2" |
CRITICAL (600) |
SEVERITY_NUMBER_FATAL3 (23) |
"alert" "fatal3" |
ALERT (700) |
SEVERITY_NUMBER_FATAL4 (24) |
"emergency" "fatal4" |
EMERGENCY (800) |
Campo SourceLocation
O Google Cloud Observability mapeia o seguinte Code do OTLP diretamente para os campos LogEntry. Esse mapeamento é possível porque esses
atributos do OpenTelemetry são semanticamente idênticos aos conceitos do Cloud Logging.
Par de chave-valorLogRecord.attributedo OpenTelemetry. |
Valor armazenado no seguinte campoLogEntry campo(Nomes do referenciador de HTTP) |
Tipo aceito |
|---|---|---|
code.file.path: Value |
sourceLocation.file |
string |
code.function.name: Value |
sourceLocation.function |
string |
code.function.number: Value |
sourceLocation.line |
string, int |
Limitações
Esta seção descreve os limites. Ele também descreve como o Google Cloud Observability lida com determinados tipos de dados.
Limites
| Descrição | Valor | Observações |
|---|---|---|
| Número máximo de registros por solicitação do OTLP | 8192 | Refere-se ao número máximo de logRecords em uma
estrutura resourceLogs do OTLP. Limit. |
| Tamanho máximo de cada solicitação | 5 MiB | Limit. |
Tamanho máximo de um LogEntrycriado com base em um registro de OTLP |
256 KiB | O Cloud Logging trunca ou descarta dados de um registro de OTLP quando necessário. Limit. |
| Comprimento máximo de uma chave de atributo | 512 B | As chaves de rótulo muito grandes são truncadas quando o registro de OTLP é convertido
em um LogEntry. Limit. |
| Tamanho máximo de um valor de atributo | 64 KiB | Valores de rótulo muito grandes quando o registro do OTLP é convertido em um
LogEntry. Limit. |
| Profundidade máxima de aninhamento de atributos | 20 | As solicitações com atributos que excedem esse limite são rejeitadas quando o registro de log do OTLP é
convertido em um LogEntry. |
| Número máximo de bytes de ingestão de registros por minuto | 2,4 GB para as seguintes regiões: 300 MB para todas as outras regiões. |
Cota. |
Comportamento
Quando o número e o texto de gravidade do OpenTelemetry são definidos, o sistema usa o número de gravidade para determinar o nível de gravidade do Cloud Logging. Se o registro do OTLP não tiver informações de gravidade, o nível de gravidade do Cloud Logging será definido como
DEFAULT.Quando um registro OTLP contém chaves de atributo duplicadas, o sistema retém a primeira chave e descarta os atributos com chaves duplicadas.
O sistema converte os atributos anexados a um registro em uma string. Para ver um exemplo, consulte Campo de rótulos.
Os nomes de registro precisam ser seguros para URL ou codificados para URL durante a ingestão. Para saber como os nomes de registro são definidos, consulte Como os campos
LogEntrysão definidos.
Configurar o Google Cloud Observability para usar os mapeamentos do exportador
O Google Cloud Observability e o exportador do Google Cloud para o Cloud Logging usam regras diferentes para criar objetos LogEntry com base em dados de registro formatados em OTLP. Por exemplo,
o Google Cloud Observability preenche o campo otel, mas os exportadores não.
Se você quiser que o Google Cloud Observability use as mesmas regras de mapeamento que os exportadores, faça as seguintes alterações nos aplicativos que enviam registros de OTLP para a API Telemetry:
Adicione o atributo
gcp.use_legacy_mappingao recurso incluído na solicitação. Para mais informações, consulte Como adicionar ou excluir atributos.Quando esse atributo é definido, ocorre o seguinte:
- O campo
otelnão está preenchido. Os atributos que começam com
gcpsão descartados, com as seguintes exceções:gcp.log.namegcp.insert_id
Os dois atributos anteriores são mapeados para campos
LogEntry.
A regra de mapeamento legada faz com que o Google Cloud Observability descarte alguns conteúdos. No entanto, o tamanho dos objetos
LogEntryé menor.- O campo
Adicione processadores ao coletor HTTP do OTLP que definem os seguintes rótulos de registro:
- Defina
instrumentation_scopecomoinstrumentation_scope.name. instrumentation_version: defina comoinstrumentation_scope.version.service.name: defina comoresource.attributes["service.name"].- Defina
service.namespacecomoresource.attributes["service.namespace"]. service.instance.id: defina comoresource.attributes["service.instance.id"].
Para ver um exemplo, consulte Migrar para o exportador do OTLP: processadores.
- Defina