Skip to content

Commit ad609d5

Browse files
committed
Let Subscribe disable specific events
1 parent 989fb62 commit ad609d5

File tree

2 files changed

+61
-5
lines changed

2 files changed

+61
-5
lines changed

tracing-subscriber/src/reload.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ where
9393
try_lock!(self.inner.read()).on_follows_from(span, follows, ctx)
9494
}
9595

96+
#[inline]
97+
fn event_enabled(&self, event: &Event<'_>, ctx: subscribe::Context<'_, C>) -> bool {
98+
try_lock!(self.inner.read(), else return false).event_enabled(event, ctx)
99+
}
100+
96101
#[inline]
97102
fn on_event(&self, event: &Event<'_>, ctx: subscribe::Context<'_, C>) {
98103
try_lock!(self.inner.read()).on_event(event, ctx)

tracing-subscriber/src/subscribe.rs

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,10 @@ feature! {
185185
/// recorded: a filtering subscriber can be applied to other subscribers or
186186
/// collectors. A `Subscriber` that implements a filtering strategy should override the
187187
/// [`register_callsite`] and/or [`enabled`] methods. It may also choose to implement
188-
/// methods such as [`on_enter`], if it wishes to filter trace events based on
189-
/// the current span context.
188+
/// methods such as [`on_enter`] or [`event_enabled`], if it wishes to filter events
189+
/// based on the current span context.
190190
///
191-
/// Note that the [`Subscribe::register_callsite`] and [`Subscribe::enabled`] methods
191+
/// Note that the [`register_callsite`], [`enabled`], and [`event_enabled`] methods
192192
/// determine whether a span or event is enabled *globally*. Thus, they should
193193
/// **not** be used to indicate whether an individual subscriber wishes to record a
194194
/// particular span or event. Instead, if a subscriber is only interested in a subset
@@ -208,6 +208,7 @@ feature! {
208208
/// [`register_callsite`]: Subscribe::register_callsite()
209209
/// [`enabled`]: Subscribe::enabled()
210210
/// [`on_enter`]: Subscribe::on_enter()
211+
/// [`event_enabled`]: Subscribe::on_enter()
211212
pub trait Subscribe<C>
212213
where
213214
C: Collect,
@@ -315,6 +316,30 @@ where
315316
// seems like a good future-proofing measure as it may grow other methods later...
316317
fn on_follows_from(&self, _span: &span::Id, _follows: &span::Id, _ctx: Context<'_, C>) {}
317318

319+
/// Called before `on_event`, to determine if `on_event` should be called.
320+
///
321+
/// <div class="example-wrap" style="display:inline-block">
322+
/// <pre class="ignore" style="white-space:normal;font:inherit;">
323+
///
324+
/// **Note**: This method determines whether an event is globally enabled,
325+
/// *not* whether the individual subscriber will be notified about the
326+
/// event. This is intended to be used by layers that implement filtering
327+
/// for the entire stack. Layers which do not wish to be notified about
328+
/// certain events but do not wish to globally disable them should ignore
329+
/// those events in their [on_event][Self::on_event].
330+
///
331+
/// </pre></div>
332+
///
333+
/// See [the trait-level documentation] for more information on filtering
334+
/// with `Subscriber`s.
335+
///
336+
/// [`Interest`]: tracing_core::Interest
337+
/// [the trait-level documentation]: #filtering-with-subscribers
338+
#[inline] // collapse this to a constant please mrs optimizer
339+
fn event_enabled(&self, _event: &Event<'_>, _ctx: Context<'_, C>) -> bool {
340+
true
341+
}
342+
318343
/// Notifies this subscriber that an event has occurred.
319344
fn on_event(&self, _event: &Event<'_>, _ctx: Context<'_, C>) {}
320345

@@ -631,8 +656,10 @@ where
631656
}
632657

633658
fn event(&self, event: &Event<'_>) {
634-
self.inner.event(event);
635-
self.subscriber.on_event(event, self.ctx());
659+
if self.subscriber.event_enabled(event, self.ctx()) {
660+
self.inner.event(event);
661+
self.subscriber.on_event(event, self.ctx());
662+
}
636663
}
637664

638665
fn enter(&self, span: &span::Id) {
@@ -754,6 +781,17 @@ where
754781
self.subscriber.on_follows_from(span, follows, ctx);
755782
}
756783

784+
#[inline]
785+
fn event_enabled(&self, event: &Event<'_>, ctx: Context<'_, C>) -> bool {
786+
if self.subscriber.event_enabled(event, ctx.clone()) {
787+
// if the outer subscriber enables the callsite metadata, ask the inner subscriber.
788+
self.inner.event_enabled(event, ctx)
789+
} else {
790+
// otherwise, the callsite is disabled by this subscriber
791+
false
792+
}
793+
}
794+
757795
#[inline]
758796
fn on_event(&self, event: &Event<'_>, ctx: Context<'_, C>) {
759797
self.inner.on_event(event, ctx.clone());
@@ -845,6 +883,14 @@ where
845883
}
846884
}
847885

886+
#[inline]
887+
fn event_enabled(&self, event: &Event<'_>, ctx: Context<'_, C>) -> bool {
888+
match self {
889+
Some(ref inner) => inner.event_enabled(event, ctx),
890+
None => true,
891+
}
892+
}
893+
848894
#[inline]
849895
fn on_event(&self, event: &Event<'_>, ctx: Context<'_, C>) {
850896
if let Some(ref inner) = self {
@@ -926,6 +972,11 @@ feature! {
926972
self.deref().on_follows_from(span, follows, ctx)
927973
}
928974

975+
#[inline]
976+
fn event_enabled(&self, event: &Event<'_>, ctx: Context<'_, C>) -> bool {
977+
self.deref().event_enabled(event, ctx)
978+
}
979+
929980
#[inline]
930981
fn on_event(&self, event: &Event<'_>, ctx: Context<'_, C>) {
931982
self.deref().on_event(event, ctx)

0 commit comments

Comments
 (0)