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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:24:55