监控 Node.js Azure Functions编辑

Node.js APM 代理可以跟踪 Azure Functions 应用中的函数调用。

先决条件编辑

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

您还需要一个要监控的 Azure Function 应用。如果您没有现有的,可以按照 此 Azure 指南 创建一个。

如果您按照此 Azure 指南中的建议使用 func init --javascript ...,则建议您通过运行 npm uninstall azure-functions-core-tools 卸载 azure-functions-core-tools 依赖项,并 单独安装。将 azure-functions-core-tools 作为 package.json 中的“devDependency”会导致部署过大,发布速度非常慢,并且会耗尽 Azure Function 应用 VM 的磁盘空间。

您还可以查看并使用此 已集成 Elastic APM 的 Azure Functions 示例应用

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

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

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

步骤 2:启动 APM 代理编辑

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

  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 代理编辑

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

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

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 Function 应用编辑

func azure functionapp publish <APP_NAME>

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

限制编辑

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

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

过滤敏感信息编辑

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

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

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

兼容性编辑

有关详细信息,请参阅 支持的技术

故障排除编辑

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