Error Reporting 用の Java アプリのインストルメント化

Java アプリケーションから Error Reporting にエラーレポートを送信するには、Java 用 Error Reporting パッケージを使用します。次の場合は、Go 用 Error Reporting パッケージを使用してエラーグループを作成します。

  • ログエントリを含むログバケットに、顧客管理の暗号鍵(CMEK)がある。
  • ログバケットが次のいずれかを満たしている。
    • ログバケットがログエントリの元のプロジェクトに保存されている。
    • ログエントリがプロジェクトに転送され、そのプロジェクトがそれらのログエントリを、所有するログバケットに保存した。
  • カスタム エラーイベントを報告する必要がある。

Error Reporting は、Cloud FunctionsApp EngineCompute EngineGoogle Kubernetes Engine などの一部の Google Cloud サービスに統合されています。Error Reporting は、こうしたサービスで実行されるアプリケーションによって Cloud Logging に記録されたエラーを表示します。詳細については、このページの Google Cloud での実行をご覧ください。

Logging を使用して、エラーデータを Error Reporting に送信することもできます。データ形式の要件については、Logging のエラー メッセージの形式設定をご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Error Reporting API .

    Enable the API

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

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Error Reporting API .

    Enable the API

クライアント ライブラリをインストールする

Java 用 Error Reporting パッケージを使用すると、ほぼすべての場所で動作している Java アプリケーションから報告されるエラーをモニタリングして表示できます。

インストールの詳細については、Java 用 Error Reporting パッケージのドキュメントをご覧ください。公開バグトラッカーを使用して問題を報告することもできます。

クライアント ライブラリを設定する

Java 用 Error Reporting パッケージの動作をカスタマイズできます。Java API リファレンス ドキュメントをご覧ください。

Google Cloud でアプリを実行する

projects.events.report を使用してエラーグループを作成するには、サービス アカウントに Error Reporting 書き込みロールroles/errorreporting.writer)が必要です。

一部の Google Cloud サービスでは、Error Reporting 書き込みロール(roles/errorreporting.writer)が適切なサービス アカウントに自動的に付与されます。ただし、一部のサービスでは、適切なサービス アカウントにこのロールを付与する必要があります。

App Engine フレキシブル環境

App Engine では、デフォルトのサービス アカウントに Error Reporting 書き込みロールroles/errorreporting.writer)が自動的に付与されます。

Java 用 Error Reporting パッケージは、明示的に認証情報を提示しなくても使用できます。

App Engine のフレキシブル環境のアプリケーションでは、Error Reporting が自動的に有効になります。特別な設定は必要ありません。

@WebServlet(name = "Error reporting", value = "/error")
public class ErrorReportingExample extends HttpServlet {

  private Logger logger = Logger.getLogger(ErrorReportingExample.class.getName());

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {

    // errors logged to stderr / Cloud logging with exceptions are automatically reported.
    logger.log(Level.SEVERE, "exception using log framework", new IllegalArgumentException());

    // use the error-reporting client library only if you require logging custom error events.
    logCustomErrorEvent();

    // runtime exceptions are also automatically reported.
    throw new RuntimeException("this is a runtime exception");
  }

  private void logCustomErrorEvent() {
    try (ReportErrorsServiceClient reportErrorsServiceClient = ReportErrorsServiceClient.create()) {
      // Custom error events require an error reporting location as well.
      ErrorContext errorContext =
          ErrorContext.newBuilder()
              .setReportLocation(
                  SourceLocation.newBuilder()
                      .setFilePath("Test.java")
                      .setLineNumber(10)
                      .setFunctionName("myMethod")
                      .build())
              .build();
      // Report a custom error event
      ReportedErrorEvent customErrorEvent =
          ReportedErrorEvent.getDefaultInstance()
              .toBuilder()
              .setMessage("custom error event")
              .setContext(errorContext)
              .build();

      // default project id
      ProjectName projectName = ProjectName.of(ServiceOptions.getDefaultProjectId());
      reportErrorsServiceClient.reportErrorEvent(projectName, customErrorEvent);
    } catch (Exception e) {
      logger.log(Level.SEVERE, "Exception encountered logging custom event", e);
    }
  }
}

Google Kubernetes Engine

Google Kubernetes Engine で Error Reporting を使用するには、次の操作を行います。

  1. コンテナが使用するサービス アカウントに、Error Reporting 書き込みロールroles/errorreporting.writer)が付与されていることを確認します。

    Compute Engine のデフォルトのサービス アカウントまたはカスタム サービス アカウントを使用できます。

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

  2. クラスタを作成し、クラスタに cloud-platform アクセス スコープを付与します。

    たとえば、次の作成コマンドは、cloud-platform アクセス スコープとサービス アカウントを指定します。

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

