配置基于代理的 Node.js 监控

若要使用 Instana 代理程序监控您环境中的 Node.js 应用程序,请安装 Instana Node.js 收集器。 Instana Node.js 收集器是一个 npm 包 ,您需要将其添加到 Node.js 应用程序的依赖项中。 它支持指标收集和自动追踪,并将指标和追踪数据上报至 Instana。

有关其他 Node.js 监控选项的更多信息,请参阅 Node.js 监控选项

设置监控

要使用 Instana 代理程序设置 Node.js 监控,请完成以下步骤:

  1. 安装 Node.js 收集器:根据您的环境选择安装方法:

    • 特定平台的安装 :请按照适合您环境的安装方法进行操作。
    • 手动安装 :如果您的平台未在列表中,请手动安装 Node.js 收集器。
  2. 启用 Node.js 收集器

  3. 如果你使用构建工具, 请配置构建工具

  4. 配置 Node.js 收集器

设置监控后,您可以在 Instana 用户界面中查看与您的 Node.js 应用程序相关的指标和追踪信息。 如需了解更多信息,请参阅 “查看跟踪记录和指标 ”。

在不同平台上安装 Node.js 收集器

请根据您的环境,按照以下各节所述的步骤安装 Node.js 收集器。 下表列出了不同平台上可用的收集器安装选项:

平台 自动安装 手动安装
Kubernetes 和 Red Hat OpenShift [x] [x]
Cloud Foundry [x] [x]
Apigee Microgateway [x]
Next.js [x]

Kubernetes 以及 Red Hat OpenShift

如果您的 Node.js 应用程序在 Kubernetes 和 Red Hat OpenShift 环境中运行,您可以按照以下步骤自动或手动安装 Instana Node.js 收集器:

在只读系统中,针对预定义的 Node.js 版本编译的原生插件可能会与其他 Node.js 版本产生兼容性问题。 垃圾回收器无法解压预编译的二进制文件,导致某些原生模块无法加载。 因此,某些指标(例如垃圾回收数据和特定的事件循环统计数据)不会被收集。 不过,常规的追踪功能不受影响。 如需更多信息,请参阅 “故障排除 ”部分。

Cloud Foundry

注意: 要监控 Cloud Foundry Node.js 上的应用程序,请确保 Instana 代理在 Cloud Foundry 基础架构的 Diego 节点上处于活动运行状态。

要在 Cloud Foundry 上安装 Instana Node.js 收集器,请选择以下选项之一:

  • 自动收集器安装(推荐):对于 Tile 1.177.0 及更高版本,请使用 Instana 构建包安装 Node.js 收集器,以在 Cloud Foundry 上自动配置 Node.js 应用程序。

  • 手动安装收集器:如需手动安装收集器,请参阅 《手动安装 Node.js 收集器》。 仅在无法进行自动安装时才使用手动安装方法。

Apigee Microgateway

