99pub  mod  error; 
1010pub  mod  zip; 
1111
12- use  std:: sync:: atomic :: { AtomicBool ,   Ordering } ; 
12+ use  std:: sync:: Mutex ; 
1313
1414use  datadog_remote_config:: { 
1515    config:: agent_task:: AgentTaskFile ,  file_storage:: RawFile ,  RemoteConfigData , 
1616} ; 
17+ use  ddcommon:: MutexExt ; 
1718
1819#[ cfg( feature = "listener" ) ]  
1920use  { 
@@ -55,7 +56,8 @@ use crate::error::FlareError;
5556pub  struct  TracerFlareManager  { 
5657    pub  agent_url :  String , 
5758    pub  language :  String , 
58-     pub  collecting :  AtomicBool , 
59+     // Option Some-ness tracks whether we are currently collecting metrics 
60+     pub  original_log_level :  Mutex < Option < LogLevel > > , 
5961    /// As a featured option so we can use the component with no Listener 
6062     #[ cfg( feature = "listener" ) ]  
6163    pub  listener :  Option < Listener > , 
@@ -66,7 +68,7 @@ impl Default for TracerFlareManager {
6668        TracerFlareManager  { 
6769            agent_url :  hyper:: Uri :: default ( ) . to_string ( ) , 
6870            language :  "rust" . to_string ( ) , 
69-             collecting :   AtomicBool :: new ( false ) , 
71+             original_log_level :   Mutex :: new ( None ) , 
7072            #[ cfg( feature = "listener" ) ]  
7173            listener :  None , 
7274        } 
@@ -182,14 +184,15 @@ impl TracerFlareManager {
182184        data :  & RemoteConfigData , 
183185    )  -> Result < ReturnAction ,  FlareError >  { 
184186        let  action = data. try_into ( ) ; 
185-         if  let  Ok ( ReturnAction :: Set ( _) )  = action { 
186-             if  self . collecting . load ( Ordering :: Relaxed )  { 
187+         if  let  Ok ( ReturnAction :: Set ( log_level) )  = action { 
188+             // If we are already collecting 
189+             if  self . original_log_level . lock_or_panic ( ) . is_some ( )  { 
187190                return  Ok ( ReturnAction :: None ) ; 
188191            } 
189-             self . collecting . store ( true ,   Ordering :: Relaxed ) ; 
192+             * self . original_log_level . lock_or_panic ( )  =  Some ( log_level ) ; 
190193        }  else  if  Ok ( ReturnAction :: None )  != action { 
191194            // If action is Send, Unset or an error, we need to stop collecting 
192-             self . collecting . store ( false ,   Ordering :: Relaxed ) ; 
195+             * self . original_log_level . lock_or_panic ( )  =  None ; 
193196        } 
194197        action
195198    } 
@@ -215,7 +218,7 @@ impl TracerFlareManager {
215218            Ok ( data)  => self . handle_remote_config_data ( data) , 
216219            Err ( e)  => { 
217220                // If encounter an error we need to stop collecting 
218-                 self . collecting . store ( false ,   Ordering :: Relaxed ) ; 
221+                 * self . original_log_level . lock_or_panic ( )  =  None ; 
219222                Err ( FlareError :: ParsingError ( e. to_string ( ) ) ) 
220223            } 
221224        } 
@@ -224,7 +227,7 @@ impl TracerFlareManager {
224227
225228/// Enum that holds the different log levels possible 
226229/// Do not change the order of the variants because we rely on Ord 
227- #[ derive( Debug ,  PartialEq ,  Eq ,  PartialOrd ,  Ord ,  Clone ) ]  
230+ #[ derive( Debug ,  PartialEq ,  Eq ,  PartialOrd ,  Ord ,  Clone ,   Copy ) ]  
228231pub  enum  LogLevel  { 
229232    Trace , 
230233    Debug , 
@@ -456,10 +459,10 @@ pub async fn run_remote_config_listener(
456459        } 
457460    } 
458461
459-     if  let  ReturnAction :: Set ( _ )  = state { 
460-         tracer_flare. collecting . store ( true ,   Ordering :: Relaxed ) ; 
462+     if  let  ReturnAction :: Set ( log_level )  = state { 
463+         * tracer_flare. original_log_level . lock_or_panic ( )  =  Some ( log_level ) ; 
461464    }  else  if  let  ReturnAction :: Send ( _)  = state { 
462-         tracer_flare. collecting . store ( false ,   Ordering :: Relaxed ) ; 
465+         * tracer_flare. original_log_level . lock_or_panic ( )  =  None ; 
463466    } 
464467
465468    Ok ( state) 
@@ -477,7 +480,7 @@ mod tests {
477480        file_storage:: ParsedFileStorage , 
478481        RemoteConfigPath ,  RemoteConfigProduct ,  RemoteConfigSource , 
479482    } ; 
480-     use  std :: sync :: atomic :: Ordering ; 
483+     use  ddcommon :: MutexExt ; 
481484    use  std:: { num:: NonZeroU64 ,  sync:: Arc } ; 
482485
483486    #[ test]  
@@ -663,19 +666,19 @@ mod tests {
663666            . unwrap ( ) ; 
664667
665668        // First AGENT_CONFIG 
666-         assert ! ( ! tracer_flare. collecting . load ( Ordering :: Relaxed ) ) ; 
669+         assert ! ( tracer_flare. original_log_level . lock_or_panic ( ) . is_none ( ) ) ; 
667670        let  result = tracer_flare
668671            . handle_remote_config_file ( agent_config_file. clone ( ) ) 
669672            . unwrap ( ) ; 
670673        assert_eq ! ( result,  ReturnAction :: Set ( LogLevel :: Info ) ) ; 
671-         assert ! ( tracer_flare. collecting . load ( Ordering :: Relaxed ) ) ; 
674+         assert ! ( tracer_flare. original_log_level . lock_or_panic ( ) . is_some ( ) ) ; 
672675
673676        // Second AGENT_CONFIG 
674677        let  result = tracer_flare
675678            . handle_remote_config_file ( agent_config_file) 
676679            . unwrap ( ) ; 
677680        assert_eq ! ( result,  ReturnAction :: None ) ; 
678-         assert ! ( tracer_flare. collecting . load ( Ordering :: Relaxed ) ) ; 
681+         assert ! ( tracer_flare. original_log_level . lock_or_panic ( ) . is_some ( ) ) ; 
679682
680683        // Non-None actions stop collecting 
681684        let  error_file = storage
@@ -692,7 +695,7 @@ mod tests {
692695            . unwrap ( ) ; 
693696
694697        let  _ = tracer_flare. handle_remote_config_file ( error_file) ; 
695-         assert ! ( ! tracer_flare. collecting . load ( Ordering :: Relaxed ) ) ; 
698+         assert ! ( tracer_flare. original_log_level . lock_or_panic ( ) . is_none ( ) ) ; 
696699    } 
697700
698701    #[ test]  
0 commit comments