synd-support 0.4.0

shared support utilities for syndicationd crates
Documentation
use opentelemetry::propagation::TextMapCompositePropagator;
use opentelemetry_sdk::propagation::{BaggagePropagator, TraceContextPropagator};

pub mod http {
    use crate::o11y::opentelemetry::extension::BaggageExt as _;
    use opentelemetry_http::{HeaderExtractor, HeaderInjector};

    /// Inject current opentelemetry context into given headers
    pub fn inject(cx: &opentelemetry::Context, headers: &mut reqwest::header::HeaderMap) {
        opentelemetry::global::get_text_map_propagator(|propagator| {
            propagator.inject_context(cx, &mut HeaderInjector(headers));
        });
    }
    pub fn inject_with_baggage<T, I>(
        cx: &opentelemetry::Context,
        headers: &mut reqwest::header::HeaderMap,
        baggage: T,
    ) where
        T: IntoIterator<Item = I>,
        I: Into<opentelemetry::baggage::KeyValueMetadata>,
    {
        inject(&cx.with_baggage(baggage), headers);
    }

    pub fn extract(headers: &axum::http::HeaderMap) -> opentelemetry::Context {
        opentelemetry::global::get_text_map_propagator(|propagator| {
            propagator.extract(&HeaderExtractor(headers))
        })
    }
}

/// Configure `TraceContext` and Baggage propagator then set as global propagator
pub fn init_propagation() {
    let trace_propagator = TraceContextPropagator::new();
    let baggage_propagator = BaggagePropagator::new();
    let composite_propagator = TextMapCompositePropagator::new(vec![
        Box::new(trace_propagator),
        Box::new(baggage_propagator),
    ]);

    opentelemetry::global::set_text_map_propagator(composite_propagator);
}