diff --git a/codex-rs/core/src/otel_init.rs b/codex-rs/core/src/otel_init.rs
index f9bf75e8acb..5ba714959ca 100644
--- a/codex-rs/core/src/otel_init.rs
+++ b/codex-rs/core/src/otel_init.rs
@@ -6,7 +6,7 @@ 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::traces::otel_provider::OtelProvider;
+use codex_otel::otel_provider::OtelProvider;
use std::error::Error;
/// Build an OpenTelemetry provider from the app Config.
diff --git a/codex-rs/otel/README.md b/codex-rs/otel/README.md
index 79f4e8f45c9..0194eea7f29 100644
--- a/codex-rs/otel/README.md
+++ b/codex-rs/otel/README.md
@@ -2,21 +2,22 @@
`codex-otel` is the OpenTelemetry integration crate for Codex. It provides:
-- Trace/log exporters and tracing subscriber layers (`codex_otel::traces::otel_provider`).
+- Trace/log/metrics exporters and tracing subscriber layers (`codex_otel::otel_provider`).
- A structured event helper (`codex_otel::OtelManager`).
- OpenTelemetry metrics support via OTLP exporters (`codex_otel::metrics`).
- A metrics facade on `OtelManager` so tracing + metrics share metadata.
## Tracing and logs
-Create an OTEL provider from `OtelSettings`, then attach its layers to your
-`tracing_subscriber` registry:
+Create an OTEL provider from `OtelSettings`. The provider also configures
+metrics (when enabled), then attach its layers to your `tracing_subscriber`
+registry:
```rust
use codex_otel::config::OtelExporter;
use codex_otel::config::OtelHttpProtocol;
use codex_otel::config::OtelSettings;
-use codex_otel::traces::otel_provider::OtelProvider;
+use codex_otel::otel_provider::OtelProvider;
use tracing_subscriber::prelude::*;
let settings = OtelSettings {
diff --git a/codex-rs/otel/src/lib.rs b/codex-rs/otel/src/lib.rs
index 25607623204..dc53fd01191 100644
--- a/codex-rs/otel/src/lib.rs
+++ b/codex-rs/otel/src/lib.rs
@@ -1,5 +1,6 @@
pub mod config;
pub mod metrics;
+pub mod otel_provider;
pub mod traces;
mod otlp;
@@ -11,7 +12,7 @@ use crate::metrics::Result as MetricsResult;
use crate::metrics::timer::Timer;
use crate::metrics::validation::validate_tag_key;
use crate::metrics::validation::validate_tag_value;
-use crate::traces::otel_provider::OtelProvider;
+use crate::otel_provider::OtelProvider;
use codex_protocol::ThreadId;
use serde::Serialize;
use std::time::Duration;
diff --git a/codex-rs/otel/src/traces/otel_provider.rs b/codex-rs/otel/src/otel_provider.rs
similarity index 99%
rename from codex-rs/otel/src/traces/otel_provider.rs
rename to codex-rs/otel/src/otel_provider.rs
index b6a542d4bda..8ad264f8a7c 100644
--- a/codex-rs/otel/src/traces/otel_provider.rs
+++ b/codex-rs/otel/src/otel_provider.rs
@@ -47,8 +47,6 @@ static TRACEPARENT_CONTEXT: OnceLock