Compute Engine

Compute Engine VM インスタンスで Error Reporting を使用する手順は次のとおりです。

  1. VM インスタンスが使用するサービス アカウントに、Error Reporting 書き込みロールroles/errorreporting.writer)が付与されていることを確認します。

    Compute Engine のデフォルトのサービス アカウントまたはカスタム サービス アカウントを使用できます。

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

  2. Google Cloud コンソールで、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Compute Engine] である結果を選択します。

  3. cloud-platform アクセス スコープを適用する VM インスタンスを選択します。

  4. [停止]、[編集] の順にクリックします。

  5. [ID と API へのアクセス] セクションで、Error Reporting 書き込みロール(roles/errorreporting.writer)を持つサービス アカウントを選択します。

  6. [アクセス スコープ] セクションで、[すべての Cloud API に完全アクセス権を許可] を選択し、変更を保存します。

  7. [開始 / 再開] をクリックします。

Cloud Functions

Cloud Run 関数は、Error Reporting 書き込みロールroles/errorreporting.writer)をデフォルトのサービス アカウントに自動的に付与します。

Java 用 Error Reporting パッケージは、明示的に認証情報を提示しなくても使用できます。

Cloud Run 関数は、自動的に Error Reporting を使用するように構成されています。JavaScript の未処理の例外は、Logging に表示され、Java 用 Error Reporting パッケージを使用しなくても、Error Reporting によって処理されます。

Cloud Logging Logback Appenderjava.util.logging Handler を使用して記録された例外は、Error Reporting Console に自動的に報告されます。

次のサンプルは、Java クライアント ライブラリを使用してカスタム エラーイベントを報告する方法を示しています。

import com.google.cloud.ServiceOptions;
import com.google.devtools.clouderrorreporting.v1beta1.ProjectName;
import com.google.devtools.clouderrorreporting.v1beta1.ReportErrorsServiceClient;
import com.google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

/**
 * Snippet demonstrates using the Error Reporting API to report an exception.
 * <p>
 * When the workload runs on App Engine, GKE, Cloud Functions or another managed environment,
 * printing the exception's stack trace to stderr will automatically report the error
 * to Error Reporting.
 */
public class QuickStart {

  static String projectId;

  public static void main(String[] args) throws Exception {
    // Set your Google Cloud Platform project ID via environment or explicitly
    projectId = ServiceOptions.getDefaultProjectId();
    if (args.length > 0) {
      projectId = args[0];
    } else {
      String value = System.getenv("GOOGLE_CLOUD_PROJECT");
      if (value != null && value.isEmpty()) {
        projectId = value;
      }
    }

    try {
      throw new Exception("Something went wrong");
    } catch (Exception ex) {
      reportError(ex);
    }
  }

  /**
   * Sends formatted error report to Google Cloud including the error context.
   *
   * @param ex Exception containing the error and the context.
   * @throws IOException if fails to communicate with Google Cloud
   */
  private static void reportError(Exception ex) throws IOException {
    try (ReportErrorsServiceClient serviceClient = ReportErrorsServiceClient.create()) {
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
      ex.printStackTrace(pw);

      ReportedErrorEvent errorEvent = ReportedErrorEvent.getDefaultInstance()
          .toBuilder()
          .setMessage(sw.toString())
          .build();
      // If you need to report an error asynchronously, use reportErrorEventCallable()
      // method
      serviceClient.reportErrorEvent(ProjectName.of(projectId), errorEvent);
    }
  }
}

エラー統計情報と個々のイベントに関するデータを取得して管理する方法については、Java API リファレンス ドキュメントをご覧ください。

ローカル開発環境でアプリを実行する

自分のワークステーションでライブラリを実行するなど、ローカル開発環境で Java 用 Error Reporting パッケージを使用するには、ローカル アプリケーションのデフォルト認証情報を使用して、Java 用 Error Reporting ライブラリを指定する必要があります。 詳細については、Error Reporting に対して認証するをご覧ください。

このページの Java サンプルをローカル開発環境から使用するには、gcloud CLI をインストールして初期化し、自身のユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定してください。

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

詳細については、 ローカル開発環境の認証の設定 をご覧ください。

projects.events.report メソッドは API キーもサポートしています。 認証に API キーを使用する場合、ローカルのアプリケーションのデフォルト認証情報ファイルを設定する必要はありません。詳細については、Google Cloud の認証に関するドキュメントの API キーを作成するをご覧ください。

エラーレポートの表示

Google Cloud コンソールで、[Error Reporting] ページに移動します。

Error Reporting に移動

このページは、検索バーを使用して見つけることもできます。

詳細については、エラーの表示をご覧ください。