如何在反应式调用链中命名 Spring Sleuth 中的 Span

How to name Span in Spring Sleuth in a reactive calling chaining

我有 Spring Cloud Sleuth (2.0.2.RELEASE) 在某些基于网络的 request/response 系统中的(部分)反应式 class 中工作。代码是这样的:

private static final Scheduler PROCESSING_SCHEDULER = Schedulers.newParallel("processingScheduler");

public Set<ProcessedItem> processItems(List<Item> incomingItems) {
    return Flux.fromIterable(incomingItems)
        .publishOn(PROCESSING_SCHEDULER)
        .collectMultimap(Item::getRequestIdentifier)
        .flatMapIterable(Map::values)
        .flatMap(itemProcessor::processGroupedItems)
        .collect(Collectors.toSet())
        .block();
}

由于一直有很多响应进来,这个方法被一个请求调用了数百次。 我怀疑这个带有 .publishOn 的调用会导致 Zipkin 中成百上千个 async 跨度(见附件截图)。至少我假设跨度来自于它,因为这是我从 the documentation

中了解到的

所以我的第一个问题是: 如何为此类异步线程关联名称?我没有地方放 @SpanName 这里。

作为后续行动,有没有办法不收集这些跨度?我不需要它们,它们会填满我们的 Zipkin 存储空间,但我也不想禁用 reactive 或 Sleuth,因为在其他地方需要它...

Screenshot from Zipkin

您可以创建自己的自定义 SpanAdjuster 来修改跨度名称。您还可以使用 FinishedSpanHandler 对完成的跨度进行操作以调整它们。