use std::sync::Arc;
use super::{logs, metrics, traces};
pub(crate) fn flush_logger_provider() -> bool {
let provider = {
let guard = crate::_lock::lock(logs::logger_provider_slot());
guard
.as_ref()
.map(|installed| Arc::clone(&installed.provider))
};
let Some(provider) = provider else {
return true;
};
super::bounded_flush("logs", move || provider.force_flush().is_ok())
}
pub(crate) fn flush_tracer_provider() -> bool {
let provider = {
let guard = crate::_lock::lock(traces::tracer_provider_slot());
guard
.as_ref()
.map(|installed| Arc::clone(&installed.provider))
};
let Some(provider) = provider else {
return true;
};
super::bounded_flush("traces", move || provider.force_flush().is_ok())
}
pub(crate) fn flush_meter_provider() -> bool {
let provider = {
let guard = crate::_lock::lock(metrics::meter_provider_slot());
guard
.as_ref()
.map(|installed| Arc::clone(&installed.provider))
};
let Some(provider) = provider else {
return true;
};
super::bounded_flush("metrics", move || provider.force_flush().is_ok())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::TelemetryConfig;
use crate::testing::{acquire_test_state_lock, reset_telemetry_state};
fn install_config() -> TelemetryConfig {
let mut cfg = TelemetryConfig {
service_name: "flush-test".to_string(),
..TelemetryConfig::default()
};
cfg.tracing.enabled = true;
cfg.tracing.otlp_endpoint = Some("http://127.0.0.1:4318/v1/traces".to_string());
cfg.metrics.enabled = true;
cfg.metrics.otlp_endpoint = Some("http://127.0.0.1:4318/v1/metrics".to_string());
cfg.logging.otlp_endpoint = Some("http://127.0.0.1:4318/v1/logs".to_string());
cfg
}
#[test]
fn flushing_with_no_provider_installed_succeeds() {
let _guard = acquire_test_state_lock();
reset_telemetry_state();
assert!(flush_logger_provider());
assert!(flush_tracer_provider());
assert!(flush_meter_provider());
}
#[test]
fn flush_telemetry_reports_an_incomplete_drain_as_an_error() {
let _guard = acquire_test_state_lock();
reset_telemetry_state();
let mut cfg = install_config();
let resource = super::super::resource::build_resource(&cfg);
let _ = super::super::traces::install_tracer_provider(&cfg, resource);
cfg.exporter.logs_shutdown_timeout_seconds = 0.000_001;
crate::runtime::set_active_config(Some(cfg));
assert!(
crate::flush_telemetry().is_err(),
"a drain abandoned at its deadline must report Err"
);
crate::runtime::set_active_config(None);
reset_telemetry_state();
}
#[test]
fn flushing_an_installed_provider_leaves_it_installed() {
let _guard = acquire_test_state_lock();
reset_telemetry_state();
let cfg = install_config();
let resource = super::super::resource::build_resource(&cfg);
let _ = super::super::traces::install_tracer_provider(&cfg, resource.clone());
let _ = super::super::metrics::install_meter_provider(&cfg, resource.clone());
let _ = super::super::logs::install_logger_provider(&cfg, resource);
assert!(flush_tracer_provider());
assert!(flush_meter_provider());
assert!(flush_logger_provider());
assert!(super::super::traces::tracer_provider_installed());
assert!(super::super::metrics::meter_provider_installed());
assert!(super::super::logs::logger_provider_installed());
assert!(flush_tracer_provider());
assert!(flush_meter_provider());
assert!(flush_logger_provider());
reset_telemetry_state();
}
}