npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-grpc @opentelemetry/exporter-trace-otlp-proto @opentelemetry/exporter-trace-otlp-http @opentelemetry/resources @opentelemetry/semantic-conventionsutils/otelTracer.js- OpenTelemetry 追踪封装config/otelConfig.js- OpenTelemetry 配置
app.js- 使用 OpenTelemetry 替换 SkyWalking SDKutils/autoTracer.js- 改用 otelTracerservers/monitor/config/node_clickhouse.js- 改用 otelTracerservers/event/config/node_clickhouse.js- 改用 otelTracerservers/logger/config/node_clickhouse.js- 改用 otelTracerservers/center/config/node_clickhouse.js- 改用 otelTracer
- SkyWalking: 使用
ContextManager.current,容易出现污染 - OpenTelemetry: 使用
api.trace.getActiveSpan(),更加稳定和可靠
- SkyWalking:
context.newExitSpan(),context.newLocalSpan() - OpenTelemetry:
tracer.startActiveSpan()统一 API
- SkyWalking: 需要检查
context.spanStack[0].spanType === 0 - OpenTelemetry:
api.trace.getActiveSpan()为 null 表示没有活跃 Span
- OpenTelemetry 需要 Node.js >= 18.19.0
- 当前版本:v16.16.0(可能有兼容性问题)
- 建议:升级到 Node.js 18+ 或 20+
- 默认:
http://localhost:9018 - 可通过
config/otelConfig.js修改 - 或通过环境变量
OTEL_EXPORTER_OTLP_ENDPOINT配置
- APM 服务器需要支持 OTLP 协议
- 如果使用 SkyWalking 后端,需要 9.0+ 版本
- 或者使用 OpenTelemetry Collector 转换数据格式
在 config/otelConfig.js 中可以配置:
serviceName- 服务名称serviceVersion- 服务版本exporterEndpoint- OTLP 导出器地址exporterProtocol- 导出协议(grpc | http/protobuf | http/json)exporterHeaders- 自定义请求头(用于认证等)samplerType- 采样器类型samplerRatio- 采样率
在 config/tracingConfig.js 中可以控制:
enabled- 总开关clickhouse.enabled- ClickHouse 追踪开关business.enabled- Controller/Model 追踪开关
支持的导出协议:
grpc- gRPC 协议(默认,连接自建 APM,端口通常 4317)http/protobuf- HTTP/Protobuf 协议(阿里云、AWS X-Ray 等)http/json- HTTP/JSON 协议
在 webfunny.config.js 的 selfMonitor 配置中修改:
selfMonitor: {
enabled: true,
serviceName: 'Webfunny_online',
serviceInstanceId: `webfunny-${require("os").hostname()}`,
deploymentEnvironment: 'prod',
// 切换到阿里云
exporterProtocol: 'http/protobuf',
exporterEndpoint: 'http://tracing-analysis-dc-sh.aliyuncs.com/adapt_xxx@xxx/api/otlp/traces',
exporterHeaders: {}, // 如需认证在此添加
}selfMonitor: {
enabled: true,
serviceName: 'Webfunny_online',
// 使用 gRPC 协议(默认)
exporterProtocol: 'grpc',
exporterEndpoint: 'localhost:4317',
}| 协议 | 端口 | 适用场景 |
|---|---|---|
| grpc | 4317 | 自建 APM、SigNoz、Jaeger |
| http/protobuf | 4318 | 阿里云、AWS、大多数云服务 |
| http/json | 4318 | 调试、简单场景 |
- 重启应用
- 查看控制台是否有 "✅ OpenTelemetry SDK 已启动"
- 发起 HTTP 请求测试
- 查看 APM 服务器是否收到数据
- ✅ Context 污染问题彻底解决 - OTel 使用
getActiveSpan()判断,不会污染定时任务 - ✅ traceId 重复问题解决 - OTel 的 traceId 生成机制更加可靠
- ✅ 更好的自动插桩 - 支持更多框架和库
- ✅ 标准化 - 可以随时切换到其他 APM 后端
如果 OpenTelemetry 出现问题,可以快速回滚:
- 在
app.js中注释掉 OpenTelemetry,恢复 SkyWalking 代码 - 将各个
node_clickhouse.js的require('./otelTracer')改回require('./clickhouseTracer') - 将
autoTracer.js改回使用clickhouseTracer - 重启应用
- Node.js 版本 - 可能需要升级 Node.js
- APM 服务器协议 - 需要确认是否支持 OTLP
- 数据格式 - Span 的字段名可能有差异,需要验证
测试应用启动,查看是否有报错。如果启动成功,需要验证:
- 数据是否正确上报到 APM 服务器
- traceId 是否还会重复
- Context 污染是否解决