apollo-opentelemetry 0.8.0

OpenTelemetry configuration types for Apollo platform
Documentation
//! Datadog OTLP direct intake exporter configuration.
//!
//! This exporter sends telemetry directly to Datadog's OTLP intake endpoints
//! without requiring the Datadog Agent.
//!
//! See [Datadog OTLP Intake](https://docs.datadoghq.com/opentelemetry/setup/otlp_ingest/)
//! for details.

use apollo_configuration::configuration;
use apollo_configuration::types::{HeaderValue, MetadataValue, Url};
use apollo_redaction::Redacted;

use super::otlp::{Compression, TlsConfig};

/// Datadog OTLP HTTP exporter configuration.
///
/// Sends telemetry directly to Datadog's OTLP intake endpoints (agentless) over HTTP.
#[configuration]
pub(crate) struct DatadogHttpExporterConfig {
    /// Datadog API key.
    #[config(required)]
    pub(crate) api_key: Redacted<HeaderValue>,

    /// Datadog OTLP intake endpoint URL.
    ///
    /// See [Datadog OTLP Ingest](https://docs.datadoghq.com/opentelemetry/interoperability/otlp_ingest_in_the_agent/#sending-traces-metrics-and-logs-over-otlphttp)
    /// for endpoint URLs by region:
    /// - US1: `https://trace-otlp.intake.datadoghq.com/api/v0.2/traces`
    /// - EU1: `https://trace-otlp.intake.datadoghq.eu/api/v0.2/traces`
    /// - US3: `https://trace-otlp.intake.us3.datadoghq.com/api/v0.2/traces`
    /// - US5: `https://trace-otlp.intake.us5.datadoghq.com/api/v0.2/traces`
    /// - AP1: `https://trace-otlp.intake.ap1.datadoghq.com/api/v0.2/traces`
    /// - GOV: `https://trace-otlp.intake.ddog-gov.com/api/v0.2/traces`
    #[config(required)]
    pub(crate) endpoint: Url,

    /// Compression algorithm.
    pub(crate) compression: Compression,

    /// Export timeout in milliseconds.
    #[config(default = 10000)]
    pub(crate) timeout: u64,

    /// TLS configuration.
    pub(crate) tls: Option<TlsConfig>,
}

/// Datadog OTLP gRPC exporter configuration.
///
/// Sends telemetry directly to Datadog's OTLP intake endpoints (agentless) over gRPC.
#[configuration]
pub(crate) struct DatadogGrpcExporterConfig {
    /// Datadog API key.
    #[config(required)]
    pub(crate) api_key: Redacted<MetadataValue>,

    /// Datadog OTLP intake endpoint URL.
    ///
    /// See [Datadog OTLP Ingest](https://docs.datadoghq.com/opentelemetry/interoperability/otlp_ingest_in_the_agent/#sending-traces-metrics-and-logs-over-otlpgrpc)
    /// for endpoint URLs by region:
    /// - US1: `https://trace-otlp.intake.datadoghq.com:4317`
    /// - EU1: `https://trace-otlp.intake.datadoghq.eu:4317`
    /// - US3: `https://trace-otlp.intake.us3.datadoghq.com:4317`
    /// - US5: `https://trace-otlp.intake.us5.datadoghq.com:4317`
    /// - AP1: `https://trace-otlp.intake.ap1.datadoghq.com:4317`
    /// - GOV: `https://trace-otlp.intake.ddog-gov.com:4317`
    #[config(required)]
    pub(crate) endpoint: Url,

    /// Compression algorithm.
    pub(crate) compression: Compression,

    /// Export timeout in milliseconds.
    #[config(default = 10000)]
    pub(crate) timeout: u64,

    /// TLS configuration.
    pub(crate) tls: Option<TlsConfig>,
}

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

    use crate::config::OpenTelemetryConfig;

    #[test]
    fn parse_datadog_otlp_http_exporter() {
        let config: OpenTelemetryConfig = parse_yaml(
            indoc::indoc! {"
                tracer_provider:
                  processors:
                    - batch:
                        exporter:
                          datadog_otlp_http:
                            api_key: test-api-key
                            endpoint: https://trace-otlp.intake.datadoghq.eu/api/v0.2/traces
            "},
            &Default::default(),
        )
        .unwrap();

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

    #[test]
    fn parse_datadog_otlp_grpc_exporter() {
        let config: OpenTelemetryConfig = parse_yaml(
            indoc::indoc! {"
                tracer_provider:
                  processors:
                    - batch:
                        exporter:
                          datadog_otlp_grpc:
                            api_key: test-api-key
                            endpoint: https://trace-otlp.intake.datadoghq.eu:4317
            "},
            &Default::default(),
        )
        .unwrap();

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