Skip to main content

MetricsStore

Struct MetricsStore 

Source
pub struct MetricsStore { /* private fields */ }
Expand description

Thread-safe, in-memory store for per-route request metrics.

Create a single instance at server startup and share it (via Arc) with all request-handling filters. Call MetricsStore::record after each upstream request completes, and MetricsStore::snapshot to produce a serializable view for the GET /v1/metrics endpoint.

§Persistence

Metrics are currently held in memory only and are lost on process restart. This is intentional for the initial release — the consuming plugin layer (OpenClaw) can handle its own persistence if needed. A future release may back this store with a database or Redis cache.

Implementations§

Source§

impl MetricsStore

Source

pub fn new() -> Self

Creates a new, empty metrics store. The uptime clock starts now.

Source

pub fn record(&self, event: RequestMetrics)

Records a completed request into the store.

This method acquires a write-lock for a very short duration (counter increments + a Vec::push) so contention should be negligible.

Source

pub fn record_success( &self, route: String, endpoint: String, start: Instant, input_tokens: Option<u32>, output_tokens: Option<u32>, )

Records a successful generate (non-streaming) request.

This is a convenience wrapper used by provider handlers to reduce duplicated recording logic across OpenAI, Anthropic and Google filters.

Source

pub fn record_outcome( &self, route: String, endpoint: String, start: Instant, is_error: bool, )

Records a failed or stream-only request.

is_error should be true for upstream failures and false for streaming requests where token counts are unavailable.

Source

pub fn snapshot(&self) -> MetricsSnapshot

Produces a serialisable snapshot of all collected metrics.

The read-lock is held only long enough to clone raw counters and latency vectors. Expensive work (sorting for percentiles, computing averages) is performed after the lock is released so that concurrent record() calls are not blocked by a /v1/metrics request.

Trait Implementations§

Source§

impl Default for MetricsStore

Source§

fn default() -> Self

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

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> 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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

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