mirror of
https://github.com/tokio-rs/tracing.git
synced 2025-10-02 15:24:47 +00:00
attributes: add skip_all
(#1548)
Using `#[instrument(skip_all)]` is equivalent to `#[instrument(skip(foo, bar..))]` for all the parameters.
This commit is contained in:
parent
0ab63ef5cb
commit
665170ddc3
@ -166,10 +166,13 @@ use syn::{
|
|||||||
/// - multiple argument names can be passed to `skip`.
|
/// - multiple argument names can be passed to `skip`.
|
||||||
/// - arguments passed to `skip` do _not_ need to implement `fmt::Debug`.
|
/// - arguments passed to `skip` do _not_ need to implement `fmt::Debug`.
|
||||||
///
|
///
|
||||||
|
/// You can also use `skip_all` to skip all arguments.
|
||||||
|
///
|
||||||
/// ## Examples
|
/// ## Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// # use tracing_attributes::instrument;
|
/// # use tracing_attributes::instrument;
|
||||||
|
/// # use std::collections::HashMap;
|
||||||
/// // This type doesn't implement `fmt::Debug`!
|
/// // This type doesn't implement `fmt::Debug`!
|
||||||
/// struct NonDebug;
|
/// struct NonDebug;
|
||||||
///
|
///
|
||||||
@ -178,6 +181,12 @@ use syn::{
|
|||||||
/// fn my_function(arg: usize, non_debug: NonDebug) {
|
/// fn my_function(arg: usize, non_debug: NonDebug) {
|
||||||
/// // ...
|
/// // ...
|
||||||
/// }
|
/// }
|
||||||
|
///
|
||||||
|
/// // These arguments are huge
|
||||||
|
/// #[instrument(skip_all)]
|
||||||
|
/// fn my_big_data_function(large: Vec<u8>, also_large: HashMap<String, String>) {
|
||||||
|
/// // ...
|
||||||
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// Skipping the `self` parameter:
|
/// Skipping the `self` parameter:
|
||||||
@ -257,8 +266,8 @@ use syn::{
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// This can be used in conjunction with `skip` to record only some fields of a
|
/// This can be used in conjunction with `skip` or `skip_all` to record only
|
||||||
/// struct:
|
/// some fields of a struct:
|
||||||
/// ```
|
/// ```
|
||||||
/// # use tracing_attributes::instrument;
|
/// # use tracing_attributes::instrument;
|
||||||
/// // Remember the struct with the very large `data` field from the earlier
|
/// // Remember the struct with the very large `data` field from the earlier
|
||||||
@ -644,7 +653,7 @@ fn gen_block(
|
|||||||
let quoted_fields: Vec<_> = param_names
|
let quoted_fields: Vec<_> = param_names
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|(param, _)| {
|
.filter(|(param, _)| {
|
||||||
if args.skips.contains(param) {
|
if args.skip_all || args.skips.contains(param) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -754,6 +763,7 @@ struct InstrumentArgs {
|
|||||||
name: Option<LitStr>,
|
name: Option<LitStr>,
|
||||||
target: Option<LitStr>,
|
target: Option<LitStr>,
|
||||||
skips: HashSet<Ident>,
|
skips: HashSet<Ident>,
|
||||||
|
skip_all: bool,
|
||||||
fields: Option<Fields>,
|
fields: Option<Fields>,
|
||||||
err: bool,
|
err: bool,
|
||||||
/// Errors describing any unrecognized parse inputs that we skipped.
|
/// Errors describing any unrecognized parse inputs that we skipped.
|
||||||
@ -872,8 +882,20 @@ impl Parse for InstrumentArgs {
|
|||||||
if !args.skips.is_empty() {
|
if !args.skips.is_empty() {
|
||||||
return Err(input.error("expected only a single `skip` argument"));
|
return Err(input.error("expected only a single `skip` argument"));
|
||||||
}
|
}
|
||||||
|
if args.skip_all {
|
||||||
|
return Err(input.error("expected either `skip` or `skip_all` argument"));
|
||||||
|
}
|
||||||
let Skips(skips) = input.parse()?;
|
let Skips(skips) = input.parse()?;
|
||||||
args.skips = skips;
|
args.skips = skips;
|
||||||
|
} else if lookahead.peek(kw::skip_all) {
|
||||||
|
if args.skip_all {
|
||||||
|
return Err(input.error("expected only a single `skip_all` argument"));
|
||||||
|
}
|
||||||
|
if !args.skips.is_empty() {
|
||||||
|
return Err(input.error("expected either `skip` or `skip_all` argument"));
|
||||||
|
}
|
||||||
|
let _ = input.parse::<kw::skip_all>()?;
|
||||||
|
args.skip_all = true;
|
||||||
} else if lookahead.peek(kw::fields) {
|
} else if lookahead.peek(kw::fields) {
|
||||||
if args.fields.is_some() {
|
if args.fields.is_some() {
|
||||||
return Err(input.error("expected only a single `fields` argument"));
|
return Err(input.error("expected only a single `fields` argument"));
|
||||||
@ -1158,6 +1180,7 @@ fn param_names(pat: Pat, record_type: RecordType) -> Box<dyn Iterator<Item = (Id
|
|||||||
mod kw {
|
mod kw {
|
||||||
syn::custom_keyword!(fields);
|
syn::custom_keyword!(fields);
|
||||||
syn::custom_keyword!(skip);
|
syn::custom_keyword!(skip);
|
||||||
|
syn::custom_keyword!(skip_all);
|
||||||
syn::custom_keyword!(level);
|
syn::custom_keyword!(level);
|
||||||
syn::custom_keyword!(target);
|
syn::custom_keyword!(target);
|
||||||
syn::custom_keyword!(name);
|
syn::custom_keyword!(name);
|
||||||
|
@ -96,6 +96,9 @@ fn skip() {
|
|||||||
#[instrument(target = "my_target", level = "debug", skip(_arg2, _arg3))]
|
#[instrument(target = "my_target", level = "debug", skip(_arg2, _arg3))]
|
||||||
fn my_fn(arg1: usize, _arg2: UnDebug, _arg3: UnDebug) {}
|
fn my_fn(arg1: usize, _arg2: UnDebug, _arg3: UnDebug) {}
|
||||||
|
|
||||||
|
#[instrument(target = "my_target", level = "debug", skip_all)]
|
||||||
|
fn my_fn2(_arg1: usize, _arg2: UnDebug, _arg3: UnDebug) {}
|
||||||
|
|
||||||
let span = span::mock()
|
let span = span::mock()
|
||||||
.named("my_fn")
|
.named("my_fn")
|
||||||
.at_level(Level::DEBUG)
|
.at_level(Level::DEBUG)
|
||||||
@ -105,6 +108,12 @@ fn skip() {
|
|||||||
.named("my_fn")
|
.named("my_fn")
|
||||||
.at_level(Level::DEBUG)
|
.at_level(Level::DEBUG)
|
||||||
.with_target("my_target");
|
.with_target("my_target");
|
||||||
|
|
||||||
|
let span3 = span::mock()
|
||||||
|
.named("my_fn2")
|
||||||
|
.at_level(Level::DEBUG)
|
||||||
|
.with_target("my_target");
|
||||||
|
|
||||||
let (subscriber, handle) = subscriber::mock()
|
let (subscriber, handle) = subscriber::mock()
|
||||||
.new_span(
|
.new_span(
|
||||||
span.clone()
|
span.clone()
|
||||||
@ -121,12 +130,17 @@ fn skip() {
|
|||||||
.enter(span2.clone())
|
.enter(span2.clone())
|
||||||
.exit(span2.clone())
|
.exit(span2.clone())
|
||||||
.drop_span(span2)
|
.drop_span(span2)
|
||||||
|
.new_span(span3.clone())
|
||||||
|
.enter(span3.clone())
|
||||||
|
.exit(span3.clone())
|
||||||
|
.drop_span(span3)
|
||||||
.done()
|
.done()
|
||||||
.run_with_handle();
|
.run_with_handle();
|
||||||
|
|
||||||
with_default(subscriber, || {
|
with_default(subscriber, || {
|
||||||
my_fn(2, UnDebug(0), UnDebug(1));
|
my_fn(2, UnDebug(0), UnDebug(1));
|
||||||
my_fn(3, UnDebug(0), UnDebug(1));
|
my_fn(3, UnDebug(0), UnDebug(1));
|
||||||
|
my_fn2(2, UnDebug(0), UnDebug(1));
|
||||||
});
|
});
|
||||||
|
|
||||||
handle.assert_finished();
|
handle.assert_finished();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user