use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricsQuery {
pub metric: String,
pub start: DateTime<Utc>,
pub end: DateTime<Utc>,
pub step_secs: Option<u64>,
pub label_matchers: Vec<LabelMatcher>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LabelMatcher {
pub key: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeSeriesDto {
pub labels: Value,
pub points: Vec<MetricPointDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricPointDto {
pub ts: DateTime<Utc>,
pub value: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StatCardDto {
pub label: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricsQueryResult {
pub series: Vec<TimeSeriesDto>,
pub headline: Vec<StatCardDto>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum EventExploreView {
#[default]
EventLog,
TimeSeries,
LineChart,
PieChart,
BarChart,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GridPaginationModel {
pub page: u32,
pub page_size: u32,
}
impl Default for GridPaginationModel {
fn default() -> Self {
Self {
page: 0,
page_size: 50,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum GridSortDirection {
Asc,
Desc,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GridSortItem {
pub field: String,
pub sort: GridSortDirection,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum GridLogicOperator {
#[default]
And,
Or,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum GridFilterOperator {
Equals,
DoesNotEqual,
Contains,
StartsWith,
EndsWith,
IsEmpty,
IsNotEmpty,
GreaterThan,
GreaterThanOrEqual,
LessThan,
LessThanOrEqual,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GridFilterItem {
pub field: String,
pub operator: GridFilterOperator,
pub value: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GridFilterModel {
pub items: Vec<GridFilterItem>,
#[serde(default)]
pub logic_operator: GridLogicOperator,
#[serde(default)]
pub quick_filter_values: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum PartitionKind {
Hourly,
Daily,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventQuery {
pub table: String,
pub start: DateTime<Utc>,
pub end: DateTime<Utc>,
pub partition: Option<PartitionKind>,
pub pagination: GridPaginationModel,
pub sort: Vec<GridSortItem>,
pub filter: GridFilterModel,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GridColumnDto {
pub field: String,
pub header_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventGridRow {
pub id: String,
pub ts: DateTime<Utc>,
pub fields: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventQueryResult {
pub rows: Vec<EventGridRow>,
pub columns: Vec<GridColumnDto>,
pub row_count: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EventMeasure {
Count,
Sum,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct EventAggregationSpec {
pub measure: EventMeasure,
pub measure_field: Option<String>,
pub time_bucket_secs: Option<u64>,
pub group_by_field: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventAggregateRequest {
pub table: String,
pub start: DateTime<Utc>,
pub end: DateTime<Utc>,
pub partition: Option<PartitionKind>,
pub filter: GridFilterModel,
pub view: EventExploreView,
pub aggregation: EventAggregationSpec,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SliceDto {
pub label: String,
pub value: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum EventAggregateResult {
TimeSeries {
series: Vec<TimeSeriesDto>,
headline: Vec<StatCardDto>,
},
Slices {
slices: Vec<SliceDto>,
headline: Vec<StatCardDto>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaListItem {
pub table_or_metric: String,
pub description: Option<String>,
pub logging_kind: String,
pub can_query: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaDetailDto {
pub table_or_metric: String,
pub description: Option<String>,
pub logging_kind: String,
pub version: String,
pub fields: Vec<SchemaFieldDto>,
pub can_query: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchemaFieldDto {
pub name: String,
pub rust_type: String,
pub classification: String,
}