use crate::{
sdk,
trace::{Event, Link, SpanContext, SpanId, SpanKind, StatusCode, TraceError},
};
use async_trait::async_trait;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
use std::borrow::Cow;
use std::fmt::Debug;
use std::sync::Arc;
use std::time::SystemTime;
pub mod stdout;
pub type ExportResult = Result<(), TraceError>;
#[async_trait]
pub trait SpanExporter: Send + Debug {
async fn export(&mut self, batch: Vec<SpanData>) -> ExportResult;
fn shutdown(&mut self) {}
}
#[cfg_attr(feature = "serialize", derive(Deserialize, Serialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct SpanData {
pub span_context: SpanContext,
pub parent_span_id: SpanId,
pub span_kind: SpanKind,
pub name: Cow<'static, str>,
pub start_time: SystemTime,
pub end_time: SystemTime,
pub attributes: sdk::trace::EvictedHashMap,
pub events: sdk::trace::EvictedQueue<Event>,
pub links: sdk::trace::EvictedQueue<Link>,
pub status_code: StatusCode,
pub status_message: Cow<'static, str>,
pub resource: Option<Arc<sdk::Resource>>,
#[cfg_attr(feature = "serialize", serde(skip))]
pub instrumentation_lib: sdk::InstrumentationLibrary,
}
#[cfg(feature = "serialize")]
#[cfg(test)]
mod tests {
use super::*;
use crate::trace::{TraceFlags, TraceId, TraceState};
#[test]
fn test_serialise() {
let trace_id = 7;
let span_id = 99;
let trace_flags = TraceFlags::default();
let remote = false;
let span_context = SpanContext::new(
TraceId::from_u128(trace_id),
SpanId::from_u64(span_id),
trace_flags,
remote,
TraceState::default(),
);
let parent_span_id = 1;
let span_kind = SpanKind::Client;
let name = "foo/bar baz 人?!".into();
let start_time = crate::time::now();
let end_time = crate::time::now();
let capacity = 3;
let attributes = sdk::trace::EvictedHashMap::new(capacity, 0);
let events = sdk::trace::EvictedQueue::new(capacity);
let links = sdk::trace::EvictedQueue::new(capacity);
let status_code = StatusCode::Ok;
let status_message = "".into();
let resource = None;
let span_data = SpanData {
span_context,
parent_span_id: SpanId::from_u64(parent_span_id),
span_kind,
name,
start_time,
end_time,
attributes,
events,
links,
status_code,
status_message,
resource,
instrumentation_lib: sdk::InstrumentationLibrary::new("", None),
};
let encoded: Vec<u8> = bincode::serialize(&span_data).unwrap();
let decoded: SpanData = bincode::deserialize(&encoded[..]).unwrap();
assert_eq!(span_data, decoded);
}
}