mod common;
use std::sync::atomic::Ordering;
use common::pgwire_harness::TestServer;
#[tokio::test]
async fn database_qps_counter_increments_after_queries() {
let (server, db_a) = TestServer::with_database("metrics_a").await;
server
.exec("CREATE COLLECTION doc_a (id STRING PRIMARY KEY, v STRING) WITH (engine='document_schemaless')")
.await
.unwrap();
server
.exec("INSERT INTO doc_a (id, v) VALUES ('k1', 'hello')")
.await
.unwrap();
server
.exec("SELECT id, v FROM doc_a WHERE id = 'k1'")
.await
.unwrap();
let counter_a = server.shared.database_metrics.get_or_create(&db_a);
let qps_a = counter_a.qps_total.load(Ordering::Relaxed);
assert!(
qps_a > 0,
"database '{db_a}' should have a non-zero QPS counter after queries, got {qps_a}"
);
}
#[tokio::test]
async fn two_databases_have_independent_qps_counters() {
let (server, db_a) = TestServer::with_database("metrics_db_a").await;
let db_b_unique = format!(
"metrics_db_b_{}",
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_millis())
.unwrap_or(0)
);
server
.client
.simple_query(&format!("CREATE DATABASE {db_b_unique}"))
.await
.unwrap();
server
.client
.simple_query(&format!("USE DATABASE {db_b_unique}"))
.await
.unwrap();
server
.exec("CREATE COLLECTION doc_b (id STRING PRIMARY KEY) WITH (engine='kv')")
.await
.unwrap();
server
.exec("INSERT INTO doc_b (id) VALUES ('x')")
.await
.unwrap();
let counter_b = server.shared.database_metrics.get_or_create(&db_b_unique);
let qps_b = counter_b.qps_total.load(Ordering::Relaxed);
assert!(
qps_b > 0,
"database '{db_b_unique}' should have a non-zero QPS counter, got {qps_b}"
);
let counter_a = server.shared.database_metrics.get_or_create(&db_a);
let qps_a = counter_a.qps_total.load(Ordering::Relaxed);
assert!(
qps_b >= qps_a,
"db_b (qps={qps_b}) should have at least as many counted queries as db_a setup (qps={qps_a})"
);
}
#[tokio::test]
async fn tenant_quota_metrics_non_zero_under_load() {
let ts = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_millis())
.unwrap_or(0);
let db_name = format!("metrics_load_{ts}");
let (server, _db) = TestServer::with_database(&db_name).await;
let col = format!("kv_load_{ts}");
server
.exec(&format!(
"CREATE COLLECTION {col} (id STRING PRIMARY KEY, v STRING) WITH (engine='kv')"
))
.await
.unwrap();
for i in 0..5_u32 {
let key = format!("k{i}");
let val = format!("v{i}");
server
.exec(&format!(
"INSERT INTO {col} (id, v) VALUES ('{key}', '{val}')"
))
.await
.unwrap_or(()); }
let tenants = server.shared.tenants.lock().unwrap();
let mut any_requests = false;
for (_, usage, _) in tenants.iter_usage() {
if usage.total_requests > 0 {
any_requests = true;
break;
}
}
drop(tenants);
assert!(
any_requests,
"TenantIsolation should have tracked at least one request"
);
}