1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4use crate::filter::{AttrFilter, Severity, SortOrder, TimeWindow};
5use crate::model::log::LogRecord;
6use crate::model::metric::MetricPoint;
7use crate::model::span::SpanRecord;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct SearchRequest {
11 pub pattern: Option<String>,
12 pub fixed: bool,
13 pub ignore_case: bool,
14 pub service: Option<String>,
15 pub trace_id: Option<String>,
16 pub span_id: Option<String>,
17 pub severity_gte: Option<Severity>,
18 pub attr_filters: Vec<AttrFilter>,
19 pub window: TimeWindow,
20 pub sort: SortOrder,
21 pub limit: usize,
22 pub context_lines: usize,
23 pub context_seconds: Option<i64>,
24 pub count_only: bool,
25 pub include_stats: bool,
26}
27
28impl Default for SearchRequest {
29 fn default() -> Self {
30 Self {
31 pattern: None,
32 fixed: false,
33 ignore_case: false,
34 service: None,
35 trace_id: None,
36 span_id: None,
37 severity_gte: None,
38 attr_filters: Vec::new(),
39 window: TimeWindow::all(),
40 sort: SortOrder::TsAsc,
41 limit: 100,
42 context_lines: 0,
43 context_seconds: None,
44 count_only: false,
45 include_stats: false,
46 }
47 }
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, Default)]
51pub struct SearchStats {
52 pub by_service: Vec<(String, usize)>,
53 pub by_severity: Vec<(String, usize)>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct SearchResponse {
58 pub total_matches: usize,
59 pub returned: usize,
60 pub records: Vec<LogRecord>,
61 pub stats: Option<SearchStats>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub enum LogContextMode {
66 None,
67 Bounded,
68 All,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct TraceRequest {
73 pub trace_id: String,
74 pub root_span_id: Option<String>,
75 pub logs: LogContextMode,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct LogsContextMeta {
80 pub policy: String,
81 pub limit: usize,
82 pub truncated: bool,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct TraceResponse {
87 pub trace_id: String,
88 pub spans: Vec<SpanRecord>,
89 pub logs: Vec<LogRecord>,
90 pub context: LogsContextMeta,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct SpanRequest {
95 pub trace_id: String,
96 pub span_id: String,
97 pub logs: LogContextMode,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct SpanResponse {
102 pub span: SpanRecord,
103 pub logs: Vec<LogRecord>,
104 pub context: LogsContextMeta,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108pub struct TracesRequest {
109 pub service: Option<String>,
110 pub status: Option<String>,
111 pub window: TimeWindow,
112 pub sort: SortOrder,
113 pub limit: usize,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct TraceListItem {
118 pub trace_id: String,
119 pub root_name: String,
120 pub duration_ms: i64,
121 pub span_count: usize,
122 pub status: String,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct MetricsRequest {
127 pub name: String,
128 pub service: Option<String>,
129 pub window: TimeWindow,
130 pub group_by: Option<String>,
131 pub agg: Option<String>,
132 pub limit: usize,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct MetricSeries {
137 pub group: String,
138 pub value: f64,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
142pub struct MetricsResponse {
143 pub points: Vec<MetricPoint>,
144 pub series: Vec<MetricSeries>,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct MetricsListRequest {
149 pub service: Option<String>,
150 pub window: TimeWindow,
151 pub limit: usize,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize)]
155pub struct MetricNameItem {
156 pub name: String,
157 pub count: usize,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize)]
161pub struct MetricsListResponse {
162 pub metrics: Vec<MetricNameItem>,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize)]
166pub struct StatusResponse {
167 pub db_path: String,
168 pub db_size_bytes: u64,
169 pub logs_count: usize,
170 pub spans_count: usize,
171 pub metrics_count: usize,
172 pub oldest_ts: Option<DateTime<Utc>>,
173 pub newest_ts: Option<DateTime<Utc>>,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize)]
177pub struct QueryHandle {
178 pub handle: String,
179}