为什么Express项目中间件文件的代码加载顺序会影响功能运行?
Express中APM导入顺序影响上报功能的原因
- 绝大多数Node.js生态的APM工具都是通过*猴子补丁(Monkey Patch)*的方式实现性能埋点的:导入初始化时会直接修改
http、express等核心模块/依赖的原生方法,在原有逻辑前后插入监控、数据采集的代码。如果先导入express或先注册了中间件、路由,再导入APM,此时APM的补丁逻辑还没执行,已经加载的express实例、已经注册的业务逻辑用的都是未被修改的原生方法,APM自然无法捕获到请求耗时、调用链等数据,也就没法正常上报。 - 可以参考正反两种代码示例:
// 错误写法,APM初始化晚于express导入和路由注册,采集失效 const express = require('express') const app = express() app.get('/', (req, res) => res.send('hello')) const apm = require('xxx-apm-sdk') apm.init()
// 正确写法,APM初始化放在所有业务代码之前,补丁可覆盖后续所有模块逻辑 const apm = require('xxx-apm-sdk') apm.init() const express = require('express') const app = express() app.get('/', (req, res) => res.send('hello'))
- 部分支持全链路追踪的APM还依赖
async_hooks这类Node.js核心API跟踪异步上下文,如果APM初始化在业务代码之后,已经创建的异步资源不会被APM的追踪器捕获,也会出现上报数据缺失、调用链断链的问题。
内容的提问来源于stack exchange,提问作者Samantha
相关产品推荐
相关产品推荐

