Skip to content

Commit

Permalink
shutdown tracer provider properly
Browse files Browse the repository at this point in the history
  • Loading branch information
enerdgumen committed Sep 11, 2024
1 parent 7c03025 commit 94760c1
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 2 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ serde_json = "^1.0"
# dates
chrono = {version = "^0.4", default-features = false, features = ["serde", "clock"]}
url = "2.5.0"
once_cell = "1.19.0"

[dev-dependencies]
actix-web = "4.0.1"
Expand Down
2 changes: 1 addition & 1 deletion src/subscriber.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ pub struct Uninstall;
impl Drop for Uninstall {
fn drop(&mut self) {
#[cfg(feature = "traces")]
opentelemetry::global::shutdown_tracer_provider();
crate::telemetry::shutdown_tracer_provider();
}
}
/// Information about the current app context like name or environment
Expand Down
31 changes: 30 additions & 1 deletion src/telemetry.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use once_cell::sync::Lazy;
use opentelemetry::global;
use opentelemetry::trace::TracerProvider;
use opentelemetry::KeyValue;
Expand All @@ -6,6 +7,8 @@ use opentelemetry_sdk::{
trace::{self, Tracer},
Resource,
};
use std::mem;
use std::sync::Mutex;

use crate::SubscriberConfig;

Expand Down Expand Up @@ -64,14 +67,40 @@ pub fn configure<T>(config: &SubscriberConfig<T>) -> Tracer {
.install_batch(runtime)
.expect("Failed to configure the OpenTelemetry tracer provider");

global::set_tracer_provider(tracer_provider.clone());
set_tracer_provider(tracer_provider.clone());

tracer_provider
.tracer_builder("prima-tracing")
.with_version(env!("CARGO_PKG_VERSION"))
.build()
}

static TRACER_PROVIDER: Lazy<Mutex<Option<trace::TracerProvider>>> =
Lazy::new(Default::default);

fn set_tracer_provider(new_provider: trace::TracerProvider) {
global::set_tracer_provider(new_provider.clone());

let mut tracer_provider = TRACER_PROVIDER
.lock()
.expect("OpenTelemetry tracer provider mutex poisoned");
_ = mem::replace(&mut *tracer_provider, Some(new_provider));
}

pub(crate) fn shutdown_tracer_provider() {
global::shutdown_tracer_provider();

let tracer_provider = TRACER_PROVIDER
.lock()
.expect("OpenTelemetry tracer provider mutex poisoned")
.take()
.expect("OpenTelemetry tracer provider is missing, cannot shutdown");

if let Err(err) = tracer_provider.shutdown() {
eprintln!("Failed to shutdown the OpenTelemetry tracer provider: {err:?}");
}
}

#[cfg(test)]
mod test {
use super::*;
Expand Down

0 comments on commit 94760c1

Please sign in to comment.