我有一个在Google Cloud Run上运行的节点服务器。现在,我想启用堆栈驱动程序跟踪。在本地运行该服务时,我可以在GCP中获取跟踪。但是,当我将服务作为Google Cloud Run运行时,出现错误:

"@google-cloud/trace-agent ERROR TraceWriter#publish: Received error with status code 403 while publishing traces to cloudtrace.googleapis.com: Error: The request is missing a valid API key."


我确保该服务帐户具有跟踪代理角色。

我的app.js中的第一行

require('@google-cloud/trace-agent').start();


在本地运行我正在使用.env文件包含

GOOGLE_APPLICATION_CREDENTIALS=<path to credentials.json>


根据https://github.com/googleapis/cloud-trace-nodejs These values are auto-detected if the application is running on Google Cloud Platform这样,我在gcp映像上没有此凭据

最佳答案

将此库与Cloud Run一起使用存在两个挑战:


尽管有关于自动检测的说明,但是Cloud Run是一个例外。尚未自动检测到。现在可以通过一些显式配置解决此问题。
由于Cloud Run服务只有在它们响应请求之前才具有资源,因此在提取CPU资源之前可能不会发送排队的跟踪数据。现在可以通过将跟踪代理配置为尽快刷新来解决此问题。


const tracer = require('@google-cloud/trace-agent').start({
  serviceContext: {
    service: process.env.K_SERVICE || "unknown-service",
    version: process.env.K_REVISION || "unknown-revision"
  },
  flushDelaySeconds: 1,
});


快速查看一下,我看不到如何触发跟踪刷新,但是较短的超时应有助于避免在跟踪跟踪数据出现在Stackdriver中时出现一些延迟。

编辑:虽然理论上不错,但实际上在退出CPU的情况下仍然存在明显的竞争条件。提起https://github.com/googleapis/cloud-trace-nodejs/issues/1161来查看是否可以找到更一致的解决方案。

10-07 12:02
查看更多