feat: structured error tags and latency logging for tool search
loading diff…
search_error_* fields to all search error logs so Datadog monitors can filter by @search_error_severity:critical or @search_error_category:reranker instead of regex on message stringssearch_latency_* fields at key completion points (overall search, hybrid search, reranker, plan/vector search) for latency alertingsearch_latency log linesas const satisfies and typed SearchLatencyBreakdown interface to prevent typos at call sites# Critical: search completely broken (pages)
env:production @search_error_severity:critical
# Warning: degraded but functional
env:production @search_error_severity:warning
# Latency alerts
env:production @search_latency_phase:overall p95(@search_latency_ms) > 3000
env:production @search_latency_phase:reranker p95(@search_latency_ms) > 5000
| Severity | Tag | When |
|---|---|---|
| CRITICAL | search_race.total_failure | Both tool + plan search failed |
| CRITICAL | hybrid_search.failure | Hybrid search returned Err |
| CRITICAL | hybrid_search.task_failure | Per-task search failure |
| CRITICAL | reranker.all_strategies_failed | All reranker strategies exhausted |
| WARNING | search_race.tool_search_failed | Tool search failed, plan may succeed |
| WARNING | search_race.plan_search_failed | Plan search failed, tool may succeed |
| WARNING | vector_search.failure | Plan vector search error |
| WARNING | reranker.provider_unavailable | Preferred provider not available |
| WARNING | reranker.provider_cascade | Primary provider transient error |
| WARNING | reranker.empty_response | Empty LLM response |
| WARNING | reranker.parse_failure | Response parse/validation failed |
| WARNING | reranker.fallback | Fell back to unranked results |
search_error_* fields appear in Datadog logssearch_latency_* fields are facetable as measures in Datadog@search_error_severity and @search_latency_ms🤖 Generated with Claude Code