Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[tracing-core] Remove `static requirement from Event #1048

Closed
wants to merge 34 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
5868a6d
[WIP] Metadata name is Cow<'static, str>
dvdplm Sep 28, 2020
f40de7b
Fetch patch from git
dvdplm Sep 29, 2020
ed04e30
Clean up MockSpan
dvdplm Sep 29, 2020
645c133
Don't clone the name in Metadata::name
dvdplm Sep 30, 2020
5a69f07
Use Cow in assert_last_closed
dvdplm Sep 30, 2020
f922cc1
If Metadata is always used with a 'static lifetime it might make sens…
dvdplm Sep 30, 2020
fa4a808
cleanup
dvdplm Sep 30, 2020
183f75f
Merge branch 'master' into dp-use-cow
dvdplm Oct 5, 2020
97e5b31
Metadata.target is Cow – breaks AsLog impl
dvdplm Oct 6, 2020
028ae65
Make it build (ty Ben)
dvdplm Oct 6, 2020
a3661f8
Make tests pass
dvdplm Oct 6, 2020
f0a6443
Undo changes to TestTracer and patched opentelemetry, not needed
dvdplm Oct 6, 2020
a9a0568
Remove patch
dvdplm Oct 6, 2020
2ee5da9
cleanup
dvdplm Oct 6, 2020
d8afcbe
cleanup
dvdplm Oct 6, 2020
381d574
Merge remote-tracking branch 'upstream/master' into dp-target-is-cow
dvdplm Oct 7, 2020
8913759
Store file as Cow
dvdplm Oct 7, 2020
b250109
Store module_path as Cow
dvdplm Oct 7, 2020
e29d3ca
Merge remote-tracking branch 'upstream/master' into dp-target-is-cow
dvdplm Oct 16, 2020
79ffec0
WIP Event.metadata is Cow
dvdplm Oct 16, 2020
33ccbf5
Cleanup
dvdplm Oct 18, 2020
649fb74
Cleanup
dvdplm Oct 18, 2020
856a1d8
Event takes &'a Metadata<'b>
dvdplm Oct 18, 2020
9e3f4fe
No need to be Clone
dvdplm Oct 18, 2020
f7274dc
Merge remote-tracking branch 'upstream/master' into dp-target-is-cow
dvdplm Oct 19, 2020
b3bec86
Feature gate usage of Cow in Metadata
dvdplm Oct 19, 2020
fda189b
Add constructor for dynamic data
dvdplm Oct 19, 2020
c46c352
No need for extra lifetime
dvdplm Oct 19, 2020
7b0dfe5
Merge remote-tracking branch 'upstream/master' into dp-target-is-cow
dvdplm Oct 19, 2020
280f0bf
Use impl Into<Cow<'a, str>
dvdplm Oct 20, 2020
4225d96
Merge remote-tracking branch 'upstream/master' into dp-target-is-cow
dvdplm Oct 22, 2020
e4c99b3
Merge branch 'dp-target-is-cow' into dp-event-non-static-metadata
dvdplm Oct 22, 2020
f42a644
Merge remote-tracking branch 'upstream/master' into dp-target-is-cow
dvdplm Oct 23, 2020
421e6d1
Merge branch 'dp-target-is-cow' into dp-event-non-static-metadata
dvdplm Oct 23, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
[WIP] Metadata name is Cow<'static, str>
NOTE: requires changes in opentelemetry-rust as well
dvdplm committed Sep 28, 2020
commit 5868a6d4e65a3d4d730d707f99057236f6ebc814
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -17,3 +17,6 @@ members = [
"tracing-journald",
"examples"
]

[patch.crates-io]
opentelemetry = { path = "../opentelemetry-rust" }
10 changes: 6 additions & 4 deletions tracing-core/src/metadata.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//! Metadata describing trace data.
use super::{callsite, field};
use crate::stdlib::{
borrow::Cow,
cmp, fmt,
str::FromStr,
sync::atomic::{AtomicUsize, Ordering},
@@ -60,7 +61,7 @@ use crate::stdlib::{
/// [callsite identifier]: ../callsite/struct.Identifier.html
pub struct Metadata<'a> {
/// The name of the span described by this metadata.
name: &'static str,
name: Cow<'static, str>,

/// The part of the system that the span that this metadata describes
/// occurred in.
@@ -132,7 +133,7 @@ impl<'a> Metadata<'a> {
kind: Kind,
) -> Self {
Metadata {
name,
name: Cow::Borrowed(name),
target,
level,
module_path,
@@ -154,8 +155,9 @@ impl<'a> Metadata<'a> {
}

/// Returns the name of the span.
pub fn name(&self) -> &'static str {
self.name
pub fn name(&self) -> Cow<'static, str> {
// TODO: do better than this.
self.name.clone()
}

/// Returns a string describing the part of the system where the span or
5 changes: 3 additions & 2 deletions tracing-log/src/trace_logger.rs
Original file line number Diff line number Diff line change
@@ -19,6 +19,7 @@
)]
use crate::AsLog;
use std::{
borrow::Cow,
cell::RefCell,
collections::HashMap,
fmt::{self, Write},
@@ -190,7 +191,7 @@ struct SpanLineBuilder {
module_path: Option<String>,
target: String,
level: log::Level,
name: &'static str,
name: Cow<'static, str>,
}

impl SpanLineBuilder {
@@ -373,7 +374,7 @@ impl Subscriber for TraceLogger {
.map(|span| {
let fields = span.fields.as_ref();
let parent = if self.settings.log_parent {
Some(span.name)
Some(span.name.as_ref())
} else {
None
};
13 changes: 10 additions & 3 deletions tracing-opentelemetry/src/layer.rs
Original file line number Diff line number Diff line change
@@ -489,6 +489,7 @@ mod tests {
use super::*;
use opentelemetry::api;
use opentelemetry::api::TraceContextExt;
use std::borrow::Cow;
use std::sync::{Arc, Mutex};
use std::time::SystemTime;
use tracing_subscriber::prelude::*;
@@ -500,11 +501,17 @@ mod tests {
fn invalid(&self) -> Self::Span {
api::NoopSpan::new()
}
fn start_from_context(&self, _name: &str, _context: &api::Context) -> Self::Span {
fn start_from_context<'a, S>(&self, _name: S, _context: &api::Context) -> Self::Span
where
S: Into<Cow<'a, str>>
{
self.invalid()
}
fn span_builder(&self, name: &str) -> api::SpanBuilder {
api::SpanBuilder::from_name(name.to_string())
fn span_builder<'a, S>(&self, name: S) -> api::SpanBuilder
where
S: Into<Cow<'a, str>>
{
api::SpanBuilder::from_name(name.into().into_owned())
}
fn build_with_context(&self, builder: api::SpanBuilder, _cx: &api::Context) -> Self::Span {
*self.0.lock().unwrap() = Some(builder);
2 changes: 1 addition & 1 deletion tracing-serde/src/lib.rs
Original file line number Diff line number Diff line change
@@ -244,7 +244,7 @@ impl<'a> Serialize for SerializeMetadata<'a> {
S: Serializer,
{
let mut state = serializer.serialize_struct("Metadata", 9)?;
state.serialize_field("name", self.0.name())?;
state.serialize_field("name", &self.0.name())?;
state.serialize_field("target", self.0.target())?;
state.serialize_field("level", &SerializeLevel(self.0.level()))?;
state.serialize_field("module_path", &self.0.module_path())?;
2 changes: 1 addition & 1 deletion tracing-subscriber/src/filter/env/directive.rs
Original file line number Diff line number Diff line change
@@ -151,7 +151,7 @@ impl Match for Directive {
// Do we have a name filter, and does it match the metadata's name?
// TODO(eliza): put name globbing here?
if let Some(ref name) = self.in_span {
if name != meta.name() {
if name != meta.name().as_ref() {
return false;
}
}
2 changes: 1 addition & 1 deletion tracing-subscriber/src/fmt/format/json.rs
Original file line number Diff line number Diff line change
@@ -170,7 +170,7 @@ where
// that the fields are not supposed to be missing.
Err(e) => serializer.serialize_entry("field_error", &format!("{}", e))?,
};
serializer.serialize_entry("name", self.0.metadata().name())?;
serializer.serialize_entry("name", &self.0.metadata().name())?;
serializer.end()
}
}
5 changes: 3 additions & 2 deletions tracing-subscriber/src/registry/mod.rs
Original file line number Diff line number Diff line change
@@ -63,6 +63,7 @@
//! [`LookupSpan`]: trait.LookupSpan.html
//! [`SpanData`]: trait.SpanData.html
use tracing_core::{field::FieldSet, span::Id, Metadata};
use std::borrow::Cow;

/// A module containing a type map of span extensions.
mod extensions;
@@ -213,8 +214,8 @@ where
}

/// Returns the span's name,
pub fn name(&self) -> &'static str {
self.data.metadata().name()
pub fn name(&self) -> Cow<'static, str> {
self.metadata().name()
}

/// Returns a list of [fields] defined by the span.
17 changes: 10 additions & 7 deletions tracing-subscriber/src/registry/sharded.rs
Original file line number Diff line number Diff line change
@@ -369,6 +369,7 @@ mod tests {
use super::Registry;
use crate::{layer::Context, registry::LookupSpan, Layer};
use std::{
borrow::Cow,
collections::HashMap,
sync::{Arc, Mutex, Weak},
};
@@ -422,8 +423,8 @@ mod tests {

#[derive(Default)]
struct CloseState {
open: HashMap<&'static str, Weak<()>>,
closed: Vec<(&'static str, Weak<()>)>,
open: HashMap<Cow<'static, str>, Weak<()>>,
closed: Vec<(Cow<'static, str>, Weak<()>)>,
}

struct SetRemoved(Arc<()>);
@@ -459,7 +460,7 @@ mod tests {
let name = span.name();
println!("close {} ({:?})", name, id);
if let Ok(mut lock) = self.inner.lock() {
if let Some(is_removed) = lock.open.remove(name) {
if let Some(is_removed) = lock.open.remove(name.as_ref()) {
assert!(is_removed.upgrade().is_some());
lock.closed.push((name, is_removed));
}
@@ -554,24 +555,26 @@ mod tests {
}

#[allow(unused)] // may want this for future tests
// TODO: take an `Option<Cow<'a, str>>` instead?
fn assert_last_closed(&self, span: Option<&str>) {
let lock = self.state.lock().unwrap();
let last = lock.closed.last().map(|(span, _)| span);
let last = lock.closed.last().map(|(span, _)| span.as_ref());
assert_eq!(
last,
span.as_ref(),
span,
"expected {:?} to have closed last",
span
);
}

