provide-telemetry 0.5.1

Cross-language telemetry helpers with privacy, resilience, and OTLP support.
Documentation
use super::*;

use crate::runtime::set_active_config;
use crate::testing::acquire_test_state_lock;
use crate::{EventMetadata, EventSchemaConfig, TelemetryConfig};
use std::collections::BTreeMap;

fn make_event(level: &str, message: &str) -> LogEvent {
    LogEvent {
        level: level.to_string(),
        target: "test".to_string(),
        message: message.to_string(),
        context: BTreeMap::new(),
        trace_id: None,
        span_id: None,
        event_metadata: None,
    }
}

#[test]
fn extract_dars_fields_includes_resource_when_present() {
    let mut event = make_event("INFO", "orders.create.ok");
    event.event_metadata = Some(EventMetadata {
        domain: "orders".to_string(),
        action: "create".to_string(),
        resource: Some("invoice".to_string()),
        status: "ok".to_string(),
    });

    extract_dars_fields(&mut event);

    assert_eq!(
        event.context.get("domain"),
        Some(&Value::String("orders".into()))
    );
    assert_eq!(
        event.context.get("action"),
        Some(&Value::String("create".into()))
    );
    assert_eq!(
        event.context.get("resource"),
        Some(&Value::String("invoice".into()))
    );
    assert_eq!(
        event.context.get("status"),
        Some(&Value::String("ok".into()))
    );
}

#[test]
fn sanitize_context_returns_early_for_empty_context() {
    let mut event = make_event("INFO", "clean.message");
    sanitize_context(&mut event, 8);
    assert_eq!(event.message, "clean.message");
    assert!(event.context.is_empty());
}

#[test]
fn enforce_schema_prefers_runtime_required_key_errors() {
    let _guard = acquire_test_state_lock();
    crate::testing::reset_telemetry_state();
    set_active_config(Some(TelemetryConfig {
        event_schema: EventSchemaConfig {
            required_keys: vec!["request_id".to_string()],
            ..EventSchemaConfig::default()
        },
        strict_schema: true,
        ..TelemetryConfig::default()
    }));

    let mut event = make_event("INFO", "auth.login.ok");
    enforce_schema(&mut event);

    let schema_error = event
        .context
        .get("_schema_error")
        .and_then(Value::as_str)
        .expect("missing required key should be reported");
    assert!(schema_error.contains("request_id"));

    set_active_config(None);
}
// SPDX-FileCopyrightText: Copyright (C) 2026 provide.io llc
// SPDX-License-Identifier: Apache-2.0
// SPDX-Comment: Part of provide-telemetry.
//