scylla/observability/
tracing.rs

1use crate::value::CqlTimestamp;
2use crate::DeserializeRow;
3use itertools::Itertools;
4use scylla_cql::value::CqlTimeuuid;
5use std::collections::HashMap;
6use std::net::IpAddr;
7
8/// Tracing info retrieved from `system_traces.sessions`
9/// with all events from `system_traces.events`
10#[derive(Debug, DeserializeRow, Clone, PartialEq, Eq)]
11#[scylla(crate = "crate")]
12pub struct TracingInfo {
13    pub client: Option<IpAddr>,
14    pub command: Option<String>,
15    pub coordinator: Option<IpAddr>,
16    pub duration: Option<i32>,
17    pub parameters: Option<HashMap<String, String>>,
18    pub request: Option<String>,
19    /// started_at is a timestamp - time since unix epoch
20    pub started_at: Option<CqlTimestamp>,
21
22    #[scylla(skip)]
23    pub events: Vec<TracingEvent>,
24}
25
26/// A single event happening during a traced query
27#[derive(Debug, DeserializeRow, Clone, PartialEq, Eq)]
28#[scylla(crate = "crate")]
29pub struct TracingEvent {
30    pub event_id: CqlTimeuuid,
31    pub activity: Option<String>,
32    pub source: Option<IpAddr>,
33    pub source_elapsed: Option<i32>,
34    pub thread: Option<String>,
35}
36
37impl TracingInfo {
38    /// Returns a list of unique nodes involved in the query
39    pub fn nodes(&self) -> Vec<IpAddr> {
40        self.events
41            .iter()
42            .filter_map(|e| e.source)
43            .unique()
44            .collect()
45    }
46}
47
48// A query used to query TracingInfo from system_traces.sessions
49pub(crate) const TRACES_SESSION_QUERY_STR: &str =
50    "SELECT client, command, coordinator, duration, parameters, request, started_at \
51    FROM system_traces.sessions WHERE session_id = ?";
52
53// A query used to query TracingEvent from system_traces.events
54pub(crate) const TRACES_EVENTS_QUERY_STR: &str =
55    "SELECT event_id, activity, source, source_elapsed, thread \
56    FROM system_traces.events WHERE session_id = ?";