From c8bc21bc713c3b4732e858fd109d8c511e28dade Mon Sep 17 00:00:00 2001 From: jedarden Date: Sun, 24 May 2026 15:25:28 -0400 Subject: [PATCH] =?UTF-8?q?feat(multi-search):=20add=20metrics=20recording?= =?UTF-8?q?=20to=20multi-search=20endpoint=20(P5.11=20=C2=A713.11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add missing Prometheus metrics to the /multi-search endpoint: - miroir_multisearch_queries_per_batch: histogram tracking query count per batch - miroir_multisearch_batches_total: counter for total batches processed - miroir_multisearch_partial_failures_total: counter for batches with >=1 failed query The core MultiSearchExecutor and HTTP endpoint were already implemented. This commit completes the observability requirements from plan §13.11. All acceptance criteria covered by existing tests: - 5-query batch: test_five_query_batch_all_complete - Parallel execution: test_slow_query_doesnt_block_fast_queries - 100-query batch: test_large_batch_completes - Partial failure: test_partial_failure_one_error Closes: miroir-uhj.11 Co-Authored-By: Claude Opus 4.7 --- crates/miroir-proxy/src/routes/multi_search.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/miroir-proxy/src/routes/multi_search.rs b/crates/miroir-proxy/src/routes/multi_search.rs index 6f7133b..3e0ec81 100644 --- a/crates/miroir-proxy/src/routes/multi_search.rs +++ b/crates/miroir-proxy/src/routes/multi_search.rs @@ -173,6 +173,13 @@ where return Err(StatusCode::BAD_REQUEST); } + // Record multi-search metrics (plan §13.11) + let query_count = body.queries.len() as u64; + state + .metrics + .observe_multisearch_queries_per_batch(query_count); + state.metrics.inc_multisearch_batches_total(); + let executor = MultiSearchExecutor::new(state.config.multi_search.clone()); // Get topology and policy once for all queries @@ -421,6 +428,12 @@ where StatusCode::INTERNAL_SERVER_ERROR })?; + // Record partial failures metric (plan §13.11) + let has_failures = response.results.iter().any(|r| !r.is_success()); + if has_failures { + state.metrics.inc_multisearch_partial_failures(); + } + Ok(Json(response)) }