trace-core: Introduce callsite classification in metadata (#1046)

## Motivation

To ease the implementation of `Subscriber::register_callsite`, a field
should be added to `Metadata` to indicate if this callsite is an event or
a span.

## Solution

A new struct, `Kind`, is added to the `metadata` module in
`tokio-trace-core`, and a `Kind` field is added to the `Metadata`
struct. Macros which construct `metadata` now require a `Kind`.

`Kind` is represented as a struct with a private inner enum to allow new
`Kind`s to be added without breaking changes. However, the _addition_ of
the kind field _is_ a breaking change. While this could be done in a
backward-compatible way, it would permit the construction of metadata
with unknown kinds, and since the next `tokio-trace-core` release will
be a breaking change, I opted to make the breaking change instead.

New API tests for the `callsite!` and `metadata!` macros have been added
to guard against future API breakage.

Fixes: #986
Closes: #1008

Co-Authored-By: csmoe <[email protected]>
This commit is contained in:
Eliza Weisman
2019-04-11 11:56:42 -07:00
committed by GitHub
co-authored by csmoe
parent b4fe517a16
commit 847fb59b17
9 changed files with 162 additions and 8 deletions
+14 -2
View File
@@ -102,6 +102,7 @@ macro_rules! span {
use $crate::callsite::Callsite;
let callsite = callsite! {
name: $name,
kind: $crate::metadata::Kind::SPAN,
target: $target,
level: $lvl,
fields: $($($k).+),*
@@ -128,6 +129,7 @@ macro_rules! span {
use $crate::callsite::Callsite;
let callsite = callsite! {
name: $name,
kind: $crate::metadata::Kind::SPAN,
target: $target,
level: $lvl,
fields: $( $($k).+ ),*
@@ -742,6 +744,7 @@ macro_rules! event {
":",
__tokio_trace_line!()
),
kind: $crate::metadata::Kind::EVENT,
target: $target,
level: $lvl,
fields: $( $($k).+ ),*
@@ -1223,17 +1226,24 @@ macro_rules! error {
#[doc(hidden)]
#[macro_export(local_inner_macros)]
macro_rules! callsite {
(name: $name:expr, fields: $( $field_name:expr ),* $(,)*) => ({
(name: $name:expr, kind: $kind:expr, fields: $( $field_name:expr ),* $(,)*) => ({
callsite! {
name: $name,
kind: $kind,
target: __tokio_trace_module_path!(),
level: $crate::Level::TRACE,
fields: $( $field_name ),*
}
});
(name: $name:expr, level: $lvl:expr, fields: $( $field_name:expr ),* $(,)*) => ({
(
name: $name:expr,
kind: $kind:expr,
level: $lvl:expr,
fields: $( $field_name:expr ),* $(,)*
) => ({
callsite! {
name: $name,
kind: $kind,
target: __tokio_trace_module_path!(),
level: $lvl,
fields: $( $field_name ),*
@@ -1241,6 +1251,7 @@ macro_rules! callsite {
});
(
name: $name:expr,
kind: $kind:expr,
target: $target:expr,
level: $lvl:expr,
fields: $( $field_name:expr ),*
@@ -1256,6 +1267,7 @@ macro_rules! callsite {
level: $lvl,
fields: &[ $( __tokio_trace_stringify!($field_name) ),* ],
callsite: &MyCallsite,
kind: $kind,
}
};
// FIXME: Rust 1.34 deprecated ATOMIC_USIZE_INIT. When Tokio's minimum