Este documento descreve como o Google Cloud Observability determina os campos de um
LogEntry do registro de log OTLP quando esse registro é enviado
para Google Cloud usando a API Telemetry.
Estrutura geral dos dados de registro formatados em OTLP
Quando os dados de registro são enviados para Google Cloud usando a API Telemetry, eles precisam estar em um formato consistente com o OTLP. A estrutura geral desses dados é mostrada abaixo:
"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 a Observabilidade do Google Cloud recebe um objeto resourceLogs, ela 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 registro em si.
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 a seguinte lista priorizada de atributos de registro do OpenTelemetry para determinar o nome do registro:
Os nomes de registros precisam ser codificados para URL ou seguros 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 OTLP para tipo de recurso. |
timestamp |
O sistema usa a seguinte lista priorizada de campos de registro de
logs 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 |
Definido como o horário em que o LogEntry é ingerido. |
severity |
O sistema mapeia a gravidade do OpenTelemetry no registro de log para uma gravidade do Cloud Logging. Para mais detalhes, consulte Campo "Gravidade". |
httpRequest |
O sistema mapeia os atributos FIXME. Há outros campos que são mapeados para esse campo. |
labels |
O sistema define esse campo usando os valores dos atributos do registro de log. Para mais informações, consulte Campo "Rótulos". |
trace |
O sistema define esse campo como o valor do campo traceId do registro de
registro. O valor precisa ser uma
string hexadecimal de 32 caracteres válida. Caso contrário, a entrada será rejeitada. |
spanId |
O sistema define esse campo como o valor do campo spanId do registro de
registro. O valor precisa ser uma
string hexadecimal válida de 16 caracteres. Caso contrário, a entrada será rejeitada. |
traceSampled |
Não definido. |
sourceLocation |
O sistema define esse campo com os valores dos atributos Code do registro de log. Para mais informações, consulte o campo SourceLocation. |
split |
Não definido. |
apphubapphubDestinationapphubSource |
Não definido. |
otel |
Para campos nos dados de registros 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. |
| Payload | O sistema define o payload convertendo o corpo de um registro de log em um tipo de payload adequado. 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-valor do OpenTelemetryLogRecord.attribute. |
Valor armazenado no campo LogEntry(nomes da referência 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 log que contém dois atributos, cada um deles com pelo menos outro atributo:
log_record {
attributes: {
gcp.http_request {
"requestMethod": "GET",
"requestUrl": "some-URL",
}
http_request {
"requestMethod": "GET",
}
}
}
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 de entrada de registro:
Par de chave-valor do OpenTelemetryLogRecord.attribute. |
Valor armazenado no campo LogEntry(nomes da referência 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 "Marcadores"
Para determinar quais rótulos anexar à entrada de registro, o sistema realiza as seguintes ações:
Ele remove do registro de log OTLP todos os atributos que foram mapeados para campos
LogEntryespecíficos.Por exemplo, suponha que haja os atributos anexados a um registro de log:
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
LogEntryespecíficos, os seguintes campos permanecem:attributes: { "log_array_attr: ["value1", "value2"], "log_json_attr": {"json_key": "json_value"} "log-string-attr": "string", }Se um atributo contiver uma matriz ou elementos JSON, o sistema vai converter o valor em uma string.
Por exemplo, o seguinte ilustra como
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 Otel
Para campos nos dados de registros 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 protobuf |
|---|---|
string |
string |
boolean |
bool |
integer |
double |
float |
double |
Array |
ListValues |
KeyValueList |
Struct |
Para evitar erros de dupla precisão, 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, ele copia a string para o campoLogEntry.textPayload.KeyValueList: o sistema converte esses pares em JSON e preenche o campoLogEntry.jsonPayloadcom as seguintes restrições:- Quando um registro OTLP contém chaves de atributo duplicadas, o sistema retém a primeira chave e descarta 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 "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 dos dois estiver definido, a gravidade do registro será definida como DEFAULT.
| Número de gravidade do OpenTelemetry Enum (value) |
Texto de gravidade do OpenTelemetry (os testes não diferenciam maiúsculas e minúsculas) |
Gravidade do Cloud Logging Enum (value) |
|---|---|---|
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 código 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-valor do OpenTelemetryLogRecord.attribute. |
Valor armazenado no campo LogEntry(nomes da referência 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 processa determinados tipos de dados.
Limites
| Descrição | Valor | Observações |
|---|---|---|
| Número máximo de registros por solicitação OTLP | 8192 | Refere-se ao número máximo de logRecords em uma estrutura resourceLogs do OTLP. Limite. |
| Tamanho máximo de cada solicitação | 5 MiB | Limite. |
Tamanho máximo de um LogEntrycriado com um registro de log OTLP |
256 KiB | O Cloud Logging trunca ou descarta dados de um registro de log OTLP quando necessário. Limite. |
| Tamanho máximo de uma chave de atributo | 512 B | Chaves de rótulo muito grandes são truncadas quando o registro de log OTLP é convertido
em um LogEntry. Limite. |
| Comprimento máximo de um valor de atributo | 64 KiB | Valores de rótulo muito grandes quando o registro de log do OTLP é convertido em um
LogEntry. Limite. |
| Profundidade máxima do aninhamento de atributos | 5 | Os atributos que excedem esse limite são truncados quando o registro de log 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 para determinar o nível de gravidade do Cloud Logging. Se o registro 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 em uma string os atributos anexados a um registro de log. Para ver um exemplo, consulte Campo "Rótulos".
Os nomes de registros precisam ser codificados para URL ou seguros para URL durante a ingestão. Para informações sobre como os nomes de registros são definidos, consulte Como os campos
LogEntrysão definidos.