#[cfg(feature = "otel")]
use crate::context::Context;
#[cfg(feature = "otel")]
use opentelemetry::trace::{Span, TraceContextExt, Tracer};
#[cfg(feature = "otel")]
use opentelemetry::Context as OtelContext;
#[cfg(feature = "otel")]
use tracing_opentelemetry::OpenTelemetrySpanExt;
#[cfg(feature = "otel")]
pub fn extract_context_from_otel() -> Context {
let span = tracing::Span::current();
let otel_ctx = span.context();
let span_ref = otel_ctx.span();
let span_context = span_ref.span_context();
let mut ctx = Context::new();
if span_context.is_valid() {
ctx = ctx.with_trace_id(format!("{:032x}", span_context.trace_id()));
ctx = ctx.with_span_id(format!("{:016x}", span_context.span_id()));
}
ctx
}
#[cfg(feature = "otel")]
pub fn set_otel_context(context: &Context) {
if let Some(ref trace_id) = context.trace_id {
}
if let Some(ref span_id) = context.span_id {
}
}
#[cfg(feature = "otel")]
pub fn init_otel_tracing(service_name: &str) -> Result<(), Box<dyn std::error::Error>> {
use opentelemetry::global;
use opentelemetry_sdk::trace::TracerProvider;
use opentelemetry_sdk::Resource;
use opentelemetry_semantic_conventions::resource::SERVICE_NAME;
let resource = Resource::new(vec![SERVICE_NAME.string(service_name.to_string())]);
let provider = TracerProvider::builder()
.with_resource(resource)
.build();
global::set_tracer_provider(provider);
Ok(())
}
#[cfg(test)]
mod tests {
#[test]
#[cfg(feature = "otel")]
fn test_extract_context() {
let _ctx = super::extract_context_from_otel();
}
}