Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 15 additions & 34 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ pub mod loggers;
pub mod syslog_writer;

pub(crate) const SERVICE_NAME_KEY: &str = "service.name";
pub const OTEL_SHUTDOWN_TIMEOUT_SECS: u64 = 30;

struct PrometheusRegistry {
registry: Registry,
Expand Down Expand Up @@ -160,24 +161,9 @@ impl Otel {
// Graceful shutdown that flushes any pending metrics and logs to the exporter.
info!("shutting down otel component");

// Use a timeout for flush/shutdown operations to prevent hanging
// when the server is unavailable
let shutdown_timeout = Duration::from_secs(10);

let flush_result = tokio::time::timeout(
shutdown_timeout,
tokio::task::spawn_blocking({
let meter_provider = self.meter_provider.clone();
move || meter_provider.force_flush()
})
).await;

match flush_result {
Err(_) => warn!("meter provider force_flush timed out"),
Ok(Err(e)) => warn!("meter provider force_flush task failed: {e:?}"),
Ok(Ok(Err(e))) => warn!("encountered error while flushing metrics: {e:?}"),
Ok(Ok(Ok(()))) => debug!("meter provider force_flush completed"),
}
// Use a timeout for shutdown operations to prevent hanging
// when the server is unavailable.
let shutdown_timeout = Duration::from_secs(OTEL_SHUTDOWN_TIMEOUT_SECS);

let shutdown_result = tokio::time::timeout(
shutdown_timeout,
Expand All @@ -190,30 +176,25 @@ impl Otel {
match shutdown_result {
Err(_) => warn!("meter provider shutdown timed out"),
Ok(Err(e)) => warn!("meter provider shutdown task failed: {e:?}"),
Ok(Ok(Err(e))) => warn!("encountered error while shutting down meter provider: {e:?}"),
Ok(Ok(Err(e))) => {
debug!("meter provider shutdown completed with error (often expected during shutdown): {e:?}");
}
Ok(Ok(Ok(()))) => debug!("meter provider shutdown completed"),
}

if let Some(logger_provider) = self.logger_provider.clone() {
let flush_result = tokio::time::timeout(
shutdown_timeout,
tokio::task::spawn_blocking({
let lp = logger_provider.clone();
move || lp.force_flush()
})
).await;

if let Err(_) | Ok(Err(_)) = flush_result {
warn!("logger provider force_flush timed out or failed");
}

if let Some(logger_provider) = self.logger_provider.take() {
let shutdown_result = tokio::time::timeout(
shutdown_timeout,
tokio::task::spawn_blocking(move || logger_provider.shutdown())
).await;

if let Err(_) | Ok(Err(_)) = shutdown_result {
warn!("logger provider shutdown timed out or failed");
match shutdown_result {
Err(_) => warn!("logger provider shutdown timed out"),
Ok(Err(e)) => warn!("logger provider shutdown task failed: {e:?}"),
Ok(Ok(Err(e))) => {
debug!("logger provider shutdown completed with error (often expected during shutdown): {e:?}");
}
Ok(Ok(Ok(()))) => debug!("logger provider shutdown completed"),
}
}

Expand Down