use super::{logs, metrics, traces};
use crate::health::get_health_snapshot;
use crate::testing::{acquire_test_state_lock, reset_telemetry_state};
use opentelemetry_sdk::logs::SdkLoggerProvider;
use opentelemetry_sdk::metrics::SdkMeterProvider;
use opentelemetry_sdk::trace::SdkTracerProvider;
fn install_traces_and_metrics() {
traces::install_tracer_provider_for_tests(SdkTracerProvider::builder().build());
metrics::install_meter_provider_for_tests(SdkMeterProvider::builder().build());
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn a_drain_entered_from_inside_a_tokio_runtime_is_counted_per_owned_signal() {
let _guard = acquire_test_state_lock();
reset_telemetry_state();
install_traces_and_metrics();
crate::flush_telemetry(Some(0.5)).expect("an empty provider drains inside its deadline");
let after_flush = get_health_snapshot();
assert_eq!(after_flush.async_blocking_risk_traces, 1);
assert_eq!(after_flush.async_blocking_risk_metrics, 1);
assert_eq!(after_flush.async_blocking_risk_logs, 0);
crate::shutdown_telemetry(Some(0.5)).expect("shutdown always reports success");
let after_shutdown = get_health_snapshot();
assert_eq!(after_shutdown.async_blocking_risk_traces, 2);
assert_eq!(after_shutdown.async_blocking_risk_metrics, 2);
assert_eq!(after_shutdown.async_blocking_risk_logs, 0);
reset_telemetry_state();
}
#[test]
fn a_drain_entered_from_an_ordinary_thread_is_not_counted() {
let _guard = acquire_test_state_lock();
reset_telemetry_state();
install_traces_and_metrics();
logs::install_logger_provider_for_tests(SdkLoggerProvider::builder().build());
crate::flush_telemetry(Some(0.5)).expect("an empty provider drains inside its deadline");
crate::shutdown_telemetry(Some(0.5)).expect("shutdown always reports success");
let snapshot = get_health_snapshot();
assert_eq!(snapshot.async_blocking_risk_logs, 0);
assert_eq!(snapshot.async_blocking_risk_traces, 0);
assert_eq!(snapshot.async_blocking_risk_metrics, 0);
reset_telemetry_state();
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn a_drain_with_no_provider_of_ours_installed_charges_no_signal() {
let _guard = acquire_test_state_lock();
reset_telemetry_state();
crate::flush_telemetry(Some(0.5)).expect("nothing installed is a drained state");
let snapshot = get_health_snapshot();
assert_eq!(snapshot.async_blocking_risk_logs, 0);
assert_eq!(snapshot.async_blocking_risk_traces, 0);
assert_eq!(snapshot.async_blocking_risk_metrics, 0);
reset_telemetry_state();
}