为 PHP 应用添加插桩以使用 Error Reporting

您可以使用 PHP 版 Error Reporting 库,从 PHP 应用向 Error Reporting 发送错误事件。 在以下情况下,请使用 PHP 版 Error Reporting 库创建错误组:

  • 包含日志条目的日志存储桶具有客户管理的加密 密钥 (CMEK)
  • 日志存储桶满足以下条件之一:
    • 日志存储桶存储在日志条目来源的项目中。
    • 日志条目被路由到某个项目,然后该项目将这些日志条目存储在自己拥有的日志存储桶中。
  • 您想要报告自定义错误事件。

Error Reporting 已与某些 Google Cloud 服务集成, 例如 Cloud Run functionsApp EngineCompute EngineGoogle Kubernetes Engine。Error Reporting 可显示在这些服务上运行的应用记录到 Cloud Logging 中的错误事件。 如需了解详情,请参阅本 页面上的 在上运行 Google Cloud

您还可以使用 Logging将错误事件发送到 Error Reporting。如需了解数据格式设置 要求,请参阅 设置日志条目格式以报告错误事件

准备工作

  1. 登录您的 Google Cloud 账号。如果您是新手 Google Cloud, 请创建一个账号来评估我们的产品在 实际场景中的表现。新客户还可获享 $300 赠金,用于 运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Error Reporting API .

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Error Reporting API .

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

安装客户端库

借助 PHP 版 Error Reporting 库,您可以监控和查看在几乎任何位置运行的 PHP 应用所报告的错误事件。

如需详细了解如何安装,请参阅 PHP 版 Error Reporting 库的文档。您还可以使用 问题跟踪器来报告问题。

配置客户端库

您可以自定义 PHP 版 Error Reporting 库的行为。如需查看可能的配置选项的列表,请参阅库的配置。

在上运行应用 Google Cloud

如需使用 projects.events.report创建错误组,您的服务帐号需要具有 Error Reporting Writer 角色 (roles/errorreporting.writer)。

某些 Google Cloud 服务会自动向相应的 服务帐号授予 Error Reporting Writer 角色 (roles/errorreporting.writer)。不过,对于某些服务,您必须向相应的服务账号授予此角色。

Cloud Run 和 Cloud Run functions

Cloud Run 使用的默认服务帐号具有 Error Reporting Writer 角色 (roles/errorreporting.writer) 的 权限。

您无需明确提供凭据即可使用 PHP 版 Error Reporting 库。

Cloud Run 已配置为自动使用 Error Reporting。未处理的 JavaScript 异常将在 Logging 中显示,并且会由 Error Reporting 进行处理,而无需使用 PHP 版 Error Reporting 库。

App Engine 柔性环境

App Engine 会自动向您的默认服务帐号授予 Error Reporting Writer 角色 (roles/errorreporting.writer) 。

您无需明确提供凭据即可使用 PHP 版 Error Reporting 库。

如需在 App Engine 柔性环境中启用 Error Reporting,请按以下步骤操作:

  1. 使用以下命令安装必要的库:

    $ composer require google/cloud-error-reporting
  2. 将以下行添加到 app.yaml 中的 runtime_config 部分:

enable_stackdriver_integration: true

然后,该库会自动将所有错误和未捕获的异常收集到 Error Reporting 中。如果您使用的是安装自带异常处理程序的网络框架,请参阅框架集成部分了解详情。

Google Kubernetes Engine

如需将 Error Reporting 与 Google Kubernetes Engine 搭配使用,请执行以下操作:

  1. 确保已向容器要使用的服务帐号授予 Error Reporting Writer 角色 (roles/errorreporting.writer)。

    您可以使用 Compute Engine 默认服务账号 或自定义服务帐号。

    如需了解如何授予角色,请参阅 管理对项目、文件夹和组织的访问权限

  2. 创建集群,并向集群授予 cloud-platform 访问权限范围

    例如,以下 create 命令指定了 cloud-platform 访问权限范围和服务帐号:

    gcloud container clusters create CLUSTER_NAME --service-account  SERVICE_ACCT_NAME --scopes=cloud-platform
    

Compute Engine

