-
Notifications
You must be signed in to change notification settings - Fork 782
Description
From #1562 (comment)
@simonbasle @robotmrv I noticed in #1126 we started handling both onNext and onComplete, to finish a span. The code that handles onComplete when onNext isn't called is dead code. At least in our tests it isn't invoked.
I would like to remove the onComplete without onNext edge case as it isn't tested and also it is very confusing. Is there any reason why we should be so defensive?
When you look at the Flux
or Mono
level, not the Subscriber
level, pipelines which end results appear empty are not that uncommon. Any reactive method that returns a Mono<Void>
for instance...
That said, Sleuth works by wrapping Subscriber
s, which are the steps in one activation of the pipeline. The cases where such a step is empty are probably fewer. For instance, the Subscriber
generated by ignoreElements()
, despite producing a Flux
that appears empty to the end consumer, still sees onNext()
calls from its source. It just doesn't propagate them. If there is another operator after that, its Subscriber
will only see an onComplete()
.
Another way of triggering this code path is by having an empty source:
Flux.empty()
.map(i -> i)
.filter(i -> true)
.flatMap(i -> Mono.error(new RuntimeException("won't be thrown because no onNext"));
Hope this helps improving the tests/understanding when onComplete
might matter...
It is probably true that the vast majority of Subscriber
s will not onComplete()
without an onNext()
, but when one considers the whole sequence (ie. the Flux
or Mono
) this cannot be considered an edge case. All Mon