apollo-opentelemetry 0.8.0

OpenTelemetry configuration types for Apollo platform
Documentation
//! Console exporter configuration for debugging.

use apollo_configuration::configuration;

#[configuration]
pub(crate) struct ConsoleExporterConfig {
    /// Output format.
    pub(crate) format: OutputFormat,

    /// Output target (stdout or stderr). Defaults to stdout.
    pub(crate) target: ConsoleTarget,
}

impl ConsoleExporterConfig {
    /// Check if ANSI color should be used, based on the target.
    pub(crate) fn use_color(&self) -> bool {
        use apollo_opentelemetry_stdout::__private::{
            should_use_color_stderr, should_use_color_stdout,
        };
        match self.target {
            ConsoleTarget::Stderr => should_use_color_stderr(),
            ConsoleTarget::Stdout => should_use_color_stdout(),
        }
    }
}

#[configuration]
#[derive(Copy, PartialEq, Eq, Default)]
pub enum OutputFormat {
    /// Detect format based on terminal: pretty if TTY, JSON otherwise.
    #[default]
    Auto,
    /// Human-readable colored output.
    Pretty,
    /// OTLP-compliant JSON (one object per line).
    Json,
}

/// Console output target.
#[configuration]
#[derive(Copy, PartialEq, Eq, Default)]
pub(crate) enum ConsoleTarget {
    /// Write to stdout.
    #[default]
    Stdout,
    /// Write to stderr.
    Stderr,
}

impl From<OutputFormat> for apollo_opentelemetry_stdout::__private::OutputFormat {
    fn from(format: OutputFormat) -> Self {
        match format {
            OutputFormat::Auto => Self::Auto,
            OutputFormat::Json => Self::Json,
            OutputFormat::Pretty => Self::Pretty,
        }
    }
}

impl From<ConsoleTarget> for apollo_opentelemetry_stdout::__private::SharedWriter {
    fn from(target: ConsoleTarget) -> Self {
        match target {
            ConsoleTarget::Stderr => Self::Stderr,
            ConsoleTarget::Stdout => Self::Stdout,
        }
    }
}

#[cfg(test)]
mod tests {
    use apollo_configuration::parse_yaml;

    use crate::config::OpenTelemetryConfig;

    #[test]
    fn parse_console_exporter() {
        let config: OpenTelemetryConfig = parse_yaml(
            indoc::indoc! {"
                tracer_provider:
                  processors:
                    - simple:
                        exporter:
                          console:
                            format: auto
                            target: stderr
            "},
            &Default::default(),
        )
        .unwrap();

        assert!(!config.tracer_provider.processors.is_empty());
    }
}