mod backend;
mod blobs;
mod duckdb_store;
mod fanout;
pub mod models;
mod remote;
mod search;
pub use backend::{TaelBackend, WalSink};
pub use blobs::BlobStore;
pub use duckdb_store::DuckDbStore;
pub use fanout::FanoutStore;
pub use remote::{RemoteStore, RemoteWalSink, WAL_EPOCH_HEADER};
pub use search::SearchIndex;
use anyhow::Result;
use models::{
AnomalyReport, CorrelateReport, LogQuery, LogRecord, MetricPoint, MetricQuery, ServiceInfo,
Span, SummaryReport, TraceComment, TraceQuery,
};
pub trait Store: Send + Sync {
fn insert_spans(&self, spans: &[Span]) -> Result<()>;
fn query_traces(&self, query: &TraceQuery) -> Result<Vec<Span>>;
fn get_trace(&self, trace_id: &str) -> Result<Vec<Span>>;
fn list_services(&self) -> Result<Vec<ServiceInfo>>;
fn add_comment(
&self,
trace_id: &str,
span_id: Option<&str>,
author: &str,
body: &str,
) -> Result<TraceComment>;
fn get_comments(&self, trace_id: &str) -> Result<Vec<TraceComment>>;
fn insert_logs(&self, logs: &[LogRecord]) -> Result<()>;
fn query_logs(&self, query: &LogQuery) -> Result<Vec<LogRecord>>;
fn insert_metrics(&self, metrics: &[MetricPoint]) -> Result<()>;
fn query_metrics(&self, query: &MetricQuery) -> Result<Vec<MetricPoint>>;
fn query_summary(&self, last_seconds: i64, service: Option<&str>) -> Result<SummaryReport>;
fn query_anomalies(
&self,
current_seconds: i64,
baseline_seconds: i64,
service: Option<&str>,
) -> Result<AnomalyReport>;
fn query_correlate(&self, trace_id: &str) -> Result<Option<CorrelateReport>>;
fn query_sql(&self, sql: &str) -> Result<Vec<serde_json::Value>>;
fn health(&self) -> Result<()> {
Ok(())
}
fn flush(&self) -> Result<()> {
Ok(())
}
fn apply_framed_wal(&self, _framed: &[u8]) -> Result<()> {
anyhow::bail!("this store does not accept WAL replication")
}
}