部署后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
相关产品推荐
相关产品推荐

