datadoghq 0.2.2

Datadog APM-compatible tracer and logger
Documentation
use crate::{new_span_data::NewSpanData, sql_info::SqlInfo, SpanId, TraceId};
use chrono::{DateTime, Duration, Utc};
use std::collections::HashMap;

#[derive(Clone)]
pub struct Span {
    id: SpanId,
    trace_id: TraceId,
    name: String,
    resource: String,
    parent_id: Option<SpanId>,
    start: DateTime<Utc>,
    duration: Duration,
    sql: Option<SqlInfo>,
    tags: HashMap<String, String>,
}

impl Span {
    pub fn new_with_id_name(id: SpanId, name: String, source: Span) -> Self {
        Span { id, name, ..source }
    }
    pub fn new_with_parent_id(parent_id: Option<SpanId>, source: Span) -> Self {
        Span {
            parent_id,
            ..source
        }
    }
    pub fn new_with_duration(duration: Duration, source: Span) -> Self {
        Span { duration, ..source }
    }

    pub fn id(&self) -> SpanId {
        self.id
    }
    pub fn trace_id(&self) -> TraceId {
        self.trace_id
    }
    pub fn name(&self) -> &str {
        &self.name
    }
    pub fn resource(&self) -> &str {
        &self.resource
    }
    pub fn parent_id(&self) -> Option<SpanId> {
        self.parent_id
    }
    pub fn start(&self) -> DateTime<Utc> {
        self.start
    }
    pub fn duration(&self) -> Duration {
        self.duration
    }
    pub fn sql(&self) -> Option<&SqlInfo> {
        self.sql.as_ref()
    }
    pub fn tags(&self) -> &HashMap<String, String> {
        &self.tags
    }
    pub fn add_tag(&mut self, key: String, value: String) {
        self.tags.insert(key, value);
    }
}

impl From<NewSpanData> for Span {
    fn from(new_span_data: NewSpanData) -> Self {
        Span {
            id: new_span_data.id(),
            trace_id: new_span_data.trace_id(),
            name: new_span_data.name().to_owned(),
            resource: new_span_data.resource().to_owned(),
            parent_id: None,
            start: new_span_data.start(),
            duration: Duration::seconds(0),
            sql: None,
            tags: HashMap::default(),
        }
    }
}