Skip to main content

GroupingSpanProcessor

Struct GroupingSpanProcessor 

Source
pub struct GroupingSpanProcessor;
Expand description

A span processor that copies the trace grouping out of OpenTelemetry baggage onto every span that starts underneath it.

LLM observability backends filter on each span, not only the trace root, so a session.id on the turn’s first span leaves its children unattributable. attach_grouping puts the grouping in baggage and this turns it into attributes as each span starts; only the keys of crate::attrs::GROUPING_KEYS are copied, so an application’s own baggage never leaks into telemetry. Hold the attach_grouping guard for the whole turn: a span that already started cannot gain attributes.

use opentelemetry::trace::{Tracer, TracerProvider};
use opentelemetry_sdk::trace::SdkTracerProvider;
use turnframe_core::ids::{AccountId, ConversationId};
use turnframe_telemetry::otel::{GroupingSpanProcessor, attach_grouping};
use turnframe_telemetry::tracing::TraceGrouping;

let provider = SdkTracerProvider::builder()
    .with_span_processor(GroupingSpanProcessor::new())
    // .with_span_processor(your_exporting_processor)
    .build();
let tracer = provider.tracer("turnframe");

let grouping = TraceGrouping::for_conversation(ConversationId::nil())
    .with_account(&AccountId::from("acct-1"))
    .with_environment("production");

// Attach first, then open spans: every span started while the guard is
// alive carries session.id, user.id, deployment.environment.name.
let _guard = attach_grouping(&grouping);
let mut span = tracer.start("turnframe.turn");
span.end();

Implementations§

Source§

impl GroupingSpanProcessor

Source

pub const fn new() -> Self

Builds the processor. It holds no state and never blocks.

Trait Implementations§

Source§

impl Clone for GroupingSpanProcessor

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for GroupingSpanProcessor

Source§

impl Debug for GroupingSpanProcessor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for GroupingSpanProcessor

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl SpanProcessor for GroupingSpanProcessor

Source§

fn on_end(&self, _span: SpanData)

Nothing to do: the grouping was already stamped at on_start, which is what the OpenTelemetry SDK asks for — a context read at on_end would see whatever context happens to be active, not the span’s own.

Source§

fn on_start(&self, span: &mut Span, cx: &Context)

on_start is called when a Span is started. This method is called synchronously on the thread that started the span, therefore it should not block or throw exceptions.
Source§

fn force_flush(&self) -> OTelSdkResult

Force the spans lying in the cache to be exported.
Source§

fn shutdown_with_timeout(&self, _timeout: Duration) -> OTelSdkResult

Shuts down the processor. Called when SDK is shut down. This is an opportunity for processors to do any cleanup required. Read more
Source§

fn shutdown(&self) -> Result<(), OTelSdkError>

shutdown the processor with a default timeout.
Source§

fn set_resource(&mut self, _resource: &Resource)

Set the resource for the span processor.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AsOut<T> for T
where T: Copy,

Source§

fn as_out(&mut self) -> Out<'_, T>

Returns an out reference to self.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more