use itertools::Itertools;
use scylla_cql::frame::value::CqlTimeuuid;
use std::collections::HashMap;
use std::net::IpAddr;
use crate::cql_to_rust::{FromRow, FromRowError};
use crate::frame::response::result::Row;
use crate::frame::value::CqlTimestamp;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TracingInfo {
pub client: Option<IpAddr>,
pub command: Option<String>,
pub coordinator: Option<IpAddr>,
pub duration: Option<i32>,
pub parameters: Option<HashMap<String, String>>,
pub request: Option<String>,
pub started_at: Option<CqlTimestamp>,
pub events: Vec<TracingEvent>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TracingEvent {
pub event_id: CqlTimeuuid,
pub activity: Option<String>,
pub source: Option<IpAddr>,
pub source_elapsed: Option<i32>,
pub thread: Option<String>,
}
impl TracingInfo {
pub fn nodes(&self) -> Vec<IpAddr> {
self.events
.iter()
.filter_map(|e| e.source)
.unique()
.collect()
}
}
pub(crate) const TRACES_SESSION_QUERY_STR: &str =
"SELECT client, command, coordinator, duration, parameters, request, started_at \
FROM system_traces.sessions WHERE session_id = ?";
pub(crate) const TRACES_EVENTS_QUERY_STR: &str =
"SELECT event_id, activity, source, source_elapsed, thread \
FROM system_traces.events WHERE session_id = ?";
impl FromRow for TracingInfo {
fn from_row(row: Row) -> Result<TracingInfo, FromRowError> {
let (client, command, coordinator, duration, parameters, request, started_at) =
<(
Option<IpAddr>,
Option<String>,
Option<IpAddr>,
Option<i32>,
Option<HashMap<String, String>>,
Option<String>,
Option<CqlTimestamp>,
)>::from_row(row)?;
Ok(TracingInfo {
client,
command,
coordinator,
duration,
parameters,
request,
started_at,
events: Vec::new(),
})
}
}
impl FromRow for TracingEvent {
fn from_row(row: Row) -> Result<TracingEvent, FromRowError> {
let (event_id, activity, source, source_elapsed, thread) = <(
CqlTimeuuid,
Option<String>,
Option<IpAddr>,
Option<i32>,
Option<String>,
)>::from_row(row)?;
Ok(TracingEvent {
event_id,
activity,
source,
source_elapsed,
thread,
})
}
}