diff --git a/crates/client-api/src/lib.rs b/crates/client-api/src/lib.rs index 0cb21d75f0e..2a9f4af8bfd 100644 --- a/crates/client-api/src/lib.rs +++ b/crates/client-api/src/lib.rs @@ -84,6 +84,10 @@ impl Host { // We need a header for query results let mut header = vec![]; + let sql_start = std::time::Instant::now(); + let sql_span = + tracing::trace_span!("execute_sql", total_duration = tracing::field::Empty,).entered(); + let rows = sql::execute::run( // Returns an empty result set for mutations db, @@ -101,13 +105,20 @@ impl Host { } })?; + let total_duration = sql_start.elapsed(); + sql_span.record("total_duration", tracing::field::debug(total_duration)); + // Turn the header into a `ProductType` let schema = header .into_iter() .map(|(col_name, col_type)| ProductTypeElement::new(col_type, Some(col_name))) .collect(); - Ok(vec![StmtResultJson { schema, rows }]) + Ok(vec![StmtResultJson { + schema, + rows, + total_duration_micros: total_duration.as_micros() as u64, + }]) }, ) .await diff --git a/crates/client-api/src/routes/database.rs b/crates/client-api/src/routes/database.rs index 5b3cd1ade17..4de259effe2 100644 --- a/crates/client-api/src/routes/database.rs +++ b/crates/client-api/src/routes/database.rs @@ -1,3 +1,5 @@ +use std::time::Duration; + use crate::auth::{ anon_auth_middleware, SpacetimeAuth, SpacetimeEnergyUsed, SpacetimeExecutionDurationMicros, SpacetimeIdentity, SpacetimeIdentityToken, @@ -385,7 +387,12 @@ where .ok_or(StatusCode::NOT_FOUND)?; let json = host.exec_sql(auth, database, body).await?; - Ok(axum::Json(json)) + let total_duration = json.iter().fold(0, |acc, x| acc + x.total_duration_micros); + + Ok(( + TypedHeader(SpacetimeExecutionDurationMicros(Duration::from_micros(total_duration))), + axum::Json(json), + )) } #[derive(Deserialize)] diff --git a/crates/core/src/json/client_api.rs b/crates/core/src/json/client_api.rs index 6aae36fc57d..e300d9193af 100644 --- a/crates/core/src/json/client_api.rs +++ b/crates/core/src/json/client_api.rs @@ -5,4 +5,5 @@ use spacetimedb_lib::{ProductType, ProductValue}; pub struct StmtResultJson { pub schema: ProductType, pub rows: Vec, + pub total_duration_micros: u64, }