如需将 Error Reporting 与 Compute Engine 虚拟机实例搭配使用,请执行以下操作:

  1. 确保已向虚拟机实例要使用的服务帐号授予 Error Reporting Writer 角色 (roles/errorreporting.writer)。

    您可以使用 Compute Engine 默认服务账号 或自定义服务帐号。

    如需了解如何授予角色,请参阅 管理对项目、文件夹和组织的访问权限

  2. 在 Google Cloud 控制台中,前往虚拟机实例页面:

    前往虚拟机实例

    如果您使用搜索栏查找此页面,请选择子标题为 Compute Engine 的结果。

  3. 选择要接收 cloud-platform 访问权限范围的虚拟机实例。

  4. 点击停止,然后点击修改

  5. 身份和 API 访问权限 部分,选择具有 Error Reporting Writer 角色 (roles/errorreporting.writer) 的服务帐号。

  6. 访问权限范围 部分, 选择 授予对所有 Cloud API 的完整访问权限,然后保存更改。

  7. 点击启动/恢复

示例

1. 使用以下命令安装 Cloud 库:

$ composer require google/cloud-error-reporting
2. 将下面一行代码添加到 php.ini,其中 WORKSPACE 是工作区根目录的绝对路径:
auto_prepend_file='/WORKSPACE/vendor/google/cloud-error-reporting/src/prepend.php'

该预置文件用于安装异常处理程序和错误处理程序,这些处理程序会自动将错误发送到 Error Reporting。

如果您使用的是 App Engine 柔性环境,请参阅 本页面上的 App Engine 柔性环境

在本地开发环境中运行应用

如需在本地开发环境(例如在您自己的工作站上运行库)中使用 PHP 版 Error Reporting 库,您必须向 PHP 版 Error Reporting 库提供本地应用默认凭证。 如需了解详情,请参阅向 Error Reporting 进行身份验证

如需在本地开发环境中使用本页面上的 PHP 示例,请安装并 初始化 gcloud CLI,然后使用您的用户凭证设置应用默认凭据。

  1. 安装 Google Cloud CLI。

  2. 如果您使用的是外部身份提供方 (IdP),则必须先 使用联合身份登录 gcloud CLI

  3. 如果您使用的是本地 shell,请为您的用户 账号创建本地身份验证凭证:

    gcloud auth application-default login

    如果您使用的是 Cloud Shell,则无需执行此操作。

    如果返回身份验证错误,并且您使用的是外部身份提供方 (IdP),请确认您已 使用联合身份登录 gcloud CLI

如需了解详情,请参阅 为本地开发环境设置身份验证

The projects.events.report method also supports API keys. 如果您要使用 API 密钥进行身份验证,则无需 设置本地应用默认凭据文件。 如需了解详情,请参阅 创建 API 密钥 在 Google Cloud 身份验证文档中。

查看错误组

在 Google Cloud 控制台中,前往 Error Reporting 页面:

前往 Error Reporting

您也可以使用搜索栏查找此页面。

如需了解详情,请参阅 查看和过滤错误组

框架集成

某些网络框架会替代异常处理程序。以下是使用 Laravel 和 Symfony 启用 Error Reporting 的示例。对于其他框架,您可以使用 Google\Cloud\ErrorReporting\Bootstrap::exceptionHandler 作为异常处理程序。

Laravel

app/Exceptions/Handler.php 文件中修改 report 函数,如下所示:

public function report(Exception $exception)
{
    if (isset($_SERVER['GAE_SERVICE'])) {
        // Ensure Stackdriver is initialized and handle the exception
        Bootstrap::init();
        Bootstrap::exceptionHandler($exception);
    } else {
        parent::report($exception);
    }
}

您还需要在文件开头处添加一行 use 语句:

use Google\Cloud\ErrorReporting\Bootstrap;

Symfony

创建包含以下内容的新 src/AppBundle/EventSubscriber/ExceptionSubscriber.php 文件:

// src/AppBundle/EventSubscriber/ExceptionSubscriber.php
namespace AppBundle\EventSubscriber;

use Google\Cloud\ErrorReporting\Bootstrap;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class ExceptionSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        // return the subscribed events, their methods and priorities
        return [KernelEvents::EXCEPTION => [
            ['logException', 0]
        ]];
    }

    public function logException(ExceptionEvent $event)
    {
        $exception = $event->getThrowable();
        Bootstrap::exceptionHandler($exception);
    }
}