Apache flink 跟踪上下文丢失了opentracing和勇敢的卡夫卡

Apache flink 跟踪上下文丢失了opentracing和勇敢的卡夫卡,apache-flink,kafka-consumer-api,kafka-producer-api,opentracing,distributed-tracing,Apache Flink,Kafka Consumer Api,Kafka Producer Api,Opentracing,Distributed Tracing,我有一些flink作业,它使用kafka作为源和接收器,我想添加跟踪功能,以便能够很好地跟踪从kafka消费/产生/发送到kafka的任何消息,因为我使用kafka拦截器来截取消息并记录跟踪、span和父跟踪ID opentracing kafka客户端(v0.1.11)与brave opentracing(v0.35.1)结合使用,这就是我使用自定义拦截器的原因,因为我需要以指定格式记录消息 配置拦截器后,它们被调用,它使用来自上游系统的跟踪信息(来自报头)并记录它,但是当再次生成消息给卡夫卡

我有一些flink作业,它使用kafka作为源和接收器,我想添加跟踪功能,以便能够很好地跟踪从kafka消费/产生/发送到kafka的任何消息,因为我使用kafka拦截器来截取消息并记录跟踪、span和父跟踪ID opentracing kafka客户端(v0.1.11)与brave opentracing(v0.35.1)结合使用,这就是我使用自定义拦截器的原因,因为我需要以指定格式记录消息

配置拦截器后,它们被调用,它使用来自上游系统的跟踪信息(来自报头)并记录它,但是当再次生成消息给卡夫卡时,跟踪上下文就丢失了,例如,考虑下面的脚本

1) 某个rest服务发布的卡夫卡消息 2) flink作业和拦截器使用的消息将使用头中的跟踪信息并记录下来 3) 经过处理后的消息是由flink job产生给Kafka的

在第2步之前,它一直运行良好,但在生成消息时,不使用上一步的跟踪信息,因为它没有任何头信息,因此它会生成全新的跟踪

我正在注册tracer,如下所示:-

public class MyTracer {

  private static final Tracer INSTANCE = BraveTracer.create(Tracing.newBuilder().build());

  public static void registerTracer() {
    GlobalTracer.registerIfAbsent(INSTANCE);
  }

  public static Tracer getTracer() {
    return INSTANCE;
  }
}

我正在使用opentracing kafka的
跟踪消费者接收器
跟踪产品接收器

嗨!你能让它工作吗?@Rocel是的,它工作了,问题是在消息被消费和处理后,跟踪头没有填充到消息头中,所以我必须使跟踪头成为消息体的一部分(即在Kafka拦截器中填充消息头到消息体),由于消息在处理过程中可能会更改,因此它必须是正文的一部分,因此可能会有最佳解决方案,如使用ThreadLocals,但当flink作业执行某些批处理操作时,使用threadLocal有点棘手。