use std::sync::atomic::{AtomicBool, Ordering};
static BINDING_ARMED: AtomicBool = AtomicBool::new(false);
pub fn arm_binding_emission() {
BINDING_ARMED.store(true, Ordering::SeqCst);
}
pub fn is_binding_armed() -> bool {
BINDING_ARMED.load(Ordering::SeqCst)
}
#[cfg(test)]
pub(crate) fn reset_binding_armed() {
BINDING_ARMED.store(false, Ordering::SeqCst);
}
pub fn is_disabled() -> bool {
if let Ok(v) = std::env::var("TELEMETRY_DISABLED")
&& !v.is_empty()
{
return true;
}
if let Ok(env) = std::env::var("ENV")
&& (env == "test" || env == "dev")
{
return true;
}
if is_binding_armed()
&& let Ok(v) = std::env::var("COGNEE_HOST_SDK")
&& !v.is_empty()
{
return true;
}
false
}
pub fn request_timeout_secs() -> u64 {
std::env::var("TELEMETRY_REQUEST_TIMEOUT")
.ok()
.and_then(|v| v.parse::<u64>().ok())
.map(|v| v.clamp(1, 60))
.unwrap_or(5)
}
pub fn proxy_url() -> String {
#[cfg(test)]
{
if let Ok(v) = std::env::var("COGNEE_TELEMETRY_PROXY_URL_FOR_TESTS")
&& !v.is_empty()
{
return v;
}
}
if std::env::var("COGNEE_TELEMETRY_INTEGRATION_TEST")
.map(|v| !v.is_empty())
.unwrap_or(false)
&& let Ok(v) = std::env::var("COGNEE_TELEMETRY_PROXY_URL_FOR_TESTS")
&& !v.is_empty()
{
return v;
}
"https://test.prometh.ai".to_string()
}
#[cfg(test)]
mod tests {
use super::*;
use serial_test::serial;
#[test]
#[serial]
fn telemetry_disabled_truthy_value() {
unsafe {
std::env::remove_var("ENV");
std::env::set_var("TELEMETRY_DISABLED", "1");
}
assert!(is_disabled());
unsafe {
std::env::set_var("TELEMETRY_DISABLED", "false");
}
assert!(is_disabled());
unsafe {
std::env::remove_var("TELEMETRY_DISABLED");
}
}
#[test]
#[serial]
fn telemetry_disabled_empty_value() {
unsafe {
std::env::remove_var("ENV");
std::env::set_var("TELEMETRY_DISABLED", "");
}
assert!(!is_disabled());
unsafe {
std::env::remove_var("TELEMETRY_DISABLED");
}
}
#[test]
#[serial]
fn env_test_disables() {
unsafe {
std::env::remove_var("TELEMETRY_DISABLED");
std::env::set_var("ENV", "test");
}
assert!(is_disabled());
unsafe {
std::env::set_var("ENV", "dev");
}
assert!(is_disabled());
unsafe {
std::env::set_var("ENV", "production");
}
assert!(!is_disabled());
unsafe {
std::env::remove_var("ENV");
}
}
#[test]
#[serial]
fn is_disabled_when_binding_armed_and_host_sdk_set() {
unsafe {
std::env::remove_var("TELEMETRY_DISABLED");
std::env::remove_var("ENV");
}
reset_binding_armed();
arm_binding_emission();
unsafe {
std::env::set_var("COGNEE_HOST_SDK", "python");
}
assert!(is_disabled());
unsafe {
std::env::remove_var("COGNEE_HOST_SDK");
}
reset_binding_armed();
}
#[test]
#[serial]
fn is_not_disabled_when_only_host_sdk_set_without_arming() {
unsafe {
std::env::remove_var("TELEMETRY_DISABLED");
std::env::remove_var("ENV");
}
reset_binding_armed();
unsafe {
std::env::set_var("COGNEE_HOST_SDK", "python");
}
assert!(!is_disabled());
unsafe {
std::env::remove_var("COGNEE_HOST_SDK");
}
}
#[test]
#[serial]
fn timeout_default_and_clamp() {
unsafe {
std::env::remove_var("TELEMETRY_REQUEST_TIMEOUT");
}
assert_eq!(request_timeout_secs(), 5);
unsafe {
std::env::set_var("TELEMETRY_REQUEST_TIMEOUT", "0");
}
assert_eq!(request_timeout_secs(), 1);
unsafe {
std::env::set_var("TELEMETRY_REQUEST_TIMEOUT", "120");
}
assert_eq!(request_timeout_secs(), 60);
unsafe {
std::env::set_var("TELEMETRY_REQUEST_TIMEOUT", "10");
}
assert_eq!(request_timeout_secs(), 10);
unsafe {
std::env::remove_var("TELEMETRY_REQUEST_TIMEOUT");
}
}
}