【问题标题】:Stackdriver-trace on Google Cloud Run failing, while working fine on localhostGoogle Cloud Run 上的 Stackdriver-trace 失败,但在 localhost 上工作正常
【发布时间】:2020-02-04 05:58:36
【问题描述】:

我有一个在 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 的身份是什么,这个身份的角色是什么?
  • @guillaumeblaquiere 我使用的是默认服务帐户,但添加了云跟踪代理角色。当我今天早上再次使用我的服务时,一切似乎都运行良好。所以,我想我可以解决这个问题,但我只是想知道,服务使用分配给它的帐户的新角色需要时间吗?
  • 大部分时间非常快,但最多可能需要 5 分钟(我观察到的最大值)。我从不尝试更多,但这并非不可能!

标签: node.js trace stackdriver google-cloud-stackdriver google-cloud-run


【解决方案1】:

将此库与 Cloud Run 结合使用存在两个挑战:

  1. 尽管有关于自动检测的说明,但 Cloud Run 是一个例外。它还没有被自动检测到。 现在可以通过一些明确的配置来解决这个问题。
  2. 由于 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 看看我们是否能找到更一致的解决方案。

【讨论】:

    猜你喜欢
    • 2020-03-28
    • 2016-05-12
    • 2014-02-13
    • 2018-09-24
    • 2015-03-13
    • 2021-10-11
    • 2018-09-19
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多