1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, Default, Serialize, Deserialize)]
4pub struct IngestSummary {
5 pub events_received: u64,
6 pub events_rejected: u64,
7 pub events_sent_by_producers: u64,
8 pub batches_flushed: u64,
9 pub rows_emitted: u64,
10 pub max_batch_rows: u64,
11 pub wall_time_ms: u128,
12 pub cancelled: bool,
13}
14
15#[derive(Clone, Debug, Default, Serialize, Deserialize)]
16pub struct QuerySummary {
17 pub query_type: String,
18 pub candidate_partitions: u64,
19 pub pruned_by_time: u64,
20 pub pruned_by_kind: u64,
21 pub scanned_partitions: u64,
22 pub scanned_rows: u64,
23 pub returned_rows: u64,
24 pub latency_ms: f64,
25}
26
27#[derive(Clone, Debug, Default, Serialize, Deserialize)]
28pub struct RunSummary {
29 pub command: String,
30 pub ingest: Option<IngestSummary>,
31 pub query: Option<QuerySummary>,
32 pub extra: Vec<(String, String)>,
33}
34
35impl RunSummary {
36 pub fn new(command: impl Into<String>) -> Self {
37 Self {
38 command: command.into(),
39 ..Default::default()
40 }
41 }
42
43 pub fn with_ingest(mut self, ingest: IngestSummary) -> Self {
44 self.ingest = Some(ingest);
45 self
46 }
47
48 pub fn with_query(mut self, query: QuerySummary) -> Self {
49 self.query = Some(query);
50 self
51 }
52
53 pub fn note(mut self, key: impl Into<String>, value: impl ToString) -> Self {
54 self.extra.push((key.into(), value.to_string()));
55 self
56 }
57}