OTLP 日志注入概览

本文档介绍了如何使用遥测 (OTLP) API (telemetry.googleapis.com) 将 OTLP 格式的日志提取到 Cloud Logging 中,并在其中将其存储为日志条目。如需查看示例,请参阅将 OTLP 格式的日志写入 Telemetry API

您还可以通过使用 SDK 或 OpenTelemetry 收集器的应用将日志发送到 Telemetry API。

如需了解适用于日志、指标和轨迹的 Telemetry API,请参阅 Telemetry (OTLP) API 参考文档

协议支持

OTLP 端点支持所有 OTLP 协议,包括 http/protobufhttp/jsongrpc。从 OpenTelemetry 收集器导出时,您可以使用任何协议。不过,由于大多数 SDK 导出器不支持动态令牌刷新,如果您直接从 SDK 导出,我们建议您仅使用 gRPC OTLP 导出器,而不要使用 HTTP 导出器,

结算

使用 Telemetry API 提取日志时,Cloud Logging 存储空间和结算值可能会发生变化。采用 JSON 格式的 OTLP 日志请求具有以下一般结构:

"resourceLogs": [
    {
      "resource": {
        "attributes": [...]
      },
      "scopeLogs": [
        {
          "scope": { ...}
          "logRecords": [...]
        }
      ]
    }
]

每个 logRecords 数组中的每个项都会成为一个 Cloud Logging 日志条目。如果同时满足以下两个条件,则 Google Cloud 项目 的存储和结算方面会发生最大变化:

  • resource 字段包含大量必需的键和值属性。这些资源属性用于确定生成的 LogEntry 中的受监控的资源

    受监控的资源由 Cloud Logging 受监控的资源类型及其关联标签的值组成。某些受监控的资源类型只有很少的标签,但有些资源类型有很多标签。如需详细了解哪些属性是注入 OTLP 格式日志所必需的,请参阅 OTLP 属性到资源类型的映射

  • scopeLogs 字段包含 logRecords 数组中的大量项。

为了支持提取 OTLP 格式的日志,Cloud Logging LogEntry 结构包含一个额外的字段 otel。OTLP 和 Cloud Logging 数据模型并不完全匹配,因此 otel 字段包含来自传入 OTLP 请求的 OTLP 资源、范围和实体的副本。

例如,如果您向 Telemetry API 发送如下所示的 OTLP resourceLog,则每个生成的日志条目都包含一个 resource 字段(用于受监控的资源)和一个 otel 字段,如其他标签页所示:

resourceLog

{
  "resourceLogs": [
    {
      "resource": {
        "attributes": [
          {
            "key": "gcp.project_id",
            "value": { "stringValue": "PROJECT_ID" }
          },
          {
            "key": "gcp.resource_type",
            "value": { "stringValue": "global" }
          }
        ]
      },
      "scopeLogs": [
        {
          "scope": {
            "name": "my.library",
            "version": "1.0.0",
            "attributes": [
              {
                "key": "my.scope.attribute",
                "value": { "stringValue": "some scope attribute" }
              }
            ]
          },
          "logRecords": [ ... ]
         }
       ]
     }
   ]
}

resource

  {
    ...
    "resource": {
      "labels": {
        "project_id": "PROJECT_ID"
      },
      "type": "global"
    },
    ...
}

otel

  {
    ...
    "otel": {
      "resource": {
        "attributes": {
          "gcp.project_id": "PROJECT_ID",
          "gcp.resource_type": "global"
        }
      },
      "scope": {
        "attributes": {
          "my.scope.attribute": "some scope attribute"
        },
        "name": "my.library",
        "version": "1.0.0"
      }
    },
   ...
  }

Cloud Logging 无法将其他资源与日志条目相关联,因此有关 OTLP 资源、范围和实体的所有信息都必须复制到每个日志条目。

这种复制可尽可能多地保留原始请求中的信息,并将其添加到生成的日志条目中。但重复也意味着 otel 字段会重复使用日志条目的 monitored-resource (resource) 字段中也使用的资源信息。日志条目的 resource 字段是可收费的,但 otel 字段中重复的资源信息不可收费。

如果您在 OTLP 请求中包含大量日志记录,则必须将 OTLP 信息复制到每个生成的日志条目的 resourceotel 字段中。虽然 otel 字段副本的存储空间不收费,但 resource 字段的其他副本的存储空间会收费。如果您在请求中包含大量 OTLP logRecords,日志条目中可收费的 resource 字段的数量会随着每个请求中每个 resource 的 OTLP logRecords 数量的增加而增加。

为了最大限度地减少存储的额外信息,建议您在每个请求中发送一个 logRecord 项。

限制和配额

如需了解与使用 Telemetry API 进行日志记录相关的限制和配额,请参阅日志注入的限制和配额

使用 Telemetry API 注入日志时,还需遵守 Cloud Logging 配额和限制