Node.js HTTP链路追踪中如何判断复用socket已完成DNS lookup?
问题解决思路
直接检查socket的remoteAddress属性即可判断是否已经完成DNS解析,不需要使用socket.address()方法。
相关属性/方法的区别
localAddress/localPort:本地绑定的地址和端口,socket创建完成后、DNS解析前就会完成赋值,无法用来判断DNS解析是否完成remoteAddress/remotePort:远端服务器的IP和端口,只有DNS解析完成后才会被赋值,只要该属性存在,说明不会再触发lookup事件socket.address():返回的是本地地址的配置对象,和远端DNS解析状态完全无关,不适用于这个场景
修改后的代码逻辑
调整onSocket回调中的判断逻辑即可:
const onSocket = (socket: Socket | TLSSocket) => { socketSpan.endSpan(); // 新增判断:如果remoteAddress已存在,说明是复用的socket,DNS已解析完成 if (socket.remoteAddress) { // 直接执行lookup的后续逻辑 onLookup(); } else { // 新socket,监听lookup事件 socket.prependOnceListener('lookup', onLookup); } deferToConnect(socket, { connect: onConnect, secureConnect: onSecureConnect }); }
额外优化建议
建议给request添加error事件监听,请求出现异常时把所有未结束的span手动关闭,避免出现span内存泄漏。
内容的提问来源于stack exchange,提问作者Pedro Nascimento
相关产品推荐
相关产品推荐

