In diesem Dokument wird beschrieben, wie Google Cloud Observability die Felder eines LogEntry aus dem OTLP-Logdatensatz ermittelt, wenn dieser Datensatz über die Telemetry API an Google Cloud gesendet wird.
Allgemeine Struktur von OTLP-formatierten Logdaten
Wenn Logdaten über die Telemetry API an Google Cloud gesendet werden, müssen sie in einem Format vorliegen, das mit OTLP kompatibel ist. Die allgemeine Struktur für diese Daten sieht so aus:
"resourceLogs": [
{
"resource": {
"attributes": [...]
},
"scopeLogs": [
{
"logRecords": [...]
}
]
}
]
OpenTelemetry fasst einzelne Logs, die jeweils durch eine logRecord-Struktur dargestellt werden, mit Informationen zur Quelle dieser Logs, die durch die resource-Struktur dargestellt wird, in Batches zusammen.
Wenn Google Cloud Observability ein resourceLogs-Objekt empfängt, wird für jede logRecord ein LogEntry erstellt. Im Gegensatz zu OTLP, bei dem Quellinformationen mit einer Sammlung einzelner Logs gebündelt werden, enthält jede LogEntry-Struktur Informationen zur Quelle des Logs und zum Log selbst.
Weitere Informationen zur Struktur von OTLP-formatierten Logdaten finden Sie in der OpenTelemetry-Spezifikation für logs.proto.
So werden LogEntry-Felder festgelegt
Google Cloud Observability verwendet die folgenden Regeln, um die Werte für LogEntry-Felder zu ermitteln:
LogEntry-Feld(Namen aus HTTP-Referenz) |
So wird der Feldwert vom System ermittelt |
|---|---|
logName |
Das System verwendet die folgende priorisierte Liste von OpenTelemetry-Logdatensatzattributen, um den Log-Namen zu bestimmen:
Lognamen müssen URL-sicher sein oder werden bei der Aufnahme URL-codiert. |
resource |
Das System verwendet die im Feld resource festgelegten Informationen oder leitet die Ressource ab. Weitere Informationen finden Sie unter OTLP-Attribute zur Zuordnung von Ressourcentypen. |
timestamp |
Das System verwendet die folgende priorisierte Liste von OpenTelemetry-Logeintragfeldern, um die
Der Aufbewahrungszeitraum für den Log-Bucket, in dem die Daten gespeichert werden, bestimmt den ältesten Zeitstempel, der aufgenommen werden kann. Weitere Informationen finden Sie unter Cloud Logging-Kontingente. |
receiveTimestamp |
Wird auf die Zeit festgelegt, zu der LogEntry aufgenommen wird. |
severity |
Das System ordnet den OpenTelemetry-Schweregrad im Logdatensatz einem Cloud Logging-Schweregrad zu. Weitere Informationen finden Sie unter Feld „Schweregrad“. |
httpRequest |
Das System ordnet die FIXME. Es gibt andere Felder, die diesem Feld zugeordnet werden. |
labels |
Das System legt dieses Feld anhand der Werte der Logdatensatzattribute fest. Weitere Informationen finden Sie unter Feld „Labels“. |
trace |
Das System legt dieses Feld auf den Wert des Felds traceId des Logeintrags fest. Der Wert muss ein gültiger 32‑stelliger Hexadezimalstring sein. Andernfalls wird der Eintrag abgelehnt. |
spanId |
Das System legt dieses Feld auf den Wert des Felds spanId des Logeintrags fest. Der Wert muss ein gültiger 16-stelliger Hexadezimalstring sein. Andernfalls wird der Eintrag abgelehnt. |
traceSampled |
Nicht festgelegt. |
sourceLocation |
Das System legt dieses Feld auf die Werte der Code-Attribute des Logeintrags fest. Weitere Informationen finden Sie unter Feld „SourceLocation“. |
split |
Nicht festgelegt. |
apphubapphubDestinationapphubSource |
Nicht festgelegt. |
otel |
Für Felder in OTLP-Logdaten, die kein entsprechendes Feld in einem LogEntry haben, konvertiert das System Datentypen und fügt die konvertierten Daten dann dem Feld otel hinzu. Weitere Informationen finden Sie unter Otel-Feld. |
| Nutzlast | Das System legt die Nutzlast fest, indem es den Text eines Logeintrags in einen geeigneten Nutzlasttyp konvertiert. Weitere Informationen finden Sie unter Nutzlastfeld. |
HttpRequest-Feld
In Google Cloud Observability werden OTLP-Attribute, die für HTTP-Anfragen gelten, LogEntry-Feldern zugeordnet. In den folgenden Abschnitten wird beschrieben, wie das System flache und verschachtelte Attribute zuordnet.
Ebene Attribute
In der folgenden Tabelle wird beschrieben, wie Google Cloud Observability flache Attribute, die für HTTP-Anfragen gelten, LogEntry-Feldern zuordnet.
Der Wert des Attributs http.request.method: "GET", wird beispielsweise als Wert des Felds httpRequest.requestMethod in einem Logeintrag festgelegt:
OpenTelemetryLogRecord.attributeSchlüssel/Wert-Paar. |
Wert, der im folgenden FeldLogEntry gespeichert ist(Namen aus HTTP-Referenz) |
Akzeptierter Typ |
|---|---|---|
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 |
Verschachtelte Attribute
In diesem Abschnitt wird beschrieben, wie Google Cloud Observability verschachtelte OTLP-Attribute, die für HTTP-Anfragen gelten, Feldern in einem LogEntry zuordnet. Das folgende Beispiel zeigt einen Logeintrag mit zwei Attributen, die jeweils mindestens ein weiteres Attribut enthalten:
log_record {
attributes: {
gcp.http_request {
"requestMethod": "GET",
"requestUrl": "some-URL",
}
http_request {
"requestMethod": "GET",
}
}
}
In der Tabelle werden die verschachtelten Attribute mit geschweiften Klammern dargestellt. gcp.http_request {requestMethod} bedeutet beispielsweise, dass das Attribut gcp.http_request das Attribut requestMethod enthält. Der Wert des innersten Attributs wird dem Wert des Logeintragfelds zugewiesen:
OpenTelemetryLogRecord.attributeSchlüssel/Wert-Paar. |
Wert, der im folgenden FeldLogEntry gespeichert ist(Namen aus HTTP-Referenz) |
Akzeptierter Typ |
|---|---|---|
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 |
Feld „Labels“
Um zu ermitteln, welche Labels dem Logeintrag zugewiesen werden sollen, führt das System die folgenden Aktionen aus:
Dadurch werden alle Attribute aus dem OTLP-Logdatensatz entfernt, die bestimmten
LogEntry-Feldern zugeordnet wurden.Angenommen, einem Logdatensatz sind die folgenden Attribute zugeordnet:
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", }, }Nach dem Entfernen von Feldern, die bestimmten
LogEntry-Feldern zugeordnet sind, bleiben die folgenden Felder übrig:attributes: { "log_array_attr: ["value1", "value2"], "log_json_attr": {"json_key": "json_value"} "log-string-attr": "string", }Wenn ein Attribut ein Array oder JSON-Elemente enthält, wird der Wert in einen String konvertiert.
Das folgende Beispiel zeigt, wie die vorherigen Attribute durch
LogEntrydargestellt werden:labels: { "log_array_attr": "[\"value1\",\"value2\"]", "log_json_attr": "{\"json_key\":\"json_value\"}", "log-string-attr": "string", }Die maximale Verschachtelungstiefe für Attribute beträgt fünf. Alle Inhalte, die tiefer verschachtelt sind, werden gekürzt.
Otel-Feld
Für Felder in OTLP-Logdaten, die kein entsprechendes Feld in einem LogEntry haben, konvertiert das System Datentypen und fügt die konvertierten Daten dann dem Feld otel hinzu. Im Feld otel werden beispielsweise Attribute aus den Feldern resource, scope und entity gespeichert.
Das System verwendet die folgenden Regeln, um die OpenTelemetry-Datentypen in Protobuf-Typen Value zu konvertieren:
| OpenTelemetry-Typ | Protobuf-Typ |
|---|---|
string |
string |
boolean |
bool |
integer |
double |
float |
double |
Array |
ListValues |
KeyValueList |
Struct |
Um Fehler bei doppelter Genauigkeit zu vermeiden, übergeben Sie Ganzzahlen als Strings.
Nutzlastfeld
Der Datentyp des OTLP-Felds logRecord.body bestimmt die Struktur der LogEntry-Nutzlast:
string: Das System kopiert den String in das FeldLogEntry.textPayload.Array: Das System erstellt einen String aus den Array-Elementen und behält dabei Zeilenumbrüche bei. Der String wird dann in das FeldLogEntry.textPayloadkopiert.KeyValueList: Das System konvertiert diese Paare in JSON und füllt dann das FeldLogEntry.jsonPayloadmit den folgenden Einschränkungen aus:- Wenn ein OTLP-Datensatz doppelte Attributschlüssel enthält, behält das System den ersten Schlüssel bei und verwirft Attribute mit doppelten Schlüsseln.
- Wenn die Verschachtelungstiefe für ein JSON-Paar größer als fünf ist, wird der Inhalt auf eine Tiefe von fünf gekürzt.
Feld „Schweregrad“
In diesem Abschnitt wird beschrieben, wie Google Cloud Observability die OpenTelemetry-Schweregradfelder den Cloud Logging-Schweregradstufen zuordnet.
OpenTelemetry definiert eine Schweregradnummer und einen Schweregradtext. Die logs.proto definiert die Schweregradnummern.
Google Cloud Observability bestimmt den Logging-Schweregrad anhand der OpenTelemetry-Schweregradnummer, sofern diese festgelegt ist. Andernfalls wird der Schweregradtext verwendet. Wenn keine der beiden festgelegt ist, wird der Schweregrad des Loggings auf DEFAULT gesetzt.
| OpenTelemetry-Schweregradnummer Enum (value) |
OpenTelemetry-Schweregradtext (bei Tests wird die Groß-/Kleinschreibung nicht berücksichtigt) |
Cloud Logging-Schweregrad Enum (value) |
|---|---|---|
SEVERITY_NUMBER_UNSPECIFIED (0) |
„default“ nicht festgelegt |
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) |
Feld „SourceLocation“
In Google Cloud Observability wird der folgende OTLP-Code direkt den Feldern LogEntry zugeordnet. Diese Zuordnung ist möglich, da diese OpenTelemetry-Attribute semantisch mit Cloud Logging-Konzepten identisch sind.
OpenTelemetryLogRecord.attributeSchlüssel/Wert-Paar. |
Wert, der im folgenden FeldLogEntry gespeichert ist(Namen aus HTTP-Referenz) |
Akzeptierter Typ |
|---|---|---|
code.file.path: Value |
sourceLocation.file |
String |
code.function.name: Value |
sourceLocation.function |
String |
code.function.number: Value |
sourceLocation.line |
String, Int |
Beschränkungen
In diesem Abschnitt werden die Einschränkungen beschrieben. Außerdem wird beschrieben, wie Google Cloud Observability bestimmte Datentypen verarbeitet.
Limits
| Beschreibung | Wert | Hinweise |
|---|---|---|
| Maximale Anzahl von Logs pro OTLP-Anfrage | 8.192 | Bezieht sich auf die maximale Anzahl von logRecords in einer OTLP-resourceLogs-Struktur. Limit. |
| Maximale Größe jeder Anfrage | 5 MiB | Limit. |
Maximale Größe eines LogEntry, das aus einem OTLP-Logdatensatz erstellt wird |
256 KiB | Cloud Logging kürzt oder verwirft bei Bedarf Daten aus einem OTLP-Logdatensatz. Limit. |
| Maximale Länge eines Attributschlüssels | 512 B | Zu große Labelschlüssel werden gekürzt, wenn der OTLP-Logdatensatz in ein LogEntry konvertiert wird. Limit. |
| Maximale Länge eines Attributwerts | 64 KiB | Zu große Labelwerte, wenn der OTLP-Logdatensatz in ein LogEntry konvertiert wird. Limit. |
| Maximale Tiefe der Attributverschachtelung | 5 | Attribute, die dieses Limit überschreiten, werden abgeschnitten, wenn der OTLP-Logdatensatz in ein LogEntry konvertiert wird. |
| Maximale Anzahl an Log-Aufnahme-Bytes pro Minute | 2,4 GB für die folgenden Regionen: 300 MB für alle anderen Regionen. |
Kontingent. |
Verhalten
Wenn sowohl die OpenTelemetry-Schweregradnummer als auch der Schweregradtext festgelegt sind, verwendet das System die Schweregradnummer, um den Cloud Logging-Schweregrad zu bestimmen. Wenn der OTLP-Datensatz keine Informationen zum Schweregrad enthält, wird der Schweregrad von Cloud Logging auf
DEFAULTfestgelegt.Wenn ein OTLP-Datensatz doppelte Attributschlüssel enthält, behält das System den ersten Schlüssel bei und verwirft die Attribute mit doppelten Schlüsseln.
Das System wandelt Attribute, die an einen Logdatensatz angehängt sind, in einen String um. Ein Beispiel finden Sie unter Feld „Labels“.
Lognamen müssen URL-sicher sein oder werden bei der Aufnahme URL-codiert. Informationen zum Festlegen von Log-Namen finden Sie unter So werden
LogEntry-Felder festgelegt.