@@ -19,11 +19,12 @@ use std::{
1919
2020use async_trait:: async_trait;
2121use thiserror:: Error ;
22- use tokio:: sync:: { mpsc, Mutex } ;
22+ use tokio:: sync:: { mpsc, oneshot , Mutex } ;
2323use tokio_util:: sync:: CancellationToken ;
2424
2525pub use opentelemetry:: { self , trace:: SpanKind } ;
2626pub use tracing;
27+ use tracing:: warn;
2728
2829pub mod prelude {
2930 pub use super :: { MessagingOperation , SpanExt , SpanKind , SpanKindExt } ;
@@ -200,11 +201,69 @@ impl ApplicationTelemetryClient {
200201 update_telemetry_tx,
201202 }
202203 }
203- }
204204
205- #[ async_trait]
206- impl TelemetryClient for ApplicationTelemetryClient {
207- async fn set_verbosity ( & mut self , updated : Verbosity ) -> Result < ( ) , ClientError > {
205+ pub async fn set_verbosity_and_wait ( & mut self , updated : Verbosity ) -> Result < ( ) , ClientError > {
206+ let ( tx, rx) = oneshot:: channel ( ) ;
207+
208+ self . set_verbosity_inner ( updated, Some ( tx) ) . await ?;
209+
210+ if let Err ( err) = rx. await {
211+ warn ! ( error = ?err, "sender already closed while waiting on verbosity change" ) ;
212+ }
213+
214+ Ok ( ( ) )
215+ }
216+
217+ pub async fn increase_verbosity_and_wait ( & mut self ) -> Result < ( ) , ClientError > {
218+ let ( tx, rx) = oneshot:: channel ( ) ;
219+
220+ self . increase_verbosity_inner ( Some ( tx) ) . await ?;
221+
222+ if let Err ( err) = rx. await {
223+ warn ! (
224+ error = ?err,
225+ "sender already closed while waiting on verbosity increase change" ,
226+ ) ;
227+ }
228+
229+ Ok ( ( ) )
230+ }
231+
232+ pub async fn decrease_verbosity_and_wait ( & mut self ) -> Result < ( ) , ClientError > {
233+ let ( tx, rx) = oneshot:: channel ( ) ;
234+
235+ self . decrease_verbosity_inner ( Some ( tx) ) . await ?;
236+
237+ if let Err ( err) = rx. await {
238+ warn ! (
239+ error = ?err,
240+ "sender already closed while waiting on verbosity decrease change" ,
241+ ) ;
242+ }
243+
244+ Ok ( ( ) )
245+ }
246+
247+ pub async fn set_custom_tracing_and_wait (
248+ & mut self ,
249+ directives : impl Into < String > + Send ,
250+ ) -> Result < ( ) , ClientError > {
251+ let ( tx, rx) = oneshot:: channel ( ) ;
252+
253+ self . set_custom_tracing_inner ( directives, Some ( tx) ) . await ?;
254+
255+ if let Err ( err) = rx. await {
256+ warn ! ( error = ?err, "sender already closed while waiting on custom tracing change" ) ;
257+ }
258+
259+ Ok ( ( ) )
260+ }
261+
262+ async fn set_verbosity_inner (
263+ & mut self ,
264+ updated : Verbosity ,
265+ wait : Option < oneshot:: Sender < ( ) > > ,
266+ ) -> Result < ( ) , ClientError > {
208267 let mut guard = self . tracing_level . lock ( ) . await ;
209268 let tracing_level = guard. deref_mut ( ) ;
210269
@@ -225,51 +284,87 @@ impl TelemetryClient for ApplicationTelemetryClient {
225284 }
226285
227286 self . update_telemetry_tx
228- . send ( TelemetryCommand :: TracingLevel ( tracing_level. clone ( ) ) ) ?;
287+ . send ( TelemetryCommand :: TracingLevel {
288+ level : tracing_level. clone ( ) ,
289+ wait,
290+ } ) ?;
291+
229292 Ok ( ( ) )
230293 }
231294
232- async fn increase_verbosity ( & mut self ) -> Result < ( ) , ClientError > {
295+ async fn increase_verbosity_inner (
296+ & mut self ,
297+ wait : Option < oneshot:: Sender < ( ) > > ,
298+ ) -> Result < ( ) , ClientError > {
233299 let guard = self . tracing_level . lock ( ) . await ;
234300
235301 match guard. deref ( ) {
236302 TracingLevel :: Verbosity { verbosity, .. } => {
237303 let updated = verbosity. increase ( ) ;
238304 drop ( guard) ;
239- self . set_verbosity ( updated) . await
305+ self . set_verbosity_inner ( updated, wait ) . await
240306 }
241307 TracingLevel :: Custom ( _) => Err ( ClientError :: CustomHasNoVerbosity ) ,
242308 }
243309 }
244310
245- async fn decrease_verbosity ( & mut self ) -> Result < ( ) , ClientError > {
311+ async fn decrease_verbosity_inner (
312+ & mut self ,
313+ wait : Option < oneshot:: Sender < ( ) > > ,
314+ ) -> Result < ( ) , ClientError > {
246315 let guard = self . tracing_level . lock ( ) . await ;
247316
248317 match guard. deref ( ) {
249318 TracingLevel :: Verbosity { verbosity, .. } => {
250319 let updated = verbosity. decrease ( ) ;
251320 drop ( guard) ;
252- self . set_verbosity ( updated) . await
321+ self . set_verbosity_inner ( updated, wait ) . await
253322 }
254323 TracingLevel :: Custom ( _) => Err ( ClientError :: CustomHasNoVerbosity ) ,
255324 }
256325 }
257326
258- async fn set_custom_tracing (
327+ async fn set_custom_tracing_inner (
259328 & mut self ,
260- directives : impl Into < String > + Send + ' async_trait ,
329+ directives : impl Into < String > + Send ,
330+ wait : Option < oneshot:: Sender < ( ) > > ,
261331 ) -> Result < ( ) , ClientError > {
262332 let mut guard = self . tracing_level . lock ( ) . await ;
263333 let tracing_level = guard. deref_mut ( ) ;
264334
265335 let updated = TracingLevel :: custom ( directives) ;
266336 * tracing_level = updated;
267337 self . update_telemetry_tx
268- . send ( TelemetryCommand :: TracingLevel ( tracing_level. clone ( ) ) ) ?;
338+ . send ( TelemetryCommand :: TracingLevel {
339+ level : tracing_level. clone ( ) ,
340+ wait,
341+ } ) ?;
269342 Ok ( ( ) )
270343 }
271344}
272345
346+ #[ async_trait]
347+ impl TelemetryClient for ApplicationTelemetryClient {
348+ async fn set_verbosity ( & mut self , updated : Verbosity ) -> Result < ( ) , ClientError > {
349+ self . set_verbosity_inner ( updated, None ) . await
350+ }
351+
352+ async fn increase_verbosity ( & mut self ) -> Result < ( ) , ClientError > {
353+ self . increase_verbosity_inner ( None ) . await
354+ }
355+
356+ async fn decrease_verbosity ( & mut self ) -> Result < ( ) , ClientError > {
357+ self . decrease_verbosity_inner ( None ) . await
358+ }
359+
360+ async fn set_custom_tracing (
361+ & mut self ,
362+ directives : impl Into < String > + Send + ' async_trait ,
363+ ) -> Result < ( ) , ClientError > {
364+ self . set_custom_tracing_inner ( directives, None ) . await
365+ }
366+ }
367+
273368#[ async_trait]
274369impl TelemetryLevel for ApplicationTelemetryClient {
275370 async fn is_debug_or_lower ( & self ) -> bool {
@@ -325,10 +420,13 @@ pub enum ClientError {
325420}
326421
327422#[ remain:: sorted]
328- #[ derive( Clone , Debug ) ]
423+ #[ derive( Debug ) ]
329424pub enum TelemetryCommand {
330425 Shutdown ( CancellationToken ) ,
331- TracingLevel ( TracingLevel ) ,
426+ TracingLevel {
427+ level : TracingLevel ,
428+ wait : Option < oneshot:: Sender < ( ) > > ,
429+ } ,
332430}
333431
334432#[ remain:: sorted]
0 commit comments