use crate::tracing::attributes::AttributeValue;
use opentelemetry::global::{self, BoxedSpan, BoxedTracer};
use opentelemetry::trace::{Span, Tracer};
use std::sync::Arc;
pub struct TracingContext {
tracer: Arc<BoxedTracer>,
span: BoxedSpan,
name: String,
}
impl TracingContext {
pub fn new(name: &str) -> Self {
let tracer = global::tracer("dbnexus");
let name = name.to_string(); let span = tracer.start(name.clone());
Self {
tracer: Arc::new(tracer),
span,
name,
}
}
pub fn span_name(&self) -> &str {
&self.name
}
pub fn start_child(&self, name: &str) -> Self {
let name = name.to_string(); let span = self.tracer.span_builder(name.clone()).start(&*self.tracer);
Self {
tracer: self.tracer.clone(),
span,
name,
}
}
pub fn set_attribute(&mut self, key: &str, value: AttributeValue) {
self.span.set_attribute(value.to_key_value(key));
}
pub fn set_attributes(&mut self, attributes: Vec<(String, AttributeValue)>) {
for (key, value) in attributes {
self.set_attribute(&key, value);
}
}
pub fn record_error(&mut self, error: &dyn std::error::Error) {
use opentelemetry::trace::Status;
let error_message = error.to_string();
self.span.set_status(Status::Error {
description: error_message.into(),
});
}
}
impl Drop for TracingContext {
fn drop(&mut self) {
self.span.end();
}
}