排查 Cloud Logging 中缺失 Apigee 日志的问题

您正在查看 ApigeeApigee Hybrid 文档。
此主题没有等效的 Apigee Edge 文档。

症状

将 Apigee API 日志发送到 Cloud Logging 是一种常见的应用场景,通常通过 MessageLogging 政策或 ServiceCallout 政策完成。在这两种情况下,Apigee 都使用 Cloud Logging API 写入日志。

在某些情况下,在 Cloud Logging 中可能看不到 Apigee API 日志。

错误消息

不显示错误消息。

可能的原因

原因 说明 适用的问题排查说明
未启用 Cloud Logging API 确保您已在 Apigee 组织的 Google Cloud 项目中启用 Cloud Logging API。 Apigee 和 Apigee Hybrid
未启用 IAM Service Account Credentials API 确保您已在 Apigee 组织的 Google Cloud 项目中启用 IAM Service Account Credentials API。 Apigee 和 Apigee Hybrid
代理服务账号配置错误 在部署时 (Apigee) 或运行时配置 (Apigee Hybrid) 中使用的服务账号可能被删除/配置错误。 Apigee 和 Apigee Hybrid
政策配置中的项目名称不正确 政策配置中的项目名称与 Apigee 组织关联的项目名称不同。 Apigee 和 Apigee Hybrid
运行时服务账号缺少角色/权限 对于 Apigee Hybrid,请确保运行时服务账号具有 Service Account Token Creator 角色。这是使用 Google 身份验证所必需的角色。 Apigee Hybrid
日志条目大小超过允许的 Cloud Logging 限制 Cloud Logging 具有 256 KB 的条目大小限制,并且无法更改。 Apigee 和 Apigee Hybrid
Cloud Logging API 的每分钟写入请求数配额已用尽 确保 Google Cloud 项目中 Cloud Logging API 的每分钟写入请求数没有超出配额值。 Apigee 和 Apigee Hybrid

原因:未启用 Cloud Logging API

诊断

验证 Cloud Logging API 已启用。如需了解如何在 Google Cloud 控制台中列出已启用的 API 和服务,请参阅列出已启用的服务

解决方法

如果 Cloud Logging API 未启用,请按照启用服务中的步骤启用它。启用 API 可能需要几分钟时间。

如果您无法解决因未启用 Cloud Logging API 而导致 Cloud Logging 中缺少日志的问题,请参阅必须收集诊断信息

原因:未启用 IAM Service Account Credentials API

诊断

验证 IAM Service Account Credentials API 是否已启用。如需了解如何在 Google Cloud 控制台中列出已启用的 API 和服务,请参阅列出已启用的服务

解决方法

如果 IAM Service Account Credentials API 未启用,请按照 启用服务中的步骤启用它。启用 API 可能需要几分钟时间。

如果您无法解决因未启用 IAM Service Account Credentials API 而导致 Cloud Logging 中缺少日志的问题,请参阅必须收集诊断信息

原因:代理服务账号配置错误

诊断

