Skip to main content

LabeledCounter

Struct LabeledCounter 

Source
pub struct LabeledCounter<L: LabelEnum> { /* private fields */ }
Expand description

A counter indexed by an enum label, providing O(1) dimensional metrics.

Instead of using a HashMap to look up counters by label values, this type uses the enum variant’s index to directly access an array of counters. This eliminates hashing overhead on the hot path.

§Example

use fast_telemetry::{LabeledCounter, LabelEnum};

#[derive(Copy, Clone, Debug)]
enum HttpMethod { Get, Post, Put, Delete, Other }

impl LabelEnum for HttpMethod {
    const CARDINALITY: usize = 5;
    const LABEL_NAME: &'static str = "method";

    fn as_index(self) -> usize { self as usize }
    fn from_index(index: usize) -> Self {
        match index {
            0 => Self::Get, 1 => Self::Post, 2 => Self::Put,
            3 => Self::Delete, _ => Self::Other,
        }
    }
    fn variant_name(self) -> &'static str {
        match self {
            Self::Get => "get", Self::Post => "post", Self::Put => "put",
            Self::Delete => "delete", Self::Other => "other",
        }
    }
}

let counter: LabeledCounter<HttpMethod> = LabeledCounter::new(4);
counter.inc(HttpMethod::Get);
counter.add(HttpMethod::Post, 5);

// Iteration for export
for (label, count) in counter.iter() {
    println!("{}={}: {}", HttpMethod::LABEL_NAME, label.variant_name(), count);
}

Implementations§

Source§

impl<L: LabelEnum> LabeledCounter<L>

Source

pub fn new(shard_count: usize) -> Self

Create a new labeled counter.

shard_count is passed to each underlying Counter for thread-sharding.

Source

pub fn inc(&self, label: L)

Increment the counter for the given label by 1.

Source

pub fn add(&self, label: L, value: isize)

Add a value to the counter for the given label.

Source

pub fn get(&self, label: L) -> isize

Get the current count for a specific label.

Source

pub fn sum_all(&self) -> isize

Get the sum across all labels.

Source

pub fn iter(&self) -> impl Iterator<Item = (L, isize)> + '_

Iterate over all label/count pairs.

Used for Prometheus export.

Source

pub fn swap_all(&self) -> impl Iterator<Item = (L, isize)> + '_

Swap all counters and return label/count pairs.

Useful for delta-style metrics export.

Trait Implementations§

Source§

impl<L: LabelEnum> DogStatsDExport for LabeledCounter<L>

Source§

fn export_dogstatsd( &self, output: &mut String, name: &str, tags: &[(&str, &str)], )

Export this metric to the output string in DogStatsD format. Read more
Source§

impl<L: LabelEnum> OtlpExport for LabeledCounter<L>

Source§

fn export_otlp( &self, metrics: &mut Vec<Metric>, name: &str, description: &str, time_unix_nano: u64, )

Source§

impl<L: LabelEnum> PrometheusExport for LabeledCounter<L>

Source§

fn export_prometheus(&self, output: &mut String, name: &str, help: &str)

Export this metric to the output string. Read more

Auto Trait Implementations§

§

impl<L> Freeze for LabeledCounter<L>

§

impl<L> RefUnwindSafe for LabeledCounter<L>
where L: RefUnwindSafe,

§

impl<L> Send for LabeledCounter<L>
where L: Send,

§

impl<L> Sync for LabeledCounter<L>
where L: Sync,

§

impl<L> Unpin for LabeledCounter<L>
where L: Unpin,

§

impl<L> UnsafeUnpin for LabeledCounter<L>

§

impl<L> UnwindSafe for LabeledCounter<L>
where L: UnwindSafe,

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