Skip to main content

otell_core/
query.rs

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}