|
1 | 1 | use opentelemetry::trace::{TraceError, TracerProvider}; |
2 | | -use opentelemetry_sdk::trace::Tracer; |
| 2 | +use opentelemetry_sdk::trace::{self, Tracer}; |
3 | 3 | use tracing::{info, Subscriber}; |
4 | 4 | use tracing_opentelemetry::OpenTelemetryLayer; |
5 | 5 | use tracing_subscriber::{filter::EnvFilter, layer::SubscriberExt, registry::LookupSpan, Layer}; |
@@ -60,7 +60,7 @@ pub fn build_loglevel_filter_layer() -> tracing_subscriber::filter::EnvFilter { |
60 | 60 | EnvFilter::from_default_env() |
61 | 61 | } |
62 | 62 |
|
63 | | -pub fn build_otel_layer<S>() -> Result<OpenTelemetryLayer<S, Tracer>, TraceError> |
| 63 | +pub fn build_otel_layer<S>() -> Result<(OpenTelemetryLayer<S, Tracer>, TracingGuard), TraceError> |
64 | 64 | where |
65 | 65 | S: Subscriber + for<'a> LookupSpan<'a>, |
66 | 66 | { |
@@ -88,22 +88,35 @@ where |
88 | 88 | let layer = tracing_opentelemetry::layer() |
89 | 89 | .with_error_records_to_exceptions(true) |
90 | 90 | .with_tracer(tracerprovider.tracer("")); |
91 | | - global::set_tracer_provider(tracerprovider); |
92 | | - Ok(layer) |
| 91 | + global::set_tracer_provider(tracerprovider.clone()); |
| 92 | + Ok((layer, TracingGuard { tracerprovider })) |
93 | 93 | } |
94 | 94 |
|
95 | | -pub fn init_subscribers() -> Result<(), Error> { |
| 95 | +#[must_use = "Recommend holding with 'let _guard = ' pattern to ensure final traces are sent to the server"] |
| 96 | +pub struct TracingGuard { |
| 97 | + tracerprovider: trace::TracerProvider, |
| 98 | +} |
| 99 | + |
| 100 | +impl Drop for TracingGuard { |
| 101 | + fn drop(&mut self) { |
| 102 | + self.tracerprovider.force_flush(); |
| 103 | + } |
| 104 | +} |
| 105 | + |
| 106 | +pub fn init_subscribers() -> Result<TracingGuard, Error> { |
96 | 107 | //setup a temporary subscriber to log output during setup |
97 | 108 | let subscriber = tracing_subscriber::registry() |
98 | 109 | .with(build_loglevel_filter_layer()) |
99 | 110 | .with(build_logger_text()); |
100 | 111 | let _guard = tracing::subscriber::set_default(subscriber); |
101 | 112 | info!("init logging & tracing"); |
102 | 113 |
|
| 114 | + let (layer, guard) = build_otel_layer()?; |
| 115 | + |
103 | 116 | let subscriber = tracing_subscriber::registry() |
104 | | - .with(build_otel_layer()?) |
| 117 | + .with(layer) |
105 | 118 | .with(build_loglevel_filter_layer()) |
106 | 119 | .with(build_logger_text()); |
107 | 120 | tracing::subscriber::set_global_default(subscriber)?; |
108 | | - Ok(()) |
| 121 | + Ok(guard) |
109 | 122 | } |
0 commit comments