#![cfg(feature = "telemetry")]
use absurder_sql::telemetry::{Metrics, TelemetryConfig};
#[test]
fn test_metrics_new_creates_registry() {
let metrics = Metrics::new().expect("Failed to create metrics");
let metric_families = metrics.registry().gather();
assert_eq!(
metric_families.len(),
19,
"All 19 metrics should be registered"
);
}
#[test]
fn test_metrics_counters_exist() {
let metrics = Metrics::new().expect("Failed to create metrics");
let metric_families = metrics.registry().gather();
assert_eq!(
metric_families.len(),
19,
"All 19 metrics should be registered"
);
}
#[test]
fn test_metrics_query_counter_increments() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.queries_total().inc();
assert_eq!(metrics.queries_total().get(), 1.0);
metrics.queries_total().inc();
assert_eq!(metrics.queries_total().get(), 2.0);
}
#[test]
fn test_metrics_error_counter_increments() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.errors_total().inc();
assert_eq!(metrics.errors_total().get(), 1.0);
}
#[test]
fn test_metrics_cache_counters() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.cache_hits().inc();
metrics.cache_hits().inc();
metrics.cache_misses().inc();
assert_eq!(metrics.cache_hits().get(), 2.0);
assert_eq!(metrics.cache_misses().get(), 1.0);
}
#[test]
fn test_metrics_query_duration_histogram() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.query_duration().observe(5.0);
metrics.query_duration().observe(10.0);
metrics.query_duration().observe(25.0);
assert_eq!(metrics.query_duration().get_sample_count(), 3);
assert_eq!(metrics.query_duration().get_sample_sum(), 40.0);
}
#[test]
fn test_metrics_indexeddb_duration_histogram() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.indexeddb_duration().observe(50.0);
metrics.indexeddb_duration().observe(100.0);
assert_eq!(metrics.indexeddb_duration().get_sample_count(), 2);
assert_eq!(metrics.indexeddb_duration().get_sample_sum(), 150.0);
}
#[test]
fn test_metrics_sync_duration_histogram() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.sync_duration().observe(200.0);
assert_eq!(metrics.sync_duration().get_sample_count(), 1);
assert_eq!(metrics.sync_duration().get_sample_sum(), 200.0);
}
#[test]
fn test_metrics_gauges() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.active_connections().set(5.0);
metrics.memory_bytes().set(1024.0 * 1024.0); metrics.storage_bytes().set(10.0 * 1024.0 * 1024.0);
assert_eq!(metrics.active_connections().get(), 5.0);
assert_eq!(metrics.memory_bytes().get(), 1024.0 * 1024.0);
assert_eq!(metrics.storage_bytes().get(), 10.0 * 1024.0 * 1024.0);
}
#[test]
fn test_metrics_gauge_increment_decrement() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.active_connections().inc();
assert_eq!(metrics.active_connections().get(), 1.0);
metrics.active_connections().inc();
assert_eq!(metrics.active_connections().get(), 2.0);
metrics.active_connections().dec();
assert_eq!(metrics.active_connections().get(), 1.0);
}
#[test]
fn test_metrics_prometheus_export() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.queries_total().inc();
metrics.errors_total().inc();
metrics.query_duration().observe(42.0);
let metric_families = metrics.registry().gather();
assert!(!metric_families.is_empty(), "Should have metrics to export");
}
#[test]
fn test_metrics_histogram_buckets() {
let metrics = Metrics::new().expect("Failed to create metrics");
metrics.query_duration().observe(1.0); metrics.query_duration().observe(5.0); metrics.query_duration().observe(10.0); metrics.query_duration().observe(50.0); metrics.query_duration().observe(100.0);
assert_eq!(metrics.query_duration().get_sample_count(), 5);
assert_eq!(metrics.query_duration().get_sample_sum(), 166.0);
}
#[test]
fn test_metrics_concurrent_access() {
use std::sync::Arc;
use std::thread;
let metrics = Arc::new(Metrics::new().expect("Failed to create metrics"));
let mut handles = vec![];
for _ in 0..10 {
let metrics_clone = Arc::clone(&metrics);
let handle = thread::spawn(move || {
for _ in 0..100 {
metrics_clone.queries_total().inc();
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
assert_eq!(metrics.queries_total().get(), 1000.0);
}
#[test]
fn test_metrics_with_config() {
let config = TelemetryConfig::new(
"test-service".to_string(),
"http://localhost:4317".to_string(),
);
let metrics = Metrics::with_config(&config).expect("Failed to create metrics");
metrics.queries_total().inc();
assert_eq!(metrics.queries_total().get(), 1.0);
}