为Node.js应用添加OpenTelemetry追踪后fs.realpathSync.native失效
问题原因与解决方案
核心原因
OpenTelemetry的Node.js自动 instrumentation 机制会对fs模块做猴子补丁(monkey-patching),用来给文件系统操作生成追踪数据,但你用的这个版本组合里,补丁替换fs.realpathSync方法时,没保留原生方法上的native属性——而Next.js内部刚好直接依赖了这个属性,所以触发了TypeError。
具体细节:
@opentelemetry/auto-instrumentations-node会自动加载fs的 instrumentation 插件,包装realpathSync这类核心方法- 你使用的
0.35.0版本的自动 instrumentation 插件,在包装时遗漏了对native属性的传递 - Node.js原生
fs.realpathSync确实带有native属性,Next.js的内部逻辑直接访问了这个属性,导致报错
版本兼容性说明
这是特定版本组合的兼容性bug,你用的Node.js v17.8.0 + OpenTelemetry SDK Node 0.34.0 + 自动 instrumentation 0.35.0刚好触发这个问题。后续OpenTelemetry版本已经修复了这个漏洞。
解决办法
方案1:升级OpenTelemetry依赖(推荐)
把相关依赖升级到修复后的稳定版本,比如:
{ "@opentelemetry/api": "^1.4.1", "@opentelemetry/auto-instrumentations-node": "^0.37.0", "@opentelemetry/sdk-node": "^0.36.0" }
升级后重新安装依赖、启动服务即可。
方案2:临时禁用fs instrumentation(应急用)
如果暂时没法升级,可以在OpenTelemetry配置里手动关掉fs的 instrumentation,避免对fs模块打补丁:
const { NodeSDK } = require('@opentelemetry/sdk-node'); const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node'); const sdk = new NodeSDK({ instrumentations: [ getNodeAutoInstrumentations({ '@opentelemetry/instrumentation-fs': { enabled: false } }) ] });
注意:这么做会丢失所有文件系统操作的追踪数据,只能作为临时 workaround。
内容的提问来源于stack exchange,提问作者Jakub Koralewski
相关产品推荐
相关产品推荐

