Skip to content
This repository was archived by the owner on Feb 6, 2026. It is now read-only.

Commit a69b546

Browse files
merge: #3280
3280: chore: add optional API to make tracing level changes "wait-able" r=fnichol a=fnichol This change adds several `*_and_wait()` method options to the `ApplicationTelemetryClient` type. When our services boot up we check the parsed CLI argument for verbosity flags. If there are more than one set then we issue a command to raise the tracing level but prior to this change, this operation was non-blocking/async. That means that the level may not have raised by the time the next line of code executes resulting in potential missing log messages. <img src="https://media2.giphy.com/media/l0HlKrB02QY0f1mbm/giphy.gif"/> Co-authored-by: Fletcher Nichol <fletcher@systeminit.com>
2 parents 1a9c74a + 28d7e55 commit a69b546

File tree

8 files changed

+141
-23
lines changed

8 files changed

+141
-23
lines changed

bin/council/src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ async fn async_main() -> Result<()> {
4646
};
4747

4848
if args.verbose > 0 {
49-
telemetry.set_verbosity(args.verbose.into()).await?;
49+
telemetry
50+
.set_verbosity_and_wait(args.verbose.into())
51+
.await?;
5052
}
5153
trace!(arguments =?args, "parsed cli arguments");
5254

bin/cyclone/src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ async fn main() -> Result<()> {
4141
};
4242

4343
if args.verbose > 0 {
44-
telemetry.set_verbosity(args.verbose.into()).await?;
44+
telemetry
45+
.set_verbosity_and_wait(args.verbose.into())
46+
.await?;
4547
}
4648
trace!(arguments =?args, "parsed cli arguments");
4749

bin/module-index/src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ async fn async_main() -> Result<()> {
4646
};
4747

4848
if args.verbose > 0 {
49-
telemetry.set_verbosity(args.verbose.into()).await?;
49+
telemetry
50+
.set_verbosity_and_wait(args.verbose.into())
51+
.await?;
5052
}
5153
trace!(arguments =?args, "parsed cli arguments");
5254

bin/pinga/src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ async fn async_main() -> Result<()> {
4646
};
4747

4848
if args.verbose > 0 {
49-
telemetry.set_verbosity(args.verbose.into()).await?;
49+
telemetry
50+
.set_verbosity_and_wait(args.verbose.into())
51+
.await?;
5052
}
5153
trace!(arguments =?args, "parsed cli arguments");
5254

bin/sdf/src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ async fn async_main() -> Result<()> {
5757
};
5858

5959
if args.verbose > 0 {
60-
telemetry.set_verbosity(args.verbose.into()).await?;
60+
telemetry
61+
.set_verbosity_and_wait(args.verbose.into())
62+
.await?;
6163
}
6264
trace!(arguments =?args, "parsed cli arguments");
6365

bin/veritech/src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ async fn main() -> Result<()> {
3232
};
3333

3434
if args.verbose > 0 {
35-
telemetry.set_verbosity(args.verbose.into()).await?;
35+
telemetry
36+
.set_verbosity_and_wait(args.verbose.into())
37+
.await?;
3638
}
3739
trace!(arguments =?args, "parsed cli arguments");
3840

lib/telemetry-application-rs/src/lib.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,14 +579,22 @@ impl TelemetryUpdateTask {
579579
async fn run(mut self) {
580580
while let Some(command) = self.update_command_rx.recv().await {
581581
match command {
582-
TelemetryCommand::TracingLevel(tracing_level) => {
583-
if let Err(err) = self.update_tracing_level(tracing_level) {
582+
TelemetryCommand::TracingLevel { level, wait } => {
583+
if let Err(err) = self.update_tracing_level(level) {
584584
warn!(
585585
task = Self::NAME,
586586
error = ?err,
587587
"failed to update tracing level, using prior value",
588588
);
589589
}
590+
if let Some(tx) = wait {
591+
if let Err(err) = tx.send(()) {
592+
warn!(
593+
error = ?err,
594+
"receiver already closed when waiting on changing tracing level",
595+
);
596+
}
597+
}
590598
}
591599
TelemetryCommand::Shutdown(token) => {
592600
if !self.is_shutdown {

lib/telemetry-rs/src/lib.rs

Lines changed: 113 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ use std::{
1919

2020
use async_trait::async_trait;
2121
use thiserror::Error;
22-
use tokio::sync::{mpsc, Mutex};
22+
use tokio::sync::{mpsc, oneshot, Mutex};
2323
use tokio_util::sync::CancellationToken;
2424

2525
pub use opentelemetry::{self, trace::SpanKind};
2626
pub use tracing;
27+
use tracing::warn;
2728

2829
pub 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]
274369
impl 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)]
329424
pub 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

Comments
 (0)