use std::collections::HashMap; use std::path::PathBuf; use codex_utils_absolute_path::AbsolutePathBuf; pub(crate) const STATSIG_OTLP_HTTP_ENDPOINT: &str = "https://ab.chatgpt.com/otlp/v1/metrics"; pub(crate) const STATSIG_API_KEY_HEADER: &str = "statsig-api-key"; pub(crate) const STATSIG_API_KEY: &str = "client-MkRuleRQBd6qakfnDYqJVR9JuXcY57Ljly3vi5JVUIO"; pub(crate) fn resolve_exporter(exporter: &OtelExporter) -> OtelExporter { match exporter { OtelExporter::Statsig => { if cfg!(test) || cfg!(feature = "disable-default-metrics-exporter") { return OtelExporter::None; } OtelExporter::OtlpHttp { endpoint: STATSIG_OTLP_HTTP_ENDPOINT.to_string(), headers: HashMap::from([( STATSIG_API_KEY_HEADER.to_string(), STATSIG_API_KEY.to_string(), )]), protocol: OtelHttpProtocol::Json, tls: None, } } _ => exporter.clone(), } } #[derive(Clone, Debug)] pub struct OtelSettings { pub environment: String, pub service_name: String, pub service_version: String, pub codex_home: PathBuf, pub exporter: OtelExporter, pub trace_exporter: OtelExporter, pub metrics_exporter: OtelExporter, } #[derive(Clone, Debug)] pub enum OtelHttpProtocol { /// HTTP protocol with binary protobuf Binary, /// HTTP protocol with JSON payload Json, } #[derive(Clone, Debug, Default)] pub struct OtelTlsConfig { pub ca_certificate: Option, pub client_certificate: Option, pub client_private_key: Option, } #[derive(Clone, Debug)] pub enum OtelExporter { None, /// Statsig metrics ingestion exporter using Codex-internal defaults. /// /// This is intended for metrics only. Statsig, OtlpGrpc { endpoint: String, headers: HashMap, tls: Option, }, OtlpHttp { endpoint: String, headers: HashMap, protocol: OtelHttpProtocol, tls: Option, }, }