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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:15:01