监控 Node.js Azure 函数

编辑

Node.js APM 代理可以在 Azure 函数应用程序中跟踪函数调用。

先决条件

编辑

你需要一个 APM 服务器来发送 APM 数据。如果你还没有设置,请按照 APM 快速入门进行操作。你需要你的 APM 服务器 URL 和 APM 服务器 密钥令牌(或 API 密钥)来配置下面的 APM 代理。

你还需要一个要监控的 Azure 函数应用。如果你没有现有的应用,你可以按照这个 Azure 指南创建一个。

如果你使用 func init --javascript ...,正如这个 Azure 指南中所建议的,那么建议你运行 npm uninstall azure-functions-core-tools 卸载 azure-functions-core-tools 依赖项,并单独安装它。在你的 package.json 中将 azure-functions-core-tools 作为 “devDependency” 会导致不合理的巨大部署,这将非常缓慢地发布,并且会耗尽你的 Azure 函数应用 VM 的磁盘空间。

你还可以查看并使用这个已经集成了 Elastic APM 的 Azure 函数示例应用

步骤 1:添加 APM 代理依赖项

编辑

elastic-apm-node 模块作为应用程序的依赖项添加

npm install elastic-apm-node --save  # or 'yarn add elastic-apm-node'

步骤 2:启动 APM 代理

编辑

为了让 APM 代理检测 Azure 函数,它需要在 Azure 主机启动其 Node.js 工作进程时启动。最好的方法是使用应用程序级别的入口点(对 Node.js Azure 函数的支持在这里添加)。

  1. 创建一个模块来启动 APM 代理。例如,在你的仓库根目录创建一个名为 “initapm.js” 的文件

    // initapm.js
    require('elastic-apm-node').start({
      
    })

    可选的配置选项可以在这里添加。

  2. 在你的 package.json 中添加一个指向应用初始化文件的 "main" 入口点。

    ...
      "main": "initapm.js",
    ...

    如果你的应用程序已经有一个 "main" 初始化文件,你可以改为在该文件的顶部添加 require('elastic-apm-node').start()

步骤 3:配置 APM 代理

编辑

APM 代理可以通过 .start() 方法的选项或环境变量进行配置。使用环境变量允许使用Azure 门户中的应用程序设置,这允许隐藏值并在不需要重新部署代码的情况下更新设置。

在 Azure 门户中打开你的函数应用的“配置 > 应用程序设置”,并设置

ELASTIC_APM_SERVER_URL: <your APM server URL from the prerequisites step>
ELASTIC_APM_SECRET_TOKEN: <your APM secret token from the prerequisites step>

例如

Configuring the APM Agent in the Azure Portal

对于通过 func start 的本地测试,你可以在你的终端或 “local.settings.json” 文件中设置这些环境变量。请参阅代理配置指南,以获取有关支持的配置变量的完整详细信息。

步骤 4:(重新)部署你的 Azure 函数应用

编辑
func azure functionapp publish <APP_NAME>

现在,当你调用你的 Azure 函数时,你应该看到你的应用程序在 Kibana 的 APM 应用中显示为一个服务,并看到函数调用的 APM 事务。跟踪数据会在一段时间后转发到 APM 服务器,因此请等待大约一分钟以便数据出现。

限制

编辑

当处理程序有 uncaughtExceptionunhandledRejection 时,此检测不会向 APM 服务器发送 APM 事务或错误。 Azure 函数 Node.js 参考有一个部分介绍了避免这些情况的最佳实践。

由于担心无意中增加 Azure 函数成本(对于消耗计划),Azure 函数检测目前在后台收集系统指标。

过滤敏感信息

编辑

默认情况下,Node.js 代理会在将错误和指标发送到 Elastic APM 服务器之前过滤常见的敏感信息。

你可以调整这些默认值或删除你不想发送到 Elastic APM 的任何信息。

  • 默认情况下,Node.js 代理不会记录 HTTP 请求的主体。要启用此功能,请使用captureBody 配置选项
  • 默认情况下,Node.js 代理会过滤已知包含敏感信息的某些 HTTP 标头。要禁用此功能,请使用sanitizeFieldNames 配置选项
  • 要应用自定义过滤器,请使用过滤函数之一

兼容性

编辑

请参阅支持的技术了解详细信息。

故障排除

编辑

如果你无法使 Node.js 代理按预期工作,请按照故障排除指南进行操作。