Session infrastructure: OpenRouter + tree-split reducer + observer→LLM Team + scrum_applier #11
@ -69,6 +69,11 @@ struct QueryResponse {
|
|||||||
columns: Vec<ColumnInfo>,
|
columns: Vec<ColumnInfo>,
|
||||||
rows: serde_json::Value,
|
rows: serde_json::Value,
|
||||||
row_count: usize,
|
row_count: usize,
|
||||||
|
// Elapsed wall time from handler entry to response. Required for
|
||||||
|
// audit-log parity — gateway's audit row previously stored null here.
|
||||||
|
// Scrum iter 9 finding, populated from std::time::Instant captured
|
||||||
|
// at the top of execute_query / paged_query.
|
||||||
|
latency_ms: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
@ -115,6 +120,7 @@ async fn execute_query(
|
|||||||
State(state): State<QueryState>,
|
State(state): State<QueryState>,
|
||||||
Json(req): Json<QueryRequest>,
|
Json(req): Json<QueryRequest>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
|
let started = std::time::Instant::now();
|
||||||
tracing::info!("executing query: {}", req.sql);
|
tracing::info!("executing query: {}", req.sql);
|
||||||
|
|
||||||
if let Some(reason) = sql_policy_check(&state.truth, &req.sql) {
|
if let Some(reason) = sql_policy_check(&state.truth, &req.sql) {
|
||||||
@ -129,6 +135,7 @@ async fn execute_query(
|
|||||||
columns: vec![],
|
columns: vec![],
|
||||||
rows: serde_json::Value::Array(vec![]),
|
rows: serde_json::Value::Array(vec![]),
|
||||||
row_count: 0,
|
row_count: 0,
|
||||||
|
latency_ms: started.elapsed().as_millis() as u64,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,6 +154,7 @@ async fn execute_query(
|
|||||||
columns,
|
columns,
|
||||||
rows,
|
rows,
|
||||||
row_count,
|
row_count,
|
||||||
|
latency_ms: started.elapsed().as_millis() as u64,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
Err(e) => Err((StatusCode::BAD_REQUEST, e)),
|
Err(e) => Err((StatusCode::BAD_REQUEST, e)),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user