@@ -185,10 +185,10 @@ feature! {
185
185
/// recorded: a filtering subscriber can be applied to other subscribers or
186
186
/// collectors. A `Subscriber` that implements a filtering strategy should override the
187
187
/// [`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.
190
190
///
191
- /// Note that the [`Subscribe:: register_callsite`] and [`Subscribe::enabled `] methods
191
+ /// Note that the [`register_callsite`], [`enabled`], and [`event_enabled `] methods
192
192
/// determine whether a span or event is enabled *globally*. Thus, they should
193
193
/// **not** be used to indicate whether an individual subscriber wishes to record a
194
194
/// particular span or event. Instead, if a subscriber is only interested in a subset
@@ -208,6 +208,7 @@ feature! {
208
208
/// [`register_callsite`]: Subscribe::register_callsite()
209
209
/// [`enabled`]: Subscribe::enabled()
210
210
/// [`on_enter`]: Subscribe::on_enter()
211
+ /// [`event_enabled`]: Subscribe::on_enter()
211
212
pub trait Subscribe < C >
212
213
where
213
214
C : Collect ,
@@ -315,6 +316,30 @@ where
315
316
// seems like a good future-proofing measure as it may grow other methods later...
316
317
fn on_follows_from ( & self , _span : & span:: Id , _follows : & span:: Id , _ctx : Context < ' _ , C > ) { }
317
318
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
+
318
343
/// Notifies this subscriber that an event has occurred.
319
344
fn on_event ( & self , _event : & Event < ' _ > , _ctx : Context < ' _ , C > ) { }
320
345
@@ -631,8 +656,10 @@ where
631
656
}
632
657
633
658
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
+ }
636
663
}
637
664
638
665
fn enter ( & self , span : & span:: Id ) {
@@ -754,6 +781,17 @@ where
754
781
self . subscriber . on_follows_from ( span, follows, ctx) ;
755
782
}
756
783
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
+
757
795
#[ inline]
758
796
fn on_event ( & self , event : & Event < ' _ > , ctx : Context < ' _ , C > ) {
759
797
self . inner . on_event ( event, ctx. clone ( ) ) ;
@@ -845,6 +883,14 @@ where
845
883
}
846
884
}
847
885
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
+
848
894
#[ inline]
849
895
fn on_event ( & self , event : & Event < ' _ > , ctx : Context < ' _ , C > ) {
850
896
if let Some ( ref inner) = self {
@@ -926,6 +972,11 @@ feature! {
926
972
self . deref( ) . on_follows_from( span, follows, ctx)
927
973
}
928
974
975
+ #[ inline]
976
+ fn event_enabled( & self , event: & Event <' _>, ctx: Context <' _, C >) -> bool {
977
+ self . deref( ) . event_enabled( event, ctx)
978
+ }
979
+
929
980
#[ inline]
930
981
fn on_event( & self , event: & Event <' _>, ctx: Context <' _, C >) {
931
982
self . deref( ) . on_event( event, ctx)
0 commit comments