pub use opentelemetry;
pub use opentelemetry_sdk;
pub use tracing;
pub use tracing_opentelemetry;
pub use tracing_subscriber;
use opentelemetry::trace::SpanKind;
use opentelemetry::KeyValue;
use opentelemetry_sdk::trace::{RandomIdGenerator, Sampler, SdkTracerProvider};
use opentelemetry_sdk::Resource;
use tracing::Span;
use tracing_opentelemetry::OpenTelemetrySpanExt;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
pub fn init_tracing(_service_name: &str) -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::from_default_env())
.with(tracing_subscriber::fmt::layer())
.try_init()
.map_err(|e| Box::new(e) as Box<dyn std::error::Error>)?;
Ok(())
}
pub fn create_tracer_provider(service_name: &str) -> SdkTracerProvider {
let resource = Resource::builder()
.with_attributes([KeyValue::new("service.name", service_name.to_string())])
.build();
SdkTracerProvider::builder()
.with_sampler(Sampler::AlwaysOn)
.with_id_generator(RandomIdGenerator::default())
.with_resource(resource)
.build()
}
pub fn task_span(task_name: &str, task_id: &str) -> Span {
tracing::info_span!(
"task.execute",
task.name = task_name,
task.id = task_id,
otel.kind = ?SpanKind::Consumer
)
}
pub fn publish_span(task_name: &str, task_id: &str) -> Span {
tracing::info_span!(
"task.publish",
task.name = task_name,
task.id = task_id,
otel.kind = ?SpanKind::Producer
)
}
pub fn extract_trace_context(headers: &std::collections::HashMap<String, String>) {
use opentelemetry::propagation::TextMapPropagator;
use opentelemetry_sdk::propagation::TraceContextPropagator;
let propagator = TraceContextPropagator::new();
let context = propagator.extract(headers);
let _ = tracing::Span::current().set_parent(context);
}
pub fn inject_trace_context(headers: &mut std::collections::HashMap<String, String>) {
use opentelemetry::propagation::TextMapPropagator;
use opentelemetry_sdk::propagation::TraceContextPropagator;
let propagator = TraceContextPropagator::new();
let context = tracing::Span::current().context();
propagator.inject_context(&context, headers);
}