在 GAE 上使用 java 客户端使用来自 Google Stackdriver 错误报告的数据

Consuming data from Google Stackdriver errorreporting with the java client on GAE

我们在 Google App Engine 上有一个 Java 应用程序 运行 需要处理在 Google Stackdriver 上收集的错误。

我们使用 Stackdriver Error Reporting API Java Client Library 编写了一些代码作为以下 maven 依赖

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-errorreporting</artifactId>
    <version>0.9.3-alpha</version>
</dependency>

但它似乎与 GAE 不兼容,因为它抱怨

Caused by: java.lang.SecurityException: Google App Engine does not support Runtime.addShutdownHook
  at com.google.appengine.runtime.Request.process-d6bb19ff7906421f(Request.java)
  at java.lang.Runtime.addShutdownHook(Runtime.java:45)
  at com.google.common.util.concurrent.MoreExecutors$Application.addShutdownHook(MoreExecutors.java:223)
  at com.google.common.util.concurrent.MoreExecutors$Application.addDelayedShutdownHook(MoreExecutors.java:195)
  at com.google.common.util.concurrent.MoreExecutors$Application.getExitingScheduledExecutorService(MoreExecutors.java:187)
  at com.google.common.util.concurrent.MoreExecutors$Application.getExitingScheduledExecutorService(MoreExecutors.java:219)
  at com.google.common.util.concurrent.MoreExecutors.getExitingScheduledExecutorService(MoreExecutors.java:169)
  at com.google.api.gax.grpc.InstantiatingExecutorProvider.getExecutor(InstantiatingExecutorProvider.java:51)
  at com.google.api.gax.grpc.ChannelAndExecutor.create(ChannelAndExecutor.java:62)
  at com.google.api.gax.grpc.ClientSettings.getChannelAndExecutor(ClientSettings.java:81)
  at com.google.cloud.errorreporting.spi.v1beta1.ErrorStatsServiceClient.<init>(ErrorStatsServiceClient.java:133)
  at com.google.cloud.errorreporting.spi.v1beta1.ErrorStatsServiceClient.create(ErrorStatsServiceClient.java:123)
  at com.google.cloud.errorreporting.spi.v1beta1.ErrorStatsServiceClient.create(ErrorStatsServiceClient.java:114)
  at com.acme.gcp.errors.App.processErrorStats(App.java:39)

所以问题是:除了通过 Google HTTP 客户端从 REST api 获取数据之外,是否有任何方法可以从 GAE 中处理 Google Stackdriver 错误?

更新

无论到目前为止尝试的 serviceClient 配置如何,都会出现错误。

即这是导致错误的配置尝试之一:

ErrorStatsServiceSettings errorStatsServiceSettings = ErrorStatsServiceSettings
    .defaultBuilder()
    .deleteEventsSettings()
    .getRetrySettingsBuilder()
    .setTotalTimeout(Duration.standardSeconds(30))
    .build();
ErrorStatsServiceClient.create(errorStatsServiceSettings); //error arising here

更新2

https://github.com/GoogleCloudPlatform/google-cloud-java/issues/1490#issuecomment-283597294

Java gRPC GAE 兼容性存在问题

Java gRPC 客户端尚不能在 App Engine 标准环境中运行。当然,这应该最终得到解决。

与此同时,您可以回退到使用基于 REST 的 API,或者,如果您不一定要使用 Java,请实施一个基于 Go 的小型应用程序(在同一个云项目)获取错误报告,将它们存储起来,或者可能通过任务队列将它们传递给您的 Java 应用程序。

我们最终使用了 Google 中的另一个库,为 Stack 驱动程序错误报告提供了 Java API:

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-clouderrorreporting</artifactId>
    <version>v1beta1-rev260-1.22.0</version>
</dependency>

必须正确配置身份验证凭据。 事实上,它实际上向 REST 服务(无 gRPC)发出 HTTP 调用,就像在 GAE 之外完成的那样。