我有一个在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来查看是否可以找到更一致的解决方案。