Skip to main content

CounterSet

Struct CounterSet 

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

A grouped set of related sharded counters.

Use CounterSet when one hot-path operation commonly updates several counters together, such as request count, bytes processed, and cache hits. The counters share the same shard row, so updates by the same thread touch a compact row while rows for different shards remain padded apart to avoid false sharing.

CounterSet still supports individual counter updates by index. Resolve those indexes once during construction and keep direct handles/indexes on the hot path.

use fast_telemetry::CounterSet;

const REQUESTS: usize = 0;
const BYTES: usize = 1;
const HITS: usize = 2;

let counters = CounterSet::new(4, 3);
counters.inc(REQUESTS);
counters.add(BYTES, 4096);
counters.inc(HITS);

assert_eq!(counters.sum(REQUESTS), 1);
assert_eq!(counters.sum(BYTES), 4096);
assert_eq!(counters.sum(HITS), 1);

Implementations§

Source§

impl CounterSet

Source

pub fn new(shards: usize, counters: usize) -> Self

Creates a grouped counter set with counters counters per shard.

Shards are padded by row instead of by cell, so related counters updated by the same thread sit contiguously while adjacent shard rows remain separated enough to avoid false sharing.

Source

pub fn len(&self) -> usize

Returns the number of counters in each shard row.

Source

pub fn is_empty(&self) -> bool

Returns true if there are no counters in the set.

Source

pub fn inc(&self, counter_idx: usize)

Increments one counter in the current thread’s shard row.

Source

pub fn add(&self, counter_idx: usize, value: isize)

Adds a value to one counter in the current thread’s shard row.

Source

pub fn inc_all(&self)

Increments all counters in the current thread’s shard row.

Source

pub fn add_all(&self, value: isize)

Adds the same value to all counters in the current thread’s shard row.

Source

pub fn add_indices(&self, indexes: &[usize], value: isize)

Adds the same value to selected counters in the current thread’s shard row.

Source

pub fn add_index_values(&self, updates: &[(usize, isize)])

Adds one value per selected counter in the current thread’s shard row.

Source

pub fn add_all_indexed(&self, value: isize)

Adds the same value to all counters in the current thread’s shard row.

Source

pub fn add_values(&self, values: &[isize])

Adds one value per counter in the current thread’s shard row.

Source

pub fn sum(&self, counter_idx: usize) -> isize

Returns the sum for one counter across all shards.

Source

pub fn sum_all(&self) -> isize

Returns the sum of all counters across all shards.

Source

pub fn snapshot(&self) -> Vec<isize>

Returns one value per counter in index order.

Source

pub fn sum_and_reset(&self, counter_idx: usize) -> isize

Resets one counter to zero and returns its previous sum.

§Eventual Consistency

Writes that occur concurrently with sum_and_reset() may be attributed to the next window rather than the current one. No counts are lost; they simply shift to the next export window.

Source

pub fn snapshot_and_reset(&self) -> Vec<isize>

Returns one value per counter in index order, then resets all counters.

§Eventual Consistency

Writes that occur concurrently with snapshot_and_reset() may be attributed to the next window rather than the current one. No counts are lost; they simply shift to the next export window.

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> 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> 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, 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