You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署后Node Auto Instrumentations无法正常工作,HTTP指标丢失

Node.js OpenTelemetry 自动工具加载异常排查

本地运行时,使用getNodeAutoInstrumentations()元包可正常获取HTTP出入站指标,但部署到生产VM后指标丢失。设置OTEL_LOG_LEVEL=DEBUG后发现:

  • 本地日志显示所有工具(含instrumentation-http、express)已成功应用
  • 生产环境仅加载instrumentation-fs和instrumentation-pg,其余工具未生效

原始代码

import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';

const sdk = new NodeSDK({
    metricReader: new PrometheusExporter({}, () => {
        console.log(
            `OpenTelemetry prometheus scrape endpoint: http://localhost:${PrometheusExporter.DEFAULT_OPTIONS.port}${PrometheusExporter.DEFAULT_OPTIONS.endpoint}`,
        );
    }),
    instrumentations: [getNodeAutoInstrumentations()],
});

sdk.start();

VM编译后代码

'use strict';

var autoInstrumentationsNode = require('@opentelemetry/auto-instrumentations-node');
-----
other imports
-----

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

function _interopNamespace(e) {
    if (e && e.__esModule) return e;
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n["default"] = e;
    return Object.freeze(n);
}

var Router__default = /*#__PURE__*/_interopDefaultLegacy(Router);
var Docker__default = /*#__PURE__*/_interopDefaultLegacy(Docker);
var esb__default = /*#__PURE__*/_interopDefaultLegacy(esb);
var winston__namespace = /*#__PURE__*/_interopNamespace(winston);
var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);

const sdk = new sdkNode.NodeSDK({
  metricReader: new exporterPrometheus.PrometheusExporter({}, () => {
    console.log(
      `OpenTelemetry prometheus scrape endpoint: http://localhost:${exporterPrometheus.PrometheusExporter.DEFAULT_OPTIONS.port}${exporterPrometheus.PrometheusExporter.DEFAULT_OPTIONS.endpoint}`
    );
  }),
  instrumentations: [autoInstrumentationsNode.getNodeAutoInstrumentations()]
});
sdk.start();

排查方向

  • 验证生产环境依赖完整性:在VM上执行npm list @opentelemetry/instrumentation-http和npm list @opentelemetry/instrumentation-express,确认这些子依赖已安装。避免npm install --production时因可选依赖规则导致遗漏。
  • 禁用tree-shaking对工具包的处理:编译工具(如Babel、Webpack)的tree-shaking可能误删未显式引用的工具代码。在编译配置中添加规则,排除@opentelemetry/auto-instrumentations-node及其子依赖的tree-shaking处理。
  • 确保SDK初始化顺序正确:OpenTelemetry工具必须在被检测模块(如express、http)加载前完成初始化。检查生产环境代码中,SDK启动代码是否在express等模块导入之前执行。
  • 强制指定启用的工具:绕过自动检测逻辑,显式声明需要加载的工具,确保生产环境强制启用:
    instrumentations: [
      getNodeAutoInstrumentations({
        '@opentelemetry/instrumentation-http': {},
        '@opentelemetry/instrumentation-express': {}
      })
    ]
    
  • 检查生产环境日志与权限:查看VM上的stderr输出,是否有模块加载失败的错误;确认应用进程对node_modules目录有足够的读取权限,避免工具模块无法加载。

内容的提问来源于stack exchange,提问作者ErayZaxy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:28:12