将跟踪和范围ID添加到Flink作业

时间:2019-11-22 11:20:58

标签: apache-kafka apache-flink distributed-system spring-cloud-sleuth distributed-tracing

我需要为在集群中运行的Flink作业添加跟踪和跨度ID,请求流如下所示

用户-> REST API-> Kafka-topic-1-> FlinkJob-1-> Kafka-topic-2-> FlinkJob-2->消费者->数据库

我正在使用Spring boot创建我的rest API,并使用Spring Sleuth在生成的日志中添加跟踪和跨度ID,在调用rest API并将消息放在Kakfa-topic-上时,添加跟踪和跨度ID也是1,但由于在春季上下文之外,我无法弄清楚如何在FlinkJob-1和FLinkJob-2上使用消息时添加跟踪和跨度ID。

一种方法是将跟踪ID和跨度ID设置为kafka消息标头,并让Kafka Consumer / Producer拦截器提取并记录跟踪和跨度ID,我尝试了此操作,但由于Flink API使用的是Flink版本的Kafka-客户。

无法调用我的自定义KafkaDeserializationSchema

public class MyDeserializationSchema implements KafkaDeserializationSchema<String> {

private static final Logger LOGGER = LoggerFactory.getLogger(MyDeserializationSchema.class);

@Override
public TypeInformation<String> getProducedType() {
    System.out.println("************** Invoked 1");
    LOGGER.debug("************** Invoked 1");
    return null;
}

@Override
public boolean isEndOfStream(String nextElement) {
    System.out.println("************** Invoked 2");
    LOGGER.debug("************** Invoked 2");
    return true;
}

@Override
public String deserialize(ConsumerRecord<byte[], byte[]> record) throws Exception {
    System.out.println("************** Invoked 3");
    LOGGER.debug("************** Invoked 3");
    return record.toString();
}

 }

有人可以建议我如何实现这一目标。

2 个答案:

答案 0 :(得分:1)

您也可以使用KafkaDeserializationSchema来获取标头

  

要访问Kafka消息的键,值和元数据,请   KafkaDeserializationSchema具有以下反序列化方法T   反序列化(ConsumerRecord记录)。

public class Bla implements KafkaDeserializationSchema {
    @Override
    public boolean isEndOfStream(Object dcEvents) {
        return false;
    }

    @Override
    public Object deserialize(ConsumerRecord consumerRecord) throws Exception {
        return null;
    }



    @Override
    public TypeInformation<DCEvents> getProducedType() {
        return null;
    }

答案 1 :(得分:0)

您在这里使用的是简单字符串,并且可以将字节序列化为字符串,如下所示。

public class MyDeserializationSchema  implements KafkaDeserializationSchema<String> {
    @Override
    public boolean isEndOfStream(String nextElement) {
        return false;
    }

    @Override
    public String deserialize(ConsumerRecord<byte[], byte[]> record) throws Exception {
        return new String(record.value(), "UTF-8");
    }

    @Override
    public TypeInformation<String> getProducedType() {
        return BasicTypeInfo.STRING_TYPE_INFO;
    }
  }