mirror of
https://github.com/openai/codex.git
synced 2026-04-24 14:45:27 +00:00
Summary of changes:
- Adds a new feature flag: runtime_metrics
- Declared in core/src/features.rs
- Added to core/config.schema.json
- Wired into OTEL init in core/src/otel_init.rs
- Enables on-demand runtime metric snapshots in OTEL
- Adds runtime_metrics: bool to otel/src/config.rs
- Enables experimental custom reader features in otel/Cargo.toml
- Adds snapshot/reset/summary APIs in:
- otel/src/lib.rs
- otel/src/metrics/client.rs
- otel/src/metrics/config.rs
- otel/src/metrics/error.rs
- Defines metric names and a runtime summary builder
- New files:
- otel/src/metrics/names.rs
- otel/src/metrics/runtime_metrics.rs
- Summarizes totals for:
- Tool calls
- API requests
- SSE/streaming events
- Instruments metrics collection in OTEL manager
- otel/src/traces/otel_manager.rs now records:
- API call counts + durations
- SSE event counts + durations (success/failure)
- Tool call metrics now use shared constants
- Surfaces runtime metrics in the TUI
- Resets runtime metrics at turn start in tui/src/chatwidget.rs
- Displays metrics in the final separator line in
tui/src/history_cell.rs
- Adds tests
- New OTEL tests:
- otel/tests/suite/snapshot.rs
- otel/tests/suite/runtime_summary.rs
- New TUI test:
- final_message_separator_includes_runtime_metrics in
tui/src/history_cell.rs
Scope:
- 19 files changed
- ~652 insertions, 38 deletions
<img width="922" height="169" alt="Screenshot 2026-01-30 at 4 11 34 PM"
src="https://github.com/user-attachments/assets/1efd754d-a16d-4564-83a5-f4442fd2f998"
/>
100 lines
3.4 KiB
Rust
100 lines
3.4 KiB
Rust
use crate::config::Config;
|
|
use crate::config::types::OtelExporterKind as Kind;
|
|
use crate::config::types::OtelHttpProtocol as Protocol;
|
|
use crate::default_client::originator;
|
|
use crate::features::Feature;
|
|
use codex_otel::config::OtelExporter;
|
|
use codex_otel::config::OtelHttpProtocol;
|
|
use codex_otel::config::OtelSettings;
|
|
use codex_otel::config::OtelTlsConfig as OtelTlsSettings;
|
|
use codex_otel::otel_provider::OtelProvider;
|
|
use std::error::Error;
|
|
|
|
/// Build an OpenTelemetry provider from the app Config.
|
|
///
|
|
/// Returns `None` when OTEL export is disabled.
|
|
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(),
|
|
codex_home: config.codex_home.clone(),
|
|
environment: config.otel.environment.to_string(),
|
|
exporter,
|
|
trace_exporter,
|
|
metrics_exporter,
|
|
runtime_metrics,
|
|
})
|
|
}
|
|
|
|
/// Filter predicate for exporting only Codex-owned events via OTEL.
|
|
/// Keeps events that originated from codex_otel module
|
|
pub fn codex_export_filter(meta: &tracing::Metadata<'_>) -> bool {
|
|
meta.target().starts_with("codex_otel")
|
|
}
|