Skip to content

Commit eb902e0

Browse files
feat(sentry-tracing): add span fields to breadcrumbs (#708)
1 parent 05fc7de commit eb902e0

File tree

8 files changed

+74
-28
lines changed

8 files changed

+74
-28
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sentry-tracing/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ sentry-backtrace = { version = "0.34.0", path = "../sentry-backtrace", optional
3232
[dev-dependencies]
3333
log = "0.4"
3434
sentry = { path = "../sentry", default-features = false, features = ["test"] }
35+
serde_json = "1"
3536
tracing = "0.1"
3637
tracing-subscriber = { version = "0.3.1", features = ["fmt", "registry"] }
3738
tokio = { version = "1.8", features = ["rt-multi-thread", "macros", "time"] }

sentry-tracing/src/converters.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,14 @@ impl Visit for FieldVisitor {
141141
}
142142

143143
/// Creates a [`Breadcrumb`] from a given [`tracing_core::Event`]
144-
pub fn breadcrumb_from_event(event: &tracing_core::Event) -> Breadcrumb {
145-
let (message, visitor) = extract_event_data(event);
144+
pub fn breadcrumb_from_event<'context, S>(
145+
event: &tracing_core::Event,
146+
ctx: impl Into<Option<Context<'context, S>>>,
147+
) -> Breadcrumb
148+
where
149+
S: Subscriber + for<'a> LookupSpan<'a>,
150+
{
151+
let (message, visitor) = extract_event_data_with_context(event, ctx.into());
146152
Breadcrumb {
147153
category: Some(event.metadata().target().to_owned()),
148154
ty: "log".into(),

sentry-tracing/src/layer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ where
214214
match (self.event_filter)(event.metadata()) {
215215
EventFilter::Ignore => EventMapping::Ignore,
216216
EventFilter::Breadcrumb => {
217-
EventMapping::Breadcrumb(breadcrumb_from_event(event))
217+
EventMapping::Breadcrumb(breadcrumb_from_event(event, span_ctx))
218218
}
219219
EventFilter::Event => EventMapping::Event(event_from_event(event, span_ctx)),
220220
EventFilter::Exception => {

sentry-tracing/tests/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Integration tests for `sentry-tracing`
2+
3+
These tests are split up into 1 file per test to ensure they don't run concurrently.

sentry-tracing/tests/breadcrumbs.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
mod shared;
2+
3+
#[test]
4+
fn breadcrumbs_should_capture_span_fields() {
5+
let transport = shared::init_sentry();
6+
7+
foo();
8+
9+
let data = transport.fetch_and_clear_envelopes();
10+
assert_eq!(data.len(), 2);
11+
12+
let event = data.first().expect("should have 1 event");
13+
let event = match event.items().next().unwrap() {
14+
sentry::protocol::EnvelopeItem::Event(event) => event,
15+
unexpected => panic!("Expected event, but got {:#?}", unexpected),
16+
};
17+
18+
assert_eq!(event.breadcrumbs.len(), 1);
19+
assert_eq!(
20+
event.breadcrumbs[0].data["foo:contextual_value"],
21+
serde_json::Value::from(42)
22+
);
23+
assert_eq!(
24+
event.breadcrumbs[0].message,
25+
Some("executing foo".to_owned())
26+
);
27+
}
28+
29+
#[tracing::instrument(fields(contextual_value = 42))]
30+
fn foo() {
31+
tracing::info!("executing foo");
32+
33+
tracing::error!("boom!");
34+
}

sentry-tracing/tests/shared.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use sentry::{ClientOptions, Hub};
2+
use sentry_core::test::TestTransport;
3+
4+
use std::sync::Arc;
5+
6+
pub fn init_sentry() -> Arc<TestTransport> {
7+
use tracing_subscriber::prelude::*;
8+
9+
let transport = TestTransport::new();
10+
let options = ClientOptions {
11+
dsn: Some("https://[email protected]/test".parse().unwrap()),
12+
transport: Some(Arc::new(transport.clone())),
13+
sample_rate: 1.0,
14+
traces_sample_rate: 1.0,
15+
..ClientOptions::default()
16+
};
17+
Hub::current().bind_client(Some(Arc::new(options.into())));
18+
19+
let _ = tracing_subscriber::registry()
20+
.with(sentry_tracing::layer().enable_span_attributes())
21+
.try_init();
22+
23+
transport
24+
}

sentry-tracing/tests/tracing.rs renamed to sentry-tracing/tests/smoke.rs

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,4 @@
1-
use sentry::{ClientOptions, Hub};
2-
use sentry_core::test::TestTransport;
3-
4-
use std::sync::Arc;
5-
6-
fn init_sentry() -> Arc<TestTransport> {
7-
use tracing_subscriber::prelude::*;
8-
9-
let transport = TestTransport::new();
10-
let options = ClientOptions {
11-
dsn: Some("https://[email protected]/test".parse().unwrap()),
12-
transport: Some(Arc::new(transport.clone())),
13-
sample_rate: 1.0,
14-
traces_sample_rate: 1.0,
15-
..ClientOptions::default()
16-
};
17-
Hub::current().bind_client(Some(Arc::new(options.into())));
18-
19-
let _ = tracing_subscriber::registry()
20-
.with(sentry_tracing::layer().enable_span_attributes())
21-
.try_init();
22-
23-
transport
24-
}
1+
mod shared;
252

263
#[tracing::instrument(fields(tags.tag = "key", not_tag = "value"))]
274
fn function_with_tags(value: i32) {
@@ -30,7 +7,7 @@ fn function_with_tags(value: i32) {
307

318
#[test]
329
fn should_instrument_function_with_event() {
33-
let transport = init_sentry();
10+
let transport = shared::init_sentry();
3411

3512
function_with_tags(1);
3613

0 commit comments

Comments
 (0)