-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
attributes: permit
#[instrument(follows_from = …)]
(#2093)
This PR extends the `#[instrument]` attribute to accept an optional `follows_from = …` argument that supplies any number of `Span::follows_from` relationships to the generated `Span`. ## Motivation This PR resolves #879. ## Solution This PR largely follows the implementation strategy articulated by @hawkw: tokio-rs/tracing#879 (comment) In that comment, @hawkw suggests taking one of two approaches: 1. each `follows_from` relationship is supplied with a distinct `follows_from` argument 2. the `follows_from` argument is provided once, and its value is a **list** of indirect causes I take the second approach, since it is slightly more flexible: it allows for the number of indirect causes to vary at runtime. This addition is complemented by changes to `tracing-mock` to permit making `follows_from` assertions for testing purposes.
- Loading branch information
1 parent
679983f
commit 5babc47
Showing
5 changed files
with
180 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
use tracing::{collect::with_default, Id, Level, Span}; | ||
use tracing_attributes::instrument; | ||
use tracing_mock::*; | ||
|
||
#[instrument(follows_from = causes, skip(causes))] | ||
fn with_follows_from_sync(causes: impl IntoIterator<Item = impl Into<Option<Id>>>) {} | ||
|
||
#[instrument(follows_from = causes, skip(causes))] | ||
async fn with_follows_from_async(causes: impl IntoIterator<Item = impl Into<Option<Id>>>) {} | ||
|
||
#[instrument(follows_from = [&Span::current()])] | ||
fn follows_from_current() {} | ||
|
||
#[test] | ||
fn follows_from_sync_test() { | ||
let cause_a = span::mock().named("cause_a"); | ||
let cause_b = span::mock().named("cause_b"); | ||
let cause_c = span::mock().named("cause_c"); | ||
let consequence = span::mock().named("with_follows_from_sync"); | ||
|
||
let (collector, handle) = collector::mock() | ||
.new_span(cause_a.clone()) | ||
.new_span(cause_b.clone()) | ||
.new_span(cause_c.clone()) | ||
.new_span(consequence.clone()) | ||
.follows_from(consequence.clone(), cause_a) | ||
.follows_from(consequence.clone(), cause_b) | ||
.follows_from(consequence.clone(), cause_c) | ||
.enter(consequence.clone()) | ||
.exit(consequence) | ||
.done() | ||
.run_with_handle(); | ||
|
||
with_default(collector, || { | ||
let cause_a = tracing::span!(Level::TRACE, "cause_a"); | ||
let cause_b = tracing::span!(Level::TRACE, "cause_b"); | ||
let cause_c = tracing::span!(Level::TRACE, "cause_c"); | ||
|
||
with_follows_from_sync(&[cause_a, cause_b, cause_c]) | ||
}); | ||
|
||
handle.assert_finished(); | ||
} | ||
|
||
#[test] | ||
fn follows_from_async_test() { | ||
let cause_a = span::mock().named("cause_a"); | ||
let cause_b = span::mock().named("cause_b"); | ||
let cause_c = span::mock().named("cause_c"); | ||
let consequence = span::mock().named("with_follows_from_async"); | ||
|
||
let (collector, handle) = collector::mock() | ||
.new_span(cause_a.clone()) | ||
.new_span(cause_b.clone()) | ||
.new_span(cause_c.clone()) | ||
.new_span(consequence.clone()) | ||
.follows_from(consequence.clone(), cause_a) | ||
.follows_from(consequence.clone(), cause_b) | ||
.follows_from(consequence.clone(), cause_c) | ||
.enter(consequence.clone()) | ||
.exit(consequence) | ||
.done() | ||
.run_with_handle(); | ||
|
||
with_default(collector, || { | ||
block_on_future(async { | ||
let cause_a = tracing::span!(Level::TRACE, "cause_a"); | ||
let cause_b = tracing::span!(Level::TRACE, "cause_b"); | ||
let cause_c = tracing::span!(Level::TRACE, "cause_c"); | ||
|
||
with_follows_from_async(&[cause_a, cause_b, cause_c]).await | ||
}) | ||
}); | ||
|
||
handle.assert_finished(); | ||
} | ||
|
||
#[test] | ||
fn follows_from_current_test() { | ||
let cause = span::mock().named("cause"); | ||
let consequence = span::mock().named("follows_from_current"); | ||
|
||
let (collector, handle) = collector::mock() | ||
.new_span(cause.clone()) | ||
.enter(cause.clone()) | ||
.new_span(consequence.clone()) | ||
.follows_from(consequence.clone(), cause.clone()) | ||
.enter(consequence.clone()) | ||
.exit(consequence) | ||
.exit(cause) | ||
.done() | ||
.run_with_handle(); | ||
|
||
with_default(collector, || { | ||
tracing::span!(Level::TRACE, "cause").in_scope(follows_from_current) | ||
}); | ||
|
||
handle.assert_finished(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters