创建tracing.ts文件遇类型错误:SimpleSpanProcessor无法赋值给SpanProcessor
类型不兼容错误排查:Type 'SimpleSpanProcessor' is not assignable to type 'SpanProcessor'
问题场景
创建tracing.ts时遇到类型不兼容错误,提示:Type 'SimpleSpanProcessor' is not assignable to type 'SpanProcessor'。
现有代码
import { BatchSpanProcessor, SimpleSpanProcessor, } from '@opentelemetry/sdk-trace-base'; import { api, NodeSDK } from '@opentelemetry/sdk-node'; import * as process from 'process'; import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core'; import { JaegerExporter } from '@opentelemetry/exporter-jaeger'; import { Resource } from '@opentelemetry/resources'; import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; import * as dotenv from 'dotenv'; import { B3Propagator } from '@opentelemetry/propagator-b3'; dotenv.config(); const jaegerExporter = new JaegerExporter({ endpoint: 'http://localhost:14268/api/traces', }); // 注:原代码中oltpExporter未定义,需补充初始化 const oltpExporter = new OTLPTraceExporter({ endpoint: 'http://your-otlp-endpoint:4318/v1/traces', }); const traceExporter = process.env.NODE_ENV === `development` ? jaegerExporter : oltpExporter; const spanProcessor = process.env.NODE_ENV === `development` ? new SimpleSpanProcessor(traceExporter) : new BatchSpanProcessor(traceExporter); export const otelSDK = new NodeSDK({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: `nestjs-otel`, }), spanProcessor, instrumentations: [ new HttpInstrumentation(), new ExpressInstrumentation(), new NestInstrumentation(), ], }); // 进程退出时优雅关闭SDK process.on('SIGTERM', () => { otelSDK .shutdown() .then( () => console.log('SDK shut down successfully'), (err) => console.log('Error shutting down SDK', err), ) .finally(() => process.exit(0)); });
现有依赖配置
{ "dependencies": { "@opentelemetry/auto-instrumentations-node": "^0.36.0", "@opentelemetry/exporter-jaeger": "^1.9.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.35.0", "@opentelemetry/instrumentation-express": "^0.32.0", "@opentelemetry/instrumentation-http": "^0.35.0", "@opentelemetry/instrumentation-nestjs-core": "^0.32.0", "@opentelemetry/propagator-b3": "^1.9.0", "@opentelemetry/resources": "^1.9.0", "@opentelemetry/sdk-node": "^0.35.0", "@opentelemetry/sdk-trace-base": "^1.9.0", "@opentelemetry/semantic-conventions": "^1.9.0", "dotenv": "^16.0.3" } }
问题原因
核心问题是OpenTelemetry相关包版本不兼容:
@opentelemetry/sdk-node使用旧版本0.35.0@opentelemetry/sdk-trace-base使用新版本1.9.0
两个版本的SpanProcessor类型定义不一致,导致类型匹配失败。OpenTelemetry在1.0版本后,核心SDK包(如sdk-node、sdk-trace-base)必须保持版本一致才能保证类型兼容。
解决方案
步骤1:统一所有OpenTelemetry包的版本
将所有@opentelemetry开头的包版本对齐,推荐使用1.x系列稳定版本(如1.9.0),修改后的package.json依赖如下:
{ "dependencies": { "@opentelemetry/auto-instrumentations-node": "^0.36.0", "@opentelemetry/exporter-jaeger": "^1.9.0", "@opentelemetry/exporter-trace-otlp-proto": "^1.9.0", "@opentelemetry/instrumentation-express": "^0.33.0", "@opentelemetry/instrumentation-http": "^0.35.1", "@opentelemetry/instrumentation-nestjs-core": "^0.33.0", "@opentelemetry/propagator-b3": "^1.9.0", "@opentelemetry/resources": "^1.9.0", "@opentelemetry/sdk-node": "^1.9.0", "@opentelemetry/sdk-trace-base": "^1.9.0", "@opentelemetry/semantic-conventions": "^1.9.0", "dotenv": "^16.0.3" } }
步骤2:修复代码中的未定义变量
补充oltpExporter的初始化逻辑,根据实际OTLP服务端点配置参数。
步骤3:重新安装依赖
执行命令更新依赖:
npm install # 或使用yarn yarn install
额外说明
- OpenTelemetry包版本关联性强,核心SDK、工具库、导出器等尽量保持同版本,避免类型或运行时错误。
- 若需使用旧版本(如0.35.x),则需将
sdk-trace-base降级到0.35.0,同时确保其他配套包版本匹配。
内容的提问来源于stack exchange,提问作者Krish909
相关产品推荐
相关产品推荐