Apigee

  1. 查找服务账号名称。
    1. 使用 Apigee 界面
      1. 点击开发 > API 代理,然后点击代理名称。例如,TurboBooks
      2. 部署下会显示服务账号名称。

    2. 使用 Apigee API

      发出以下 Apigee API 调用:

      curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/ORG_NAME/environments/ENV_NAME/apis/PROXY_NAME/revisions/REVISION_NUMBER/deployments"

      请替换以下内容:

      • ORG_NAME:您的组织的名称。例如 apigee-example-org
      • ENV_NAME:环境的名称。例如 myenv
      • PROXY_NAME:代理的名称。 例如 TurboBooks
      • REVISION_NUMBER:修订版本号。例如 4

      例如:

      curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://apigee.googleapis.com/v1/organizations/apigee-example-org/environments/myenv/apis/TurboBooks/revisions/4/deployments"

      将会返回类似如下的内容:

      {
        "environment": "myenv",
        "apiProxy": "TurboBooks",
        "revision": "4",
        "deployStartTime": "1687408163394",
        "state": "READY",
        "instances": [
          {
            "instance": "apiginstance",
            "deployedRevisions": [
              {
                "revision": "4",
                "percentage": 100
              }
          .
          .
          .
          .
        "serviceAccount": "projects/-/serviceAccounts/envsa-79@apigee-example-org.iam.gserviceaccount.com"
      }

      其中,serviceAccount 是与 API 代理关联的服务账号。

  2. 验证此代理服务账号满足以下条件:
    1. 此服务账号必须位于您用于创建 Apigee 组织的同一 Google Cloud 项目中。例如,apigee-example-org.
    2. 部署代理的用户具有此服务账号的 iam.serviceAccounts.actAs 权限。
    3. 代理服务账号具有调用 Cloud Logging 服务所需的权限。

Apigee Hybrid

对于 Apigee Hybrid,除了 Apigee 中列出的步骤之外,请打开您的 overrides.yaml 文件,并确保每个需要 Google 身份验证的环境下都指定了服务账号。 例如:

envs:
  - name: "ENVIRONMENT_NAME"
    serviceAccountPaths:
      runtime: "KEY_FILE_PATH"

请替换以下内容:

  • ENVIRONMENT_NAME:环境的名称。例如 myenv
  • KEY_FILE_PATH:运行时服务账号密钥文件的路径。通常,您应该已在安装过程中创建了服务账号,详见创建服务账号

解决方法

  1. 如果服务账号不属于您用于创建 Apigee 组织的 Google Cloud 项目,则需要在同一 Google Cloud 项目中创建和使用服务账号。使用 Google 身份验证中也对此进行了介绍。
  2. 如果部署代理的用户没有此服务账号的 iam.serviceAccounts.actAs 权限,请参阅授予单个角色
  3. 如果代理服务账号没有调用 Cloud Logging 服务所需的权限,请参阅授予单个角色

如果本文档中的步骤无法解决 Apigee 和 Apigee Hybrid 代理服务账号配置错误的问题,请参阅必须收集诊断信息

原因:政策配置中的项目名称不正确

诊断

如果您使用 MessageLogging 政策将日志发送到 Cloud Logging,请执行以下操作:

  1. Apigee 界面中,点击开发 > API 代理 > API 代理名称 > 开发标签页。
  2. 代码窗格中,找到 <CloudLogging> 元素。
  3. 验证 <LogName> 值是正确的项目名称:
    <CloudLogging>
      <LogName>projects/PROJECT_ID/logs/LOG_ID</LogName>
    </CloudLogging>

    请替换以下内容:

    • PROJECT_ID:Google Cloud 项目 ID。例如 apigee-example-org
    • LOG_ID:Cloud Logging 日志 ID。例如 apigee-logs

解决方法

如果 <LogName> 元素中的值不正确,请将其更新为正确的值。

如果本文档中的步骤无法解决问题,请参阅必须收集诊断信息

原因:运行时服务账号缺少角色/权限

诊断

确保运行时能够模拟代理服务账号。

运行以下 gcloud 命令验证运行时服务账号是否具有代理服务账号的 iam.serviceAccountTokenCreator 角色:

gcloud iam service-accounts get-iam-policy PROXY_SA_NAME@PROJECT_ID.iam.gserviceaccount.com

请替换以下内容:

  • PROXY_SA_NAME:代理服务账号的名称。例如 envsa-79
  • PROJECT_ID:Google Cloud 项目 ID。例如 apigee-example-org

将会返回类似如下的内容:

- members:
  - serviceAccount:RUNTIME_SA_NAME@PROJECT_ID.iam.gserviceaccount.com
  role: roles/iam.serviceAccountTokenCreator

请替换以下内容:

RUNTIME_SA_NAME:运行时服务账号的 ID。例如 apigee-runtime

例如:

gcloud iam service-accounts get-iam-policy envsa-79@apigee-example-org.iam.gserviceaccount.com
  bindings:
  - members:
    - user:222larabrown@gmail.com
    role: roles/iam.serviceAccountAdmin
  - members:
    - serviceAccount:apigee-runtime@apigee-example-org.iam.gserviceaccount.com
    role: roles/iam.serviceAccountTokenCreator
  - members:
    - user:222larabrown@gmail.com
    role: roles/iam.serviceAccountUser
  etag: BwX-shcrL3o=
  version: 1

如果您在输出中没有看到 iam.serviceAccountTokenCreator 角色和预期成员,请按照解决方法中的步骤授予正确的角色。

解决方法

行以下 gcloud 命令,向运行时服务账号授予代理服务账号的 iam.serviceAccountTokenCreator 角色:

gcloud iam service-accounts add-iam-policy-binding \
PROXY_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
--member=serviceAccount:RUNTIME_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
--role=roles/iam.serviceAccountTokenCreator

请替换以下内容:

  • PROXY_SA_NAME:代理服务账号的名称。例如,envsa-79
  • PROJECT_ID:Google Cloud 项目 ID。例如 apigee-example-org
  • RUNTIME_SA_NAME:运行时服务账号的 ID。例如,apigee-runtime

如果本文档中的步骤无法解决问题,请参阅必须收集诊断信息

原因:日志条目大小超过允许的日志记录限制

诊断

如果在确保本文档中所述的其他原因不是问题所在后您未在 Cloud Logging 中看到某些日志,则可能是从 Apigee 发送的部分日志条目的大小超过了 256 KB,这是 Cloud Logging 中日志条目大小的硬性限制。如需了解详情,请参阅 Logging 使用限制

解决方法

这是 Cloud Logging 中不可配置的限制,目前已知的唯一解决方法是将 Apigee 发送的日志条目的大小保持在 256 KB 以下。如果您记录的载荷可能会超出此限制,请勿记录此载荷,或者了解在达到限制后某些事务将不会被记录。

如果本文档中的步骤无法解决问题,请参阅必须收集诊断信息

原因:Cloud Logging API 的每分钟写入请求数配额已用尽

诊断

有时,客户会发现自己能够在调试会话中看到请求,但同时,该请求未记录到日志浏览器中,尽管它存在于负载平衡器日志中。

观察到的消息丢失问题可能归因于项目中的配额用尽。Cloud Logging API 强制执行每分钟 12 万个写入请求的速率限制。如果超出此配额,系统可能会丢弃消息。如需了解详情,请参阅 查看和管理配额。

这些配额可以在 Google Cloud Console 中增加,客户可以按照配额增加文档中的说明自行执行此操作。

解决方法

请按照以下步骤增加配额:

  1. 配额页面中,勾选 Cloud Logging API 对应的复选框,然后点击修改配额。如果您收到 Edit is not allowed for this quota 错误,可以与 Google Cloud Customer Care 联系,请求更改配额。另请注意,必须在 Google Cloud 项目中启用结算功能才能点击这些复选框。
  2. 在“配额更改”面板中,选择相应服务以展开视图,然后填写新限额请求说明字段。点击下一步
  3. 详细联系信息面板中填写表单,然后点击提交请求

如需了解详情,结账 有关配额和限制的文档

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息,然后与 Google Cloud Customer Care 联系:

  • Apigee 组织。
  • 发生问题的环境和 API 代理。
  • 下载的调试会话(将提供上述所有信息)。
  • API 代理中将日志发送到 Cloud Logging 的具体政策名称。
  • 对于 Apigee Hybrid:overrides.yaml 文件。