使用 Google Cloud Run 进行 Stackdriver Trace

Wie*_*ema 11 google-cloud-platform stackdriver google-cloud-run

我一直在深入研究 Google Cloud Run 上的 Stackdriver Trace 集成。我可以让它与代理一起工作,但有几个问题困扰着我。

鉴于

  • Stackdriver 代理在一个小缓冲区中聚合跟踪并定期发送它们。
  • 当 Cloud Run 服务未处理请求时,CPU 访问会受到限制。
  • Cloud Run 服务没有关闭钩子;您无法在关闭前清除缓冲区:容器只会收到SIGKILL。这是您无法从应用程序中捕捉到的信号。
  • 运行在请求-响应周期之外发送信息的后台进程似乎违反了Knative Container Runtime 合同
  • 日志数据的集合被记录在案,不需要我运行代理,但没有这样的遥测解决方案。
  • 我发现了一份报告,称有人使用基于代理的方法在 Cloud Run 上丢失了踪迹

谷歌是如何做到的

我进入了 Cloud Endpoints ESP 的源代码(Cloud Run 集成处于测试阶段),看看他们是否以不同的方式解决它,但使用了相同的模式:有一个带有跟踪 (1s) 和它会定期清除。

虽然我的跟踪集成似乎在我的测试设置中工作,但我担心在生产环境中运行它时不完整和丢失的跟踪。

  • 这是一个假设的问题还是一个真实的问题?

  • 看起来解决这个问题的正确方法是将遥测数据写入日志,而不是使用代理进程。Stackdriver Trace 支持吗?

Wie*_*ema 0

Cloud Run 现在支持发送 SIGTERM。如果您的应用程序处理 SIGTERM,它将在关闭前获得 10 秒的宽限时间。

您可以利用这 10 秒来:

  • 刷新具有未发送数据的缓冲区
  • 与其他系统的紧密连接

文档:容器运行时合约