use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Span {
pub trace_id: String,
pub span_id: String,
pub parent_span_id: Option<String>,
pub service: String,
pub operation: String,
pub start_time: DateTime<Utc>,
pub end_time: DateTime<Utc>,
pub duration_ms: f64,
pub status: SpanStatus,
pub attributes: HashMap<String, String>,
pub events: Vec<SpanEvent>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum SpanStatus {
Ok,
Error,
Unset,
}
impl std::fmt::Display for SpanStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SpanStatus::Ok => write!(f, "ok"),
SpanStatus::Error => write!(f, "error"),
SpanStatus::Unset => write!(f, "unset"),
}
}
}
impl SpanStatus {
pub fn from_str(s: &str) -> Self {
match s.to_lowercase().as_str() {
"ok" => SpanStatus::Ok,
"error" => SpanStatus::Error,
_ => SpanStatus::Unset,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpanEvent {
pub name: String,
pub timestamp: DateTime<Utc>,
pub attributes: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraceComment {
pub id: String,
pub trace_id: String,
pub span_id: Option<String>,
pub author: String,
pub body: String,
pub created_at: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TraceQuery {
pub service: Option<String>,
pub operation: Option<String>,
pub min_duration_ms: Option<f64>,
pub max_duration_ms: Option<f64>,
pub status: Option<String>,
pub last_seconds: Option<i64>,
pub limit: Option<u32>,
}