Skip to content

Commit 477a5f8

Browse files
committed
feat(tracing): support combined EventFilters and EventMappings
1 parent 333b14e commit 477a5f8

File tree

4 files changed

+86
-47
lines changed

4 files changed

+86
-47
lines changed

Cargo.lock

Lines changed: 14 additions & 13 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
@@ -29,6 +29,7 @@ tracing-subscriber = { version = "0.3.1", default-features = false, features = [
2929
"std",
3030
] }
3131
sentry-backtrace = { version = "0.40.0", path = "../sentry-backtrace", optional = true }
32+
bitflags = "2.9.1"
3233

3334
[dev-dependencies]
3435
log = "0.4"

sentry-tracing/src/converters.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ fn extract_event_data(
7777
/// Extracts the message and metadata from an event, including the data in the current span.
7878
fn extract_event_data_with_context<S>(
7979
event: &tracing_core::Event,
80-
ctx: Option<Context<S>>,
80+
ctx: Option<&Context<S>>,
8181
store_errors_in_values: bool,
8282
) -> (Option<String>, FieldVisitor)
8383
where
@@ -182,7 +182,7 @@ impl Visit for FieldVisitor {
182182
/// Creates a [`Breadcrumb`] from a given [`tracing_core::Event`].
183183
pub fn breadcrumb_from_event<'context, S>(
184184
event: &tracing_core::Event,
185-
ctx: impl Into<Option<Context<'context, S>>>,
185+
ctx: impl Into<Option<&'context Context<'context, S>>>,
186186
) -> Breadcrumb
187187
where
188188
S: Subscriber + for<'a> LookupSpan<'a>,
@@ -261,7 +261,7 @@ fn contexts_from_event(
261261
/// Creates an [`Event`] (possibly carrying exceptions) from a given [`tracing_core::Event`].
262262
pub fn event_from_event<'context, S>(
263263
event: &tracing_core::Event,
264-
ctx: impl Into<Option<Context<'context, S>>>,
264+
ctx: impl Into<Option<&'context Context<'context, S>>>,
265265
) -> Event<'static>
266266
where
267267
S: Subscriber + for<'a> LookupSpan<'a>,
@@ -329,7 +329,7 @@ where
329329
#[cfg(feature = "logs")]
330330
pub fn log_from_event<'context, S>(
331331
event: &tracing_core::Event,
332-
ctx: impl Into<Option<Context<'context, S>>>,
332+
ctx: impl Into<Option<&'context Context<'context, S>>>,
333333
) -> Log
334334
where
335335
S: Subscriber + for<'a> LookupSpan<'a>,

sentry-tracing/src/layer.rs

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::cell::RefCell;
33
use std::collections::BTreeMap;
44
use std::sync::Arc;
55

6+
use bitflags::bitflags;
67
use sentry_core::protocol::Value;
78
use sentry_core::{Breadcrumb, TransactionOrSpan};
89
use tracing_core::field::Visit;
@@ -13,21 +14,22 @@ use tracing_subscriber::registry::LookupSpan;
1314
use crate::converters::*;
1415
use crate::TAGS_PREFIX;
1516

