Skip to main content

ObservabilityConfig

Struct ObservabilityConfig 

Source
pub struct ObservabilityConfig {
    pub max_event_bytes: usize,
    pub max_stream_events: u64,
    pub max_batch_events: Option<usize>,
    pub max_batch_hold_ms: Option<u64>,
}
Expand description

Agent-observability transcript settings from [observability]: retention bounds, and the transcript drain’s flush policy.

The two RETENTION knobs default (they guard the durable O keyspace against unbounded growth): max_event_bytes truncates one oversized transcript event before it is persisted, and max_stream_events caps how many events one (workflow, activity, attempt) stream retains (one marker record is persisted at the cap; live streaming continues).

The two FLUSH knobs have no default and are required — see Self::max_batch_events.

Fields§

§max_event_bytes: usize

Ceiling on one persisted transcript event’s serialized size, bytes.

§max_stream_events: u64

Ceiling on retained events per (workflow, activity, attempt) stream.

§max_batch_events: Option<usize>

Maximum transcript events the drain commits in ONE durable append. Required; no default — the server refuses to start without it.

Every durable commit re-persists its whole containing storage leaf as a new permanent blob, so committing one event at a time made the store cost of a run linear in event COUNT: measured 2026-08-17, a 136 KB status sweep left 73.7 MB of permanent store (540x) and a single 2,359-byte append bought a 2,303,416-byte blob. Batching divides that count by (up to) this number.

There is deliberately no shipped value: the trade between store cost and how many events one refused commit can lose is the operator’s, and an invented default would silently make it for them. Absent or zero fails startup with OBSERVABILITY_MAX_BATCH_EVENTS_REQUIRED, the same explicit-no-default guard websocket.cluster_broadcast_capacity uses.

§max_batch_hold_ms: Option<u64>

How long, in milliseconds, the drain may hold a PARTIAL batch open waiting for it to fill. Required; no default — but 0 is a valid, meaningful setting: never wait, commit whatever is already queued.

This is the only knob here that touches durability timing. Transcript events already wait in an in-memory queue before they are committed, and everything queued there is lost if the process dies; this value bounds how much LONGER an event may wait, and therefore how much transcript a kill-9 can cost. It buys commits: at 0 only events that genuinely arrived together share a commit. The O keyspace is observability, never workflow replay authority, which is why the trade is offered at all.

Absent fails startup with OBSERVABILITY_MAX_BATCH_HOLD_MS_REQUIRED.

Implementations§

Source§

impl ObservabilityConfig

Source

pub fn with_flush_policy( max_batch_events: usize, max_batch_hold_ms: u64, ) -> Self

The default retention bounds with the REQUIRED flush policy stated.

For an embedder that builds its ServerConfig in code rather than from a file: Default deliberately leaves the flush policy unruled (so a server built from it refuses to start), and this is how such a caller states its ruling in one line. max_batch_hold_ms of 0 means the drain never holds a partial batch open.

Trait Implementations§

Source§

impl Clone for ObservabilityConfig

Source§

fn clone(&self) -> ObservabilityConfig

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 ObservabilityConfig

Source§

impl Debug for ObservabilityConfig

Source§

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

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

impl Default for ObservabilityConfig

Source§

fn default() -> Self

The retention bounds fall back to their documented defaults; the flush policy does NOT — None here is “the operator has not ruled”, which the boot path turns into a refusal to start, not into a guess.

Source§

impl<'de> Deserialize<'de> for ObservabilityConfig

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for ObservabilityConfig

Source§

impl PartialEq for ObservabilityConfig

Source§

fn eq(&self, other: &ObservabilityConfig) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ObservabilityConfig

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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

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

Source§

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

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
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> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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