use chrono;
use uuid;
use ::logs::types::Message;
use ::metadata;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub enum APMTypes {
Span(Span),
}
pub type SpanID = uuid::Uuid;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Span {
parent_id: Option<SpanID>,
id: SpanID,
name: Message,
start: chrono::DateTime<chrono::Utc>,
end: Option<chrono::DateTime<chrono::Utc>>,
logs: Vec<Message>,
labels: metadata::Labels,
error: bool,
warn: bool,
}
impl Default for Span {
fn default() -> Self {
Self::new("Unknown".to_string())
}
}
impl Span {
pub fn new(name: Message) -> Self {
Span {
parent_id: None,
id: uuid::Uuid::new_v4(),
name: name,
start: chrono::Utc::now(),
end: None,
logs: Vec::new(),
labels: metadata::Labels::new(),
error: false,
warn: false,
}
}
pub fn error(&mut self) {
self.error = true;
}
pub fn warn(&mut self) {
self.warn = true;
}
pub fn end(&mut self) {
self.end = Some(chrono::Utc::now());
}
pub fn log(&mut self, log: &Message) {
self.logs.push(log.clone());
}
pub fn child(&self, name: &Message) -> Self {
let mut child = Self::new(name.clone());
child.parent_id = Some(self.id);
child
}
pub fn child_from_parent_id(name: &Message, parent_id: SpanID) -> Self {
let mut child = Self::new(name.clone());
child.parent_id = Some(parent_id);
child
}
}
impl APMTypes {}