Skip to content

Commit 3b444d3

Browse files
committed
test(query_result): added metadata tests
Added tests around query response metadata: 1. execution info upon exception 2. metadata basic verification (state) 3. basic tracing verification based on: com.datastax.oss.driver.core.session.ExceptionIT com.datastax.oss.driver.core.metadata.MetadataIT com.datastax.oss.driver.core.cql.QueryTraceIT
1 parent f1de757 commit 3b444d3

File tree

1 file changed

+142
-2
lines changed

1 file changed

+142
-2
lines changed

scylla/tests/integration/query_result.rs

Lines changed: 142 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
1+
use std::collections::HashSet;
2+
use std::env;
3+
use std::sync::Arc;
4+
15
use assert_matches::assert_matches;
26
use futures::TryStreamExt;
3-
use scylla::errors::PagerExecutionError;
7+
use scylla::client::session_builder::SessionBuilder;
8+
use scylla::errors::{ExecutionError, PagerExecutionError, RequestAttemptError};
9+
use scylla::observability::history::{HistoryCollector, StructuredHistory};
10+
use scylla::observability::tracing::TracingInfo;
411
use scylla::{
512
batch::{Batch, BatchType},
613
client::session::Session,
714
query::Query,
815
};
916
use scylla_cql::frame::request::query::{PagingState, PagingStateResponse};
17+
use scylla_proxy::{Condition, RequestReaction, RequestRule, ShardAwareness};
18+
use uuid::Uuid;
1019

11-
use crate::utils::{create_new_session_builder, setup_tracing, unique_keyspace_name, PerformDDL};
20+
use crate::utils::{
21+
create_new_session_builder, setup_tracing, test_with_3_node_cluster, unique_keyspace_name,
22+
PerformDDL,
23+
};
1224

1325
const PAGE_SIZE: i32 = 100;
1426
const ROWS_PER_PARTITION: i32 = 1000;
@@ -295,3 +307,131 @@ async fn execute_iter_serialization_error() {
295307
Err(PagerExecutionError::SerializationError(_))
296308
)
297309
}
310+
311+
#[tokio::test]
312+
#[ntest::timeout(60000)]
313+
#[cfg(not(scylla_cloud_tests))]
314+
async fn should_expose_execution_info_on_exceptions() {
315+
setup_tracing();
316+
let res = test_with_3_node_cluster(
317+
ShardAwareness::Unaware,
318+
|proxy_uris, translation_map, mut running_proxy| async move {
319+
let session: Session = SessionBuilder::new()
320+
.known_node(proxy_uris[0].as_str())
321+
.address_translator(Arc::new(translation_map))
322+
.build()
323+
.await
324+
.unwrap();
325+
326+
let forge_error_rule = RequestRule(Condition::True, RequestReaction::forge().invalid());
327+
running_proxy.running_nodes[0]
328+
.change_request_rules(Some(vec![forge_error_rule.clone()]));
329+
running_proxy.running_nodes[1]
330+
.change_request_rules(Some(vec![forge_error_rule.clone()]));
331+
running_proxy.running_nodes[2]
332+
.change_request_rules(Some(vec![forge_error_rule.clone()]));
333+
334+
let mut query = Query::from("select * from foo");
335+
let history_listener = Arc::new(HistoryCollector::new());
336+
query.set_history_listener(history_listener.clone());
337+
let err = session
338+
.query_unpaged(query, &[])
339+
.await
340+
.expect_err("expecting error");
341+
let structured_history: StructuredHistory = history_listener.clone_structured_history();
342+
343+
assert_matches!(
344+
err,
345+
ExecutionError::LastAttemptError(RequestAttemptError::DbError(_, _))
346+
);
347+
assert_eq!(structured_history.requests.len(), 1);
348+
running_proxy
349+
},
350+
)
351+
.await;
352+
353+
match res {
354+
Ok(()) => (),
355+
Err(err) => panic!("{}", err),
356+
}
357+
}
358+
359+
#[tokio::test]
360+
#[ntest::timeout(60000)]
361+
#[cfg(not(scylla_cloud_tests))]
362+
async fn test_session_should_have_metadata() {
363+
setup_tracing();
364+
let session = create_new_session_builder().build().await.unwrap();
365+
let state = session.get_cluster_state();
366+
let keys = ["SCYLLA_URI", "SCYLLA_URI2", "SCYLLA_URI3"];
367+
let expected_addresses: HashSet<String> = keys
368+
.iter()
369+
.map(|key| env::var(key).unwrap_or_else(|_| panic!("{} not set", key)))
370+
.collect();
371+
372+
let got_addresses: HashSet<String> = state
373+
.get_nodes_info()
374+
.iter()
375+
.map(|node| node.address.to_string())
376+
.collect();
377+
378+
assert_eq!(
379+
got_addresses, expected_addresses,
380+
"Cluster node addresses do not match environment variables"
381+
);
382+
}
383+
384+
#[tokio::test]
385+
async fn test_should_not_have_tracing_id_when_tracing_disabled() {
386+
setup_tracing();
387+
let session = create_new_session_builder().build().await.unwrap();
388+
let query: Query = Query::new("SELECT release_version FROM system.local");
389+
390+
let result = session.query_unpaged(query, &[]).await.unwrap();
391+
let tracing_id: Option<Uuid> = result.tracing_id();
392+
assert!(tracing_id.is_none());
393+
}
394+
395+
#[tokio::test]
396+
async fn test_should_fetch_trace_when_tracing_enabled() {
397+
let session = create_new_session_builder().build().await.unwrap();
398+
399+
let mut query = Query::from("SELECT release_version FROM system.local");
400+
query.set_tracing(true);
401+
402+
let result = session.query_unpaged(query, &[]).await.unwrap();
403+
let tracing_id: Option<Uuid> = result.tracing_id();
404+
assert!(tracing_id.is_some());
405+
let tracing_info: TracingInfo = session
406+
.get_tracing_info(&tracing_id.unwrap())
407+
.await
408+
.unwrap();
409+
410+
// Verify trace information is present and has expected format
411+
assert!(!tracing_info.events.is_empty());
412+
413+
// Check if the request type matches
414+
assert_eq!(tracing_info.request.unwrap(), "Execute CQL3 query");
415+
416+
// Verify duration is positive
417+
assert!(tracing_info.duration.unwrap() > 0);
418+
419+
// Verify started_at timestamp is present
420+
assert!(tracing_info.started_at.unwrap().0 > 0);
421+
422+
// Check parameters
423+
assert!(tracing_info
424+
.parameters
425+
.clone()
426+
.unwrap()
427+
.contains_key("consistency_level"));
428+
assert!(tracing_info.parameters.unwrap().contains_key("query"));
429+
430+
// Check events
431+
for event in tracing_info.events {
432+
assert!(!event.activity.clone().unwrap().is_empty());
433+
assert!(event.source.is_some());
434+
assert!(event.source_elapsed.unwrap() >= 0);
435+
assert!(!event.activity.unwrap().is_empty());
436+
}
437+
}

0 commit comments

Comments
 (0)