feat(otel): Centralize OTEL metric names and shared tag builders (#14117)

This cleans up a bunch of metric plumbing that had started to drift.

The main change is making `codex-otel` the canonical home for shared
metric definitions and metric tag helpers. I moved the `turn/thread`
metric names that were still duplicated into the OTEL metric registry,
added a shared `metrics::tags` module for common tag keys and session
tag construction, and updated `SessionTelemetry` to build its metadata
tags through that shared path.

On the codex-core side, TTFT/TTFM now use the shared metric-name
constants instead of local string definitions. I also switched the
obvious remaining turn/thread metric callsites over to the shared
constants, and added a small helper so TTFT/TTFM can attach an optional
sanitized client.name tag from TurnContext.

This should make follow-on telemetry work less ad hoc:
- one canonical place for metric names
- one canonical place for common metric tag keys/builders
- less duplication between `codex-core` and `codex-otel`
This commit is contained in:
Owen Lin
2026-03-09 12:46:42 -07:00
committed by GitHub
Unverified
parent 6ad448b658
commit da991bdf3a
7 changed files with 156 additions and 67 deletions
+2 -1
View File
@@ -305,6 +305,7 @@ use crate::windows_sandbox::WindowsSandboxLevelExt;
use codex_async_utils::OrCancelExt;
use codex_otel::SessionTelemetry;
use codex_otel::TelemetryAuthMode;
use codex_otel::metrics::names::THREAD_STARTED_METRIC;
use codex_protocol::config_types::CollaborationMode;
use codex_protocol::config_types::Personality;
use codex_protocol::config_types::ReasoningSummary as ReasoningSummaryConfig;
@@ -1412,7 +1413,7 @@ impl Session {
};
config.features.emit_metrics(&session_telemetry);
session_telemetry.counter(
"codex.thread.started",
THREAD_STARTED_METRIC,
1,
&[(
"is_git",