skywalking-backend-js运行触发Buffer相关TypeError 求定位错误来源
问题根因与解决方案
错误根因
从报错栈可以定位到问题出在skywalking的链路上下文解析逻辑:
- 你的初始化代码没有把获取到的serviceName传入agent.start方法,部分核心配置缺失导致链路解析异常
- 你当前使用的
skywalking-backend-js版本存在空值校验漏洞:当上游请求未携带sw8等链路透传头时,代码直接将undefined传入Buffer.from方法,触发类型错误 - 少数场景下pm2自带的http metrics采集插件会和skywalking的HttpPlugin产生冲突,导致请求头读取异常
修复方案
1. 补全agent初始化配置
修改初始化代码,把服务名等核心配置传入启动方法:
import agent from 'skywalking-backend-js'; export class M7Skywalking { static tryLoad(serviceName: string) { const swAgentName = process.env.SW_AGENT_NAME || serviceName; if (!swAgentName) { return; } agent.start({ // 传入服务名配置 serviceName: swAgentName, // 传入skywalking采集端地址,也可以通过SW_AGENT_COLLECTOR_BACKEND_SERVICES环境变量配置 collectorAddress: process.env.SW_AGENT_COLLECTOR_BACKEND_SERVICES || '127.0.0.1:11800' }); } }
2. 升级依赖修复版本bug
官方已经在后续版本补充了空链路头的校验逻辑,直接升级到最新稳定版即可解决问题:
npm install skywalking-backend-js@latest # 或使用yarn yarn add skywalking-backend-js@latest
3. 临时规避方案(无需升级依赖)
如果当前项目不方便升级依赖,可以手动修改源码补全非空判断:
找到路径node_modules/skywalking-backend-js/src/trace/context/ContextCarrier.ts中的decode方法,在开头新增非空判断:
decode(input) { // 新增空值校验逻辑 if (!input) return '' // 原有逻辑保持不变 return Buffer.from(input, 'base64').toString() }
4. 排查插件冲突
如果使用pm2部署项目,可以先关闭pm2的http metrics采集功能,验证是否是插件冲突导致的请求头读取异常。
内容的提问来源于stack exchange,提问作者Ethan Hunt
相关产品推荐
相关产品推荐

