//! Request counts exclude disabled plugins, account-switch discards, and cancellations. //! Auth retries keep the furthest request outcome reached; each completed wait/load is timed. //! Skill-snapshot lookups are not requests. Clear events include already-empty caches. //! Tags never contain configuration data. use std::time::Duration; pub(crate) const LOAD_DURATION: &str = "codex.plugins.loaded_cache.load.duration_ms"; pub(crate) const WAIT_DURATION: &str = "codex.plugins.loaded_cache.wait.duration_ms"; pub(crate) enum RequestOutcome { Hit, HitAfterWait, Load, } impl RequestOutcome { pub(crate) fn record(self) { let Some(metrics) = codex_otel::global() else { return; }; let outcome = match self { Self::Hit => "hit", Self::HitAfterWait => "hit_after_wait", Self::Load => "load", }; let _ = metrics.counter( "codex.plugins.loaded_cache.request", /*inc*/ 1, &[("outcome", outcome)], ); } } pub(crate) fn record_duration(name: &'static str, duration: Duration) { if let Some(metrics) = codex_otel::global() { let _ = metrics.record_duration(name, duration, &[]); } } pub(crate) fn record_event(event: &'static str) { if let Some(metrics) = codex_otel::global() { let _ = metrics.counter( "codex.plugins.loaded_cache.event", /*inc*/ 1, &[("event", event)], ); } }