use crate::product::agent::config::Config;
use crate::product::agent::config::types::OtelExporterKind as Kind;
use crate::product::agent::config::types::OtelHttpProtocol as Protocol;
use crate::product::agent::default_client::originator;
use crate::product::agent::features::Feature;
use crate::product::otel::config::OtelExporter;
use crate::product::otel::config::OtelHttpProtocol;
use crate::product::otel::config::OtelSettings;
use crate::product::otel::config::OtelTlsConfig as OtelTlsSettings;
use crate::product::otel::otel_provider::OtelProvider;
use std::error::Error;
pub fn build_provider(
config: &Config,
service_version: &str,
service_name_override: Option<&str>,
default_analytics_enabled: bool,
) -> Result<Option<OtelProvider>, Box<dyn Error>> {
let to_otel_exporter = |kind: &Kind| match kind {
Kind::None => OtelExporter::None,
Kind::Statsig => OtelExporter::Statsig,
Kind::OtlpHttp {
endpoint,
headers,
protocol,
tls,
} => {
let protocol = match protocol {
Protocol::Json => OtelHttpProtocol::Json,
Protocol::Binary => OtelHttpProtocol::Binary,
};
OtelExporter::OtlpHttp {
endpoint: endpoint.clone(),
headers: headers
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
protocol,
tls: tls.as_ref().map(|config| OtelTlsSettings {
ca_certificate: config.ca_certificate.clone(),
client_certificate: config.client_certificate.clone(),
client_private_key: config.client_private_key.clone(),
}),
}
}
Kind::OtlpGrpc {
endpoint,
headers,
tls,
} => OtelExporter::OtlpGrpc {
endpoint: endpoint.clone(),
headers: headers
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
tls: tls.as_ref().map(|config| OtelTlsSettings {
ca_certificate: config.ca_certificate.clone(),
client_certificate: config.client_certificate.clone(),
client_private_key: config.client_private_key.clone(),
}),
},
};
let exporter = to_otel_exporter(&config.otel.exporter);
let trace_exporter = to_otel_exporter(&config.otel.trace_exporter);
let metrics_exporter = if config
.analytics_enabled
.unwrap_or(default_analytics_enabled)
{
to_otel_exporter(&config.otel.metrics_exporter)
} else {
OtelExporter::None
};
let originator = originator();
let service_name = service_name_override.unwrap_or(originator.value.as_str());
let runtime_metrics = config.features.enabled(Feature::RuntimeMetrics);
OtelProvider::from(&OtelSettings {
service_name: service_name.to_string(),
service_version: service_version.to_string(),
lha_home: config.lha_home.clone(),
environment: config.otel.environment.to_string(),
exporter,
trace_exporter,
metrics_exporter,
runtime_metrics,
})
}
pub fn codex_export_filter(meta: &tracing::Metadata<'_>) -> bool {
crate::product::otel::otel_provider::is_lha_otel_target(meta.target())
}