具有 Trace Agent 连接的 Google Cloud Functions

Posted

技术标签:

【中文标题】具有 Trace Agent 连接的 Google Cloud Functions【英文标题】:Google Cloud Functions with Trace Agent connection 【发布时间】:2017-11-17 20:33:24 【问题描述】:

我需要为我们的应用程序连接监控和跟踪工具。我们的主要代码在运行在 Google Cloud Functions 上的 Express 4 上。从处理域和漂亮路由名称的前端 nginx 代理服务器传入的所有请求。不幸的是,跟踪代理会跟踪这个请求,这些请求在没有任何附加信息的情况下通过 nginx 前端代理进行,这不足以收集有关应用程序的有用信息。我找到了 Stack Driver 自定义 API,据我所知,它可能有助于在运行时收集适当的数据,但我不明白如何将它连接到 Google Cloud Functions 应用程序。所有其他例子都说,我们必须扩展我们的启动脚本,但是 Google Cloud Functions 完全自动化的东西,这里没有这种可能性。

【问题讨论】:

【参考方案1】:

将 require("@google-cloud/trace-agent") 作为第一个导入对我不起作用。我仍然得到:

ERROR:@google-cloud/trace-agent: express tracing might not work as /var/tmp/worker/node_modules/express/index.js was loaded before the trace agent was initialized.

但是我设法通过手动修补 express 来解决它:

var traceApi = require('@google-cloud/trace-agent').get();
require("@google-cloud/trace-agent/src/plugins/plugin-express")[0].patch(
  require(Object.keys(require('module')._cache).find( _ => _.indexOf("express") !== -1)),
  traceApi
);

【讨论】:

好吧,当我返回另一个项目的 trace-agent 时,我也遇到了这个错误。我们在这些项目上不需要如此严格的跟踪代理,因此我们推迟了集成。我检查了已经建立 trace-agent 的旧项目,没有出现新的错误。目前它在我最初的问题中运行良好。 你提到的这个错误我有一个补充。我认为,这个错误实际上属于 GCF 的根级快速应用程序。我有一个假设,用户定义的 HTTP GCF 包装在 express 应用程序中,根级 express(不受我们控制,由 Google 工程师定义)将请求传递给我们导出的函数,然后处理请求。无论如何,即使出现此错误,按照文档建议的方式连接 trace-agent 也是有效的。【参考方案2】:

找到解决方案。我将require("@google-cloud/trace-agent"); 包含在index.js 的顶部。它应该包含在所有其他模块之前。之后它就开始工作了。

【讨论】:

我可以知道您是如何保证在所有其他模块之前调用它的吗? @Ayyappa,主文件的第一行,将从 cli 调用。或者你可以在节点上的 cli 上使用 --require 标志,我猜。

以上是关于具有 Trace Agent 连接的 Google Cloud Functions的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Trace Opentelemetry Java 示例代码未显示在 Google Cloud Trace 仪表板上

来自文件的 C# Stackdriver Trace 凭据

用于 Stackdriver Trace 的 Google Cloud Java 客户端

如何在 Java 中执行简单的 Google Cloud Trace 请求

Stackdriver Trace 与 Google Cloud Run

工利其器工具使用之Android System Trace篇官网翻译