此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-stream 4.1.4! |
使用 Spring Cloud Sleuth 进行跟踪
当 Spring Cloud Sleuth 位于基于 Spring Cloud Stream Kafka Streams Binders 的应用程序的 Classpath 上时,其使用者和生产者都会自动使用跟踪信息进行检测。
但是,为了跟踪任何特定于应用程序的作,这些作需要由用户代码显式检测。
这可以通过注入KafkaStreamsTracing
bean 中,然后通过这个注入的 bean 调用各种 Kafka Streams作。
以下是一些使用它的示例。
@Bean
public BiFunction<KStream<String, Long>, KTable<String, String>, KStream<String, Long>> clicks(KafkaStreamsTracing kafkaStreamsTracing) {
return (userClicksStream, userRegionsTable) -> (userClicksStream
.transformValues(kafkaStreamsTracing.peek("span-1", (key, value) -> LOG.info("key/value: " + key + "/" + value)))
.leftJoin(userRegionsTable, (clicks, region) -> new RegionWithClicks(region == null ?
"UNKNOWN" : region, clicks),
Joined.with(Serdes.String(), Serdes.Long(), null))
.transform(kafkaStreamsTracing.map("span-2", (key, value) -> {
LOG.info("Click Info: " + value.getRegion() + "/" + value.getClicks());
return new KeyValue<>(value.getRegion(),
value.getClicks());
}))
.groupByKey(Grouped.with(Serdes.String(), Serdes.Long()))
.reduce(Long::sum, Materialized.as(CLICK_UPDATES))
.toStream());
}
在上面的示例中,它有两个地方添加了显式跟踪插桩。
首先,我们记录来自传入KStream
.
记录此信息时,还会记录关联的 span 和跟踪 ID,以便监控系统可以跟踪它们并与相同的 span id 相关联。
其次,当我们调用map
作,而不是直接在KStream
类中,我们将其包装在transform
作,然后调用map
从KafkaStreamsTracing
.
在这种情况下,记录的消息也将包含 span ID 和 trace ID。
这是另一个示例,我们使用低级转换器 API 来访问各种 Kafka Streams 标头。 当spring-cloud-sleuth在 Classpath 上时,也可以像这样访问所有跟踪 Headers。
@Bean
public Function<KStream<String, String>, KStream<String, String>> process(KafkaStreamsTracing kafkaStreamsTracing) {
return input -> input.transform(kafkaStreamsTracing.transformer(
"transformer-1",
() -> new Transformer<String, String, KeyValue<String, String>>() {
ProcessorContext context;
@Override
public void init(ProcessorContext context) {
this.context = context;
}
@Override
public KeyValue<String, String> transform(String key, String value) {
LOG.info("Headers: " + this.context.headers());
LOG.info("K/V:" + key + "/" + value);
// More transformations, business logic execution, etc. go here.
return KeyValue.pair(key, value);
}
@Override
public void close() {
}
}));
}