// TODO: take an `AsRef[Cow<'a, str>]` instead?
fn assert_closed_in_order(&self, order: impl AsRef<[&'static str]>) {
let lock = self.state.lock().unwrap();
let order = order.as_ref();
for (i, name) in order.iter().enumerate() {
assert_eq!(
lock.closed.get(i).map(|(span, _)| span),
Some(name),
lock.closed.get(i).map(|(span, _)| span.as_ref()),
Some(*name),
"expected close order: {:?}, actual: {:?}",
order,
lock.closed.iter().map(|(name, _)| name).collect::<Vec<_>>()
2 changes: 1 addition & 1 deletion tracing/tests/filter_caching_is_lexically_scoped.rs
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ fn filter_caching_is_lexically_scoped() {
let count2 = count.clone();

let subscriber = subscriber::mock()
.with_filter(move |meta| match meta.name() {
.with_filter(move |meta| match meta.name().as_ref() {
"emily" | "frank" => {
count2.fetch_add(1, Ordering::Relaxed);
true
Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@ fn filters_are_not_reevaluated_for_the_same_span() {
let bob_count2 = bob_count.clone();

let (subscriber, handle) = subscriber::mock()
.with_filter(move |meta| match meta.name() {
.with_filter(move |meta| match meta.name().as_ref() {
"alice" => {
alice_count2.fetch_add(1, Ordering::Relaxed);
false
Original file line number Diff line number Diff line change
@@ -31,7 +31,7 @@ fn filters_are_reevaluated_for_different_call_sites() {
let subscriber = subscriber::mock()
.with_filter(move |meta| {
println!("Filter: {:?}", meta.name());
match meta.name() {
match meta.name().as_ref() {
"charlie" => {
charlie_count2.fetch_add(1, Ordering::Relaxed);
false
2 changes: 1 addition & 1 deletion tracing/tests/support/event.rs
Original file line number Diff line number Diff line change
@@ -69,7 +69,7 @@ impl MockEvent {

pub fn with_explicit_parent(self, parent: Option<&str>) -> MockEvent {
let parent = match parent {
Some(name) => Parent::Explicit(name.into()),
Some(name) => Parent::Explicit(name.to_string()),
None => Parent::ExplicitRoot,
};
Self {
2 changes: 1 addition & 1 deletion tracing/tests/support/metadata.rs
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ impl Expect {
if let Some(ref expected_name) = self.name {
let name = actual.name();
assert!(
expected_name == name,
*expected_name == name,
"expected {} to be named `{}`, but got one named `{}`",
ctx,
expected_name,
15 changes: 9 additions & 6 deletions tracing/tests/support/span.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#![allow(missing_docs)]
use super::{field, metadata, Parent};
use std::borrow::Cow;
use std::fmt;

/// A mock span.
@@ -60,7 +61,7 @@ impl MockSpan {

pub fn with_explicit_parent(self, parent: Option<&str>) -> NewSpan {
let parent = match parent {
Some(name) => Parent::Explicit(name.into()),
Some(name) => Parent::Explicit(name.to_string()),
None => Parent::ExplicitRoot,
};
NewSpan {
@@ -72,7 +73,7 @@ impl MockSpan {

pub fn with_contextual_parent(self, parent: Option<&str>) -> NewSpan {
let parent = match parent {
Some(name) => Parent::Contextual(name.into()),
Some(name) => Parent::Contextual(name.to_string()),
None => Parent::ContextualRoot,
};
NewSpan {
@@ -82,8 +83,10 @@ impl MockSpan {
}
}

pub fn name(&self) -> Option<&str> {
self.metadata.name.as_ref().map(String::as_ref)
pub fn name(&self) -> Option<Cow<'static, str>> {
// TODO: can do better than this I think, I hope.
// Was: self.metadata.name.as_ref().map(String::as_ref)
self.metadata.name.as_ref().map(|s| s.clone().into())
}

pub fn with_field<I>(self, fields: I) -> NewSpan
@@ -125,7 +128,7 @@ impl Into<NewSpan> for MockSpan {
impl NewSpan {
pub fn with_explicit_parent(self, parent: Option<&str>) -> NewSpan {
let parent = match parent {
Some(name) => Parent::Explicit(name.into()),
Some(name) => Parent::Explicit(name.to_string()),
None => Parent::ExplicitRoot,
};
NewSpan {
@@ -136,7 +139,7 @@ impl NewSpan {

pub fn with_contextual_parent(self, parent: Option<&str>) -> NewSpan {
let parent = match parent {
Some(name) => Parent::Contextual(name.into()),
Some(name) => Parent::Contextual(name.to_string()),
None => Parent::ContextualRoot,
};
NewSpan {
35 changes: 21 additions & 14 deletions tracing/tests/support/subscriber.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#![allow(missing_docs)]

use super::{
event::MockEvent,
field as mock_field,
span::{MockSpan, NewSpan},
Parent,
};
use std::{
borrow::Cow,
collections::{HashMap, VecDeque},
fmt,
sync::{
@@ -34,7 +36,8 @@ enum Expect {
}

struct SpanState {
name: &'static str,
name: Cow<'static, str>,
// name: &'static str,
refs: usize,
}

@@ -250,9 +253,9 @@ where
}
Some(Parent::Explicit(expected_parent)) => {
let actual_parent =
event.parent().and_then(|id| spans.get(id)).map(|s| s.name);
event.parent().and_then(|id| spans.get(id)).map(|s| s.name.to_string());
assert_eq!(
Some(expected_parent.as_ref()),
Some(expected_parent.clone()),
actual_parent,
"[{}] expected {:?} to have explicit parent {:?}",
self.name,
@@ -283,9 +286,9 @@ where
);
let stack = self.current.lock().unwrap();
let actual_parent =
stack.last().and_then(|id| spans.get(id)).map(|s| s.name);
stack.last().and_then(|id| spans.get(id)).map(|s| s.name.to_string());
assert_eq!(
Some(expected_parent.as_ref()),
Some(expected_parent.clone()),
actual_parent,
"[{}] expected {:?} to have contextual parent {:?}",
self.name,
@@ -345,9 +348,9 @@ where
}
Some(Parent::Explicit(expected_parent)) => {
let actual_parent =
span.parent().and_then(|id| spans.get(id)).map(|s| s.name);
span.parent().and_then(|id| spans.get(id)).map(|s| s.name.to_string());
assert_eq!(
Some(expected_parent.as_ref()),
Some(expected_parent.clone()),
actual_parent,
"[{}] expected {:?} to have explicit parent {:?}",
self.name,
@@ -378,9 +381,11 @@ where
);
let stack = self.current.lock().unwrap();
let actual_parent =
stack.last().and_then(|id| spans.get(id)).map(|s| s.name);
stack.last()
.and_then(|id| spans.get(id))
.map(|s| s.name.to_string());
assert_eq!(
Some(expected_parent.as_ref()),
Some(expected_parent.clone()),
actual_parent,
"[{}] expected {:?} to have contextual parent {:?}",
self.name,
@@ -444,7 +449,7 @@ where
"[{}] exited span {:?}, but the current span was {:?}",
self.name,
span.name,
curr.as_ref().and_then(|id| spans.get(id)).map(|s| s.name)
curr.as_ref().and_then(|id| spans.get(id)).map(|s| &s.name)
);
}
Some(ex) => ex.bad(&self.name, format_args!("exited span {:?}", span.name)),
@@ -453,7 +458,9 @@ where

fn clone_span(&self, id: &Id) -> Id {
let name = self.spans.lock().unwrap().get_mut(id).map(|span| {
let name = span.name;
// let name = span.name.into_owned();
// let name = Cow::Owned(span.name.into_owned());
let name = span.name.to_string();
println!(
"[{}] clone_span: {}; id={:?}; refs={:?};",
self.name, name, id, span.refs
@@ -468,7 +475,7 @@ where
let was_expected = if let Some(Expect::CloneSpan(ref span)) = expected.front() {
assert_eq!(
name,
span.name(),
span.name().map(|s| s.to_string()),
"[{}] expected to clone a span named {:?}",
self.name,
span.name()
@@ -487,7 +494,7 @@ where
let mut is_event = false;
let name = if let Ok(mut spans) = self.spans.try_lock() {
spans.get_mut(&id).map(|span| {
let name = span.name;
let name = span.name.to_string();
if name.contains("event") {
is_event = true;
}
@@ -510,7 +517,7 @@ where
// Don't assert if this function was called while panicking,
// as failing the assertion can cause a double panic.
if !::std::thread::panicking() {
assert_eq!(name, span.name());
assert_eq!(name, span.name().map(|s| s.to_string() ));
}
true
}