attuned-core 1.0.1

Core types and traits for Attuned - human state representation for LLM systems
Documentation
//! Telemetry setup and initialization.
//!
//! This module provides functions to initialize the observability stack.

use super::{TracingConfig, TracingFormat};

/// Guard that flushes telemetry on drop.
pub struct TelemetryGuard {
    _private: (),
}

impl Drop for TelemetryGuard {
    fn drop(&mut self) {
        // Flush any pending traces/metrics
        tracing::info!("shutting down telemetry");
    }
}

/// Initialize tracing with the given configuration.
///
/// Returns a guard that should be held for the lifetime of the application.
/// When dropped, it will flush any pending telemetry data.
///
/// # Example
///
/// ```rust,ignore
/// use attuned_core::telemetry::{init_tracing, TracingConfig};
///
/// fn main() {
///     let _guard = init_tracing(TracingConfig::default());
///     // Application code...
/// }
/// ```
pub fn init_tracing(_config: TracingConfig) -> TelemetryGuard {
    // Note: Full implementation requires tracing-subscriber
    // This is a placeholder that works without additional dependencies
    TelemetryGuard { _private: () }
}

/// Initialize tracing with environment-based configuration.
///
/// Reads configuration from environment variables:
/// - `ATTUNED_LOG_FORMAT`: "pretty", "json", or "compact"
/// - `ATTUNED_LOG_LEVEL`: e.g., "info", "debug", "trace"
/// - `ATTUNED_SERVICE_NAME`: service name for tracing
pub fn init_tracing_from_env() -> TelemetryGuard {
    let format = std::env::var("ATTUNED_LOG_FORMAT")
        .map(|s| match s.to_lowercase().as_str() {
            "json" => TracingFormat::Json,
            "compact" => TracingFormat::Compact,
            _ => TracingFormat::Pretty,
        })
        .unwrap_or_default();

    let level = std::env::var("ATTUNED_LOG_LEVEL").unwrap_or_else(|_| "info".to_string());

    let service_name =
        std::env::var("ATTUNED_SERVICE_NAME").unwrap_or_else(|_| "attuned".to_string());

    let config = TracingConfig {
        format,
        level,
        service_name,
        ..Default::default()
    };

    init_tracing(config)
}

/// Builder for configuring telemetry.
#[derive(Default)]
pub struct TelemetryBuilder {
    tracing: Option<TracingConfig>,
    #[allow(dead_code)]
    otel: Option<super::OtelConfig>,
    #[allow(dead_code)]
    metrics_enabled: bool,
}

impl TelemetryBuilder {
    /// Create a new telemetry builder.
    pub fn new() -> Self {
        Self::default()
    }

    /// Configure tracing.
    pub fn with_tracing(mut self, config: TracingConfig) -> Self {
        self.tracing = Some(config);
        self
    }

    /// Configure OpenTelemetry export.
    pub fn with_opentelemetry(mut self, config: super::OtelConfig) -> Self {
        self.otel = Some(config);
        self
    }

    /// Enable metrics collection.
    pub fn with_metrics(mut self) -> Self {
        self.metrics_enabled = true;
        self
    }

    /// Initialize all configured telemetry.
    pub fn init(self) -> TelemetryGuard {
        let config = self.tracing.unwrap_or_default();
        init_tracing(config)
    }
}