通过gRPC向Jaeger发追踪数据遇帧过大错误,如何解决?
问题描述
通过Docker本地启动Jaeger,使用的docker-compose配置如下:
services: jaeger: image: jaegertracing/all-in-one ports: - "14268:14268" - "16686:16686"
尝试通过gRPC连接Jaeger服务,代码如下:
tctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() const maxCallMsgSize = 1024 * 1024 * 100 conn, err := grpc.DialContext( tctx, "localhost:14268", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(maxCallMsgSize), grpc.MaxCallSendMsgSize(maxCallMsgSize), ), ) if err != nil { return fmt.Errorf("conn: %w", err) } exp, err := otlptracegrpc.New(tctx, otlptracegrpc.WithGRPCConn(conn)) if err != nil { return fmt.Errorf("exporter: %w", err) } res, err := resource.Merge( resource.Default(), resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceName(serviceName), ), ) if err != nil { return fmt.Errorf("resource: %w", err) } tp := tracesdk.NewTracerProvider( tracesdk.WithSampler(tracesdk.AlwaysSample()), tracesdk.WithBatcher(exp), tracesdk.WithResource(res), ) otel.SetTracerProvider(tp) otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) tracer = otel.Tracer("trader-bot")
发送Span时出现错误:
export: context deadline exceeded: rpc error: code = Unavailable desc = connection error: desc = "error reading server preface: http2: frame too large"
问题原因
- 端口协议不匹配:Jaeger的
14268端口是HTTP Thrift协议的接收端口,不支持gRPC。用gRPC客户端连接该端口,会因协议解析失败出现帧过大的错误。 - 配置无效:客户端设置的消息大小参数无法解决协议不兼容的核心问题,反而可能加剧解析异常。
解决方法
1. 更新Docker-compose配置
添加Jaeger的OTLP gRPC端口映射(默认端口为4317):
services: jaeger: image: jaegertracing/all-in-one ports: - "14268:14268" - "16686:16686" - "4317:4317" # OTLP gRPC接收端口
重启Jaeger容器:
docker-compose down && docker-compose up -d
2. 修改代码中的连接地址
将gRPC连接目标改为localhost:4317:
conn, err := grpc.DialContext( tctx, "localhost:4317", // 替换为OTLP gRPC端口 grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(maxCallMsgSize), grpc.MaxCallSendMsgSize(maxCallMsgSize), ), )
3. 可选:简化客户端初始化
无需手动创建gRPC连接,直接通过otlptracegrpc的配置项指定端点:
exp, err := otlptracegrpc.New(tctx, otlptracegrpc.WithEndpoint("localhost:4317"), otlptracegrpc.WithInsecure(), otlptracegrpc.WithMaxCallRecvMsgSize(maxCallMsgSize), otlptracegrpc.WithMaxCallSendMsgSize(maxCallMsgSize), )
内容的提问来源于stack exchange,提问作者vovanchello
相关产品推荐
相关产品推荐

