graphile_worker 0.11.4

High performance Rust/PostgreSQL job queue (also suitable for getting jobs generated by PostgreSQL triggers/functions out into a different work queue)
Documentation
pub(crate) use functions::{add_tracing_info, link_to_job_create_span};

#[cfg(not(any(feature = "opentelemetry_0_30", feature = "opentelemetry_0_31")))]
mod functions {
    pub(crate) fn add_tracing_info(_payload: &mut serde_json::Value) {}
    pub(crate) fn link_to_job_create_span(_payload: serde_json::Value) {}
}

#[cfg(any(feature = "opentelemetry_0_30", feature = "opentelemetry_0_31"))]
mod functions {
    #[cfg(feature = "opentelemetry_0_30")]
    use opentelemetry_30 as opentelemetry;
    #[cfg(feature = "opentelemetry_0_30")]
    use tracing_opentelemetry_30 as tracing_opentelemetry;

    use opentelemetry::trace::TraceContextExt;
    use tracing::Span;
    use tracing_opentelemetry::OpenTelemetrySpanExt;

    #[derive(Debug, serde::Serialize, serde::Deserialize)]
    struct TraceInfo {
        flags: u8,
        trace_id: String,
        span_id: String,
    }

    pub(crate) fn add_tracing_info(payload: &mut serde_json::Value) {
        if let Some(payload) = payload.as_object_mut() {
            let context = Span::current().context();
            let span = context.span();
            let span_context = span.span_context();
            if !span_context.is_valid() {
                return;
            }

            let flags = span_context.trace_flags().to_u8();
            let span_id = span_context.span_id().to_string();
            let trace_id = span_context.trace_id().to_string();

            let value = TraceInfo {
                flags,
                trace_id,
                span_id,
            };

            payload.insert("_trace".into(), serde_json::json!(value));
        }
    }

    pub(crate) fn link_to_job_create_span(payload: serde_json::Value) {
        let obj = match payload.as_object() {
            Some(obj) => obj,
            None => return,
        };
        let trace_value = match obj.get("_trace") {
            Some(value) => value,
            None => return,
        };
        let trace_info = match serde_json::from_value::<TraceInfo>(trace_value.clone()) {
            Ok(info) => info,
            Err(_) => return,
        };

        use opentelemetry::trace::{SpanContext, SpanId, TraceFlags, TraceId, TraceState};
        use tracing_opentelemetry::OpenTelemetrySpanExt;

        let trace_id = TraceId::from_hex(&trace_info.trace_id);
        let span_id = SpanId::from_hex(&trace_info.span_id);
        let trace_flags = TraceFlags::new(trace_info.flags);

        let (trace_id, span_id) = match (trace_id, span_id) {
            (Ok(trace_id), Ok(span_id)) => (trace_id, span_id),
            _ => return,
        };

        let span_context =
            SpanContext::new(trace_id, span_id, trace_flags, true, TraceState::default());

        Span::current().add_link(span_context);
    }
}