16-
/// The action that Sentry should perform for a given [`Event`]
17-
#[derive(Debug, Clone, Copy)]
18-
pub enum EventFilter {
19-
/// Ignore the [`Event`]
20-
Ignore,
21-
/// Create a [`Breadcrumb`] from this [`Event`]
22-
Breadcrumb,
23-
/// Create a [`sentry_core::protocol::Event`] from this [`Event`]
24-
Event,
25-
/// Create a [`sentry_core::protocol::Log`] from this [`Event`]
26-
#[cfg(feature = "logs")]
27-
Log,
17+
bitflags! {
18+
/// The action that Sentry should perform for a given [`Event`]
19+
#[derive(Debug, Clone, Copy)]
20+
pub struct EventFilter: u32 {
21+
/// Ignore the [`Event`]
22+
const Ignore = 0b000;
23+
/// Create a [`Breadcrumb`] from this [`Event`]
24+
const Breadcrumb = 0b001;
25+
/// Create a [`sentry_core::protocol::Event`] from this [`Event`]
26+
const Event = 0b010;
27+
/// Create a [`sentry_core::protocol::Log`] from this [`Event`]
28+
const Log = 0b100;
29+
}
2830
}
2931

30-
/// The type of data Sentry should ingest for a [`Event`]
32+
/// The type of data Sentry should ingest for an [`Event`].
3133
#[derive(Debug)]
3234
#[allow(clippy::large_enum_variant)]
3335
pub enum EventMapping {
@@ -40,6 +42,27 @@ pub enum EventMapping {
4042
/// Captures the [`sentry_core::protocol::Log`] to Sentry.
4143
#[cfg(feature = "logs")]
4244
Log(sentry_core::protocol::Log),
45+
/// Captures multiple items to Sentry.
46+
Combined(CombinedEventMapping),
47+
}
48+
49+
/// A list of event mappings.
50+
#[derive(Debug)]
51+
pub struct CombinedEventMapping(Vec<EventMapping>);
52+
53+
impl From<EventMapping> for CombinedEventMapping {
54+
fn from(value: EventMapping) -> Self {
55+
match value {
56+
EventMapping::Combined(combined) => combined,
57+
_ => CombinedEventMapping(vec![value]),
58+
}
59+
}
60+
}
61+
62+
impl From<Vec<EventMapping>> for CombinedEventMapping {
63+
fn from(value: Vec<EventMapping>) -> Self {
64+
Self(value)
65+
}
4366
}
4467

4568
/// The default event filter.
@@ -211,30 +234,44 @@ where
211234
S: Subscriber + for<'a> LookupSpan<'a>,
212235
{
213236
fn on_event(&self, event: &Event, ctx: Context<'_, S>) {
214-
let item = match &self.event_mapper {
237+
let items = match &self.event_mapper {
215238
Some(mapper) => mapper(event, ctx),
216239
None => {
217240
let span_ctx = self.with_span_attributes.then_some(ctx);
218-
match (self.event_filter)(event.metadata()) {
219-
EventFilter::Ignore => EventMapping::Ignore,
220-
EventFilter::Breadcrumb => {
221-
EventMapping::Breadcrumb(breadcrumb_from_event(event, span_ctx))
222-
}
223-
EventFilter::Event => EventMapping::Event(event_from_event(event, span_ctx)),
224-
#[cfg(feature = "logs")]
225-
EventFilter::Log => EventMapping::Log(log_from_event(event, span_ctx)),
241+
let filter = (self.event_filter)(event.metadata());
242+
let mut items = vec![];
243+
if filter.contains(EventFilter::Breadcrumb) {
244+
items.push(EventMapping::Breadcrumb(breadcrumb_from_event(
245+
event,
246+
span_ctx.as_ref(),
247+
)));
226248
}
249+
if filter.contains(EventFilter::Event) {
250+
items.push(EventMapping::Event(event_from_event(
251+
event,
252+
span_ctx.as_ref(),
253+
)));
254+
}
255+
#[cfg(feature = "logs")]
256+
if filter.contains(EventFilter::Log) {
257+
items.push(EventMapping::Log(log_from_event(event, span_ctx.as_ref())));
258+
}
259+
EventMapping::Combined(CombinedEventMapping(items))
227260
}
228261
};
229-
230-
match item {
231-
EventMapping::Event(event) => {
232-
sentry_core::capture_event(event);
262+
let items = CombinedEventMapping::from(items);
263+
264+
for item in items.0 {
265+
match item {
266+
EventMapping::Ignore => (),
267+
EventMapping::Breadcrumb(breadcrumb) => sentry_core::add_breadcrumb(breadcrumb),
268+
EventMapping::Event(event) => {
269+
sentry_core::capture_event(event);
270+
}
271+
#[cfg(feature = "logs")]
272+
EventMapping::Log(log) => sentry_core::Hub::with_active(|hub| hub.capture_log(log)),
273+
_ => (),
233274
}
234-
EventMapping::Breadcrumb(breadcrumb) => sentry_core::add_breadcrumb(breadcrumb),
235-
#[cfg(feature = "logs")]
236-
EventMapping::Log(log) => sentry_core::Hub::with_active(|hub| hub.capture_log(log)),
237-
_ => (),
238275
}
239276
}
240277

0 commit comments

Comments
 (0)