若要将 Instana Node.js 收集器包与 Apigee Microgateway (也称为 edgemicro配合使用,请按照《使用 Instana Node.js 收集器监控 Apigee Microgateway》中的说明进行操作。

手动安装 Node.js 收集器

在安装收集器之前,请务必仔细阅读 “开始之前 ”一节。

您可以安装 Node.js 收集器:

您可以安装 Node.js 收集器,或者……

在本地安装收集器

要安装 Instana Node.js 收集器,请通过运行以下命令在您的应用程序中安装 npm@instana/collector 包:

npm install --save @instana/collector@latest

安装收集器后,请激活收集器以设置监控。 有关操作说明,请参阅 “激活 Node.js 收集器”

全局安装收集器

作为另一种方法,您可以通过完成以下步骤,全局安装 Node.js 收集器:

  1. 在目标系统上安装软件包 @instana/collector :

    • 如果您使用的是 npm ,请运行以下命令:

      npm install -g @instana/collector@latest
      
    • 如果使用 yarn ,请运行以下命令:

      yarn global add @instana/collector@latest
      

    如果要将收集器安装到容器化应用程序中,那么可以将上述语句添加到 Dockerfile

  2. 确定该软件包的安装位置。 位置取决于操作系统。 有关 npm 将已安装的软件包放置在何处的更多信息,请参阅 Node.js 文档中关于文件夹的部分。

  3. 确保包 @instana/collector 及其所有依赖关系在目标系统上的已知位置可用,例如 /path/to/instana/node_modules/@instana/collector

安装收集器后,请激活收集器以设置监控。 有关操作说明,请参阅 “激活 Node.js 收集器”

激活 Node.js 收集器

根据您的 Node.js 应用程序中使用的模块,请按以下步骤激活收集器:

  • 如果您的应用程序使用了 CommonJS 模块,请按照“ CommonJS ”部分中的步骤操作。
  • 如果您的应用程序使用 ECMAScript 模块,请按照 ECMAScript 部分中的步骤操作。

CommonJS

对于使用 CommonJS 模块的应用程序,请通过以下任一方法启用 Node.js 收集器:

  • 请使用 --require load 标志进行激活。
  • 在应用程序的首个语句中引入并初始化 Node.js 收集器。

这些方法会在应用程序代码执行之前加载并初始化 Node.js 收集器。

加载标志 --require

这种方法更可取。

对于使用 CommonJS 模块的应用程序,若要启用收集器,请在启动 Node.js 可执行文件时执行以下任一操作。

请确保在设置 NODE_OPTIONS 或添加 参数 --require 时,不要无意中遗漏该 src/immediate 部分。 路径需要以 ./ 开头,以便 Node.js 将其识别为相对路径,而不是模块标识符。 路径根据当前工作目录进行评估。

  • 开始 Node.js 激活流程之前,请设置该 NODE_OPTIONS 变量:

    NODE_OPTIONS="--require ./node_modules/@instana/collector/src/immediate"
     

    如果您使用 Docker 构建应用程序,则需要在 中 NODE_OPTIONS 添加以下行( Dockerfile 位于最后一个 FROM 语句之后,且在启动 进程 node 的最终 CMD ENTRYPOINT 或 之前):

    ENV NODE_OPTIONS="--require ./node_modules/@instana/collector/src/immediate"
     
  • 或者,在启动Node.js 的命令中添加 "--require参数。如果您通常使用 "node app/index.js命令启动应用程序,请额外添加 "--require加载标志。 请参阅以下示例:

    node --require ./node_modules/@instana/collector/src/immediate app/index.js
     

    如果该应用程序是通过 Docker 构建和运行的,则需要修改 Dockerfile 中最后的 CMDENTRYPOINT

    有关 --require 参数的更多信息,请参阅 Node.js 文档中的 -r, --require 模块

CommonJS 手册要求

注意: 收集器的初始化语句必须是应用程序中的第一条语句。 否则,收集器将无法访问某些信息。 有关如何正确添加此行的更多信息,请参阅“验证收集器集成”
require('@instana/collector')();

// All other require statements must be done after the collector is initialized.
// Note the () after the require statement of the collector which initializes it.


// const express = require('express');
 

前面的代码使用默认配置选项初始化采集器。 您还可以使用自定义配置对象来初始化 Instana Node.js 收集器。 有关有效配置选项的列表,请参阅 Node.js 中的“收集器配置 ”。 有关配置受监控应用程序与 Instana 代理之间连接的更多信息,请参阅 “代理通信 ”。

ECMAScript

如果您的应用程序使用 ECMAScript 以及作为依赖项安装的 @instana/collector 收集器,您可以通过使用 Node.js 加载标志来加载 Instana Node.js 收集器,从而激活该收集器。

如果应用程序使用 ECMAScript 模块,请在启动节点可执行文件时完成以下任一步骤。 设置 NODE_OPTIONS 或使用该 --import 参数会在应用程序代码执行之前初始化 Node.js 收集器。 有关 ECMAScript 模块的更多信息,请参阅 Node.js 上的官方文档。

  • 开始 Node.js 激活流程之前,请设置该 NODE_OPTIONS 变量:

    如果您使用 Docker 构建应用程序,请 NODE_OPTIONS 通过在您的 Dockerfile 文件中添加以下行来设置(位于最后一个 FROM 语句之后,且在启动 进程 nodeENTRYPOINT 的最终 CMD 或 之前):

    • 请使用以下命令导入 Instana 收集器(适用于 Node.js18.19 及更高版本):

      ENV NODE_OPTIONS="--import /path/to/instana/node_modules/@instana/collector/esm-register.mjs"
       
  • 或者,在启动 Node.js 时添加 参数 --import 。如果您使用 启动应用程序 node app/index.js,请在 --import 命令后附加。

    • 请使用以下命令导入 Instana 收集器(适用于 Node.js18.19 及更高版本):

      node --import /path/to/instana/node_modules/@instana/collector/esm-register.mjs app/index.js
       

    加载器会自动初始化 Instana Node.js 收集器。

注:
  • 如果您的 Node.js 版本早于 v18.19.0 ,则必须使用 --experimental-loader /path/to/instana/node_modules/@instana/collector/esm-loader.mjs 而不是 --import /path/to/instana/node_modules/@instana/collector/esm-register.mjs
  • 在当前版本中,已不再支持 esm-loader.mjs--experimental-loader 与 结合使用,该功能将在下次升级中移除。 更多详情,请参阅 “兼容性变更 ”部分。

在 Windows 上启用收集器

如果应用程序使用 ECMAScript 模块,且您的操作系统是 Windows ,请 file:/// 在 ECMAScript 加载器的路径前添加:

--import file:///absolute/path/to/instana/node_modules/@instana/collector/esm-register.mjs
 

为 Node.js 收集器配置构建工具

如果您使用打包工具(如 Webpack 或 Rollup)或转译器(如 Babel、Traceur 或 TypeScript 编译器 tsc),请参考下文了解安装 Node.js 收集器的步骤,以及针对您构建场景的其他注意事项。

捆绑商

使用 Webpack 或 Rollup 等捆绑程序预处理Node.js服务器应用程序时,请确保只捆绑您的代码,而不是 "node_modules文件夹中的依赖程序代码。

由于以下原因,必须排除依赖关系:

  • 模块 @instana/collector 不支持使用 Webpack 预先处理。 除其他问题外,未正确解决代码中使用的动态 require 语句。
  • 为了对第三方库进行插桩, npm 包会 @instana/collector 拦截 Node.js 的 require 执行过程。但如果这些库不是在运行时加载的,而是已在构建时与您的代码打包在一起,则不会执行 require 该过程,因此也不会应用插桩。 因此, Instana 的追踪功能无法正常工作或仅部分有效,也就是说,追踪功能仅对 Node.js 核心模块(如)有效 http ,因为这些模块默认不包含在打包范围内。

因此,必须使用模块 webpack-node-externals 来配置捆绑程序,以便从所有代码变换中排除 node_modules 中的所有内容:

// your webpack.config.js:

const nodeExternals = require('webpack-node-externals');

module.exports = {
  ...
  // externals: nodeModules,
  externals: [nodeExternals()],
  ...
};
 

如果您使用 Angular CLI(尤其是配合 Angular Universal 或 SSR 使用),则需要在您的 angular.json 文件中添加 "externalDependencies": ["@instana/collector"] (以及可能包含其他被 @instana/collector 监控的库),以将其从打包中排除

Transpilers

如果使用TypeScript或 Babel 等转译器,请确保转译器生成的是CommonJS或 ECMAScript dist 代码。

通过CommonJSECMAScript 的加载标志初始化跟踪器。

有关在代码中访问 SDK 的更多信息,请参阅ECMAScript 模块

原生插件

跟踪器将安装以下本机附加组件:

  • gcstats.js: 检索有关垃圾回收的信息。
  • event-loop-stats: 检索有关事件循环活动的信息。
  • autoprofile: 调查性能问题或瓶颈。 缺省情况下, AutoProfile™ 处于禁用状态。 要启用 AutoProfile™,请参阅 Node.js 收集器配置

这些附加组件是可选的 npm 依赖项。 如果无法将它们安装在系统上,那么收集器仍按预期工作。 如果您在使用附加组件时遇到问题,请参阅故障排除部分。 有关 C++ 附加组件要求的更多信息,请参阅 Node.js 官方文档node-gyp

禁用 Node.js 收集器

您可以使用环境变量来禁用 Node.js 收集器以进行 (本地) 开发。 Express 框架为此目的普及了环境变量 NODE_ENV

要禁用 Node.js 收集器,请完成以下步骤:

  1. 请按以下步骤加载 Node.js 收集器:

    if (process.env.NODE_ENV !== 'development') {
      require('@instana/collector')();
    }
     
  2. NODE_ENV 变量设置为 development的情况下以本地方式启动应用程序。 请参阅以下示例:

    export NODE_ENV=development
     
    NODE_ENV=development node myApp.js