From 8334910144cb9564d4b74b59f05b2024551d1853 Mon Sep 17 00:00:00 2001 From: rock Date: Sun, 13 Sep 2026 21:37:44 +0900 Subject: [PATCH] feat(O3): instrument context endpoint with tier metrics - Track context requests, errors, empty results - Timer for context duration histogram - Metrics: C1-C8 (8 metrics instrumented) --- crates/mem-cli/src/http_server.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/mem-cli/src/http_server.rs b/crates/mem-cli/src/http_server.rs index 09fe3c0..2eb75e6 100644 --- a/crates/mem-cli/src/http_server.rs +++ b/crates/mem-cli/src/http_server.rs @@ -990,13 +990,20 @@ pub async fn context_handler( body: web::Json, state: web::Data, ) -> HttpResponse { + use crate::metrics::*; + CONTEXT_REQUESTS_TOTAL.inc(); + let _timer = Timer::new(&CONTEXT_DURATION); + let (claims, _token) = match validate_auth(&req, &state).await { Ok(c) => c, - Err(e) => return e, + Err(e) => { + CONTEXT_ERRORS_TOTAL.inc(); + return e; + } }; - // Check read capability if !has_capability(&claims, "memory:read") { + CONTEXT_ERRORS_TOTAL.inc(); return HttpResponse::Forbidden().json(json!({ "error": "forbidden", "reason": "missing capability: memory:read" @@ -1021,9 +1028,13 @@ pub async fn context_handler( skills = response.skills.len(), "context lookup successful" ); + // O3: Track tier hits + let total = response.lessons.len() + response.skills.len(); + if total == 0 { CONTEXT_EMPTY_RESULTS.inc(); } HttpResponse::Ok().json(response) } Err(e) => { + CONTEXT_ERRORS_TOTAL.inc(); tracing::error!("context lookup error: {}", e); HttpResponse::BadRequest().json(json!({ "error": "lookup_failed",