Skip to main content

AtomicTokenCounter

Struct AtomicTokenCounter 

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

Process-wide token counter. Cheap record on the hot path; richer per-model stats guarded by an async-compatible mutex and accessed best-effort via try_lock.

Prefer the super::super::TOKEN_USAGE singleton — constructing your own instance is only useful in tests.

§Examples

use codetether_agent::telemetry::AtomicTokenCounter;

let c = AtomicTokenCounter::new();
c.record(100, 50);
let (p, o, t) = c.get();
assert_eq!((p, o, t), (100, 50, 150));

Implementations§

Source§

impl AtomicTokenCounter

Source

pub fn record_model_usage(&self, model: &str, prompt: u64, completion: u64)

Record per-model usage without prompt-cache data.

Source

pub fn record_model_usage_with_cache( &self, model: &str, prompt: u64, completion: u64, cache_read: u64, cache_write: u64, )

Record a completion’s usage including prompt-cache read/write tokens.

prompt is the non-cached input tokens billed at full price. cache_read is billed at 10% of input price; cache_write at 125% on Anthropic / Bedrock. See crate::provider::pricing.

§Examples
use codetether_agent::telemetry::AtomicTokenCounter;

let c = AtomicTokenCounter::new();
c.record_model_usage_with_cache("claude-sonnet-4", 500, 200, 1_000, 0);
assert_eq!(c.cache_usage_for("claude-sonnet-4"), (1_000, 0));
assert_eq!(c.last_prompt_tokens_for("claude-sonnet-4"), Some(1_500));
Source

pub fn cache_usage_for(&self, model: &str) -> (u64, u64)

Cumulative (cache_read, cache_write) token counts for a model. Returns (0, 0) if the map is contended or the model is unknown.

Source

pub fn last_prompt_tokens_for(&self, model: &str) -> Option<u64>

Most recent turn’s full prompt token count (including cache) for a model.

This reflects the current in-flight context size (what the next request will send), not cumulative lifetime tokens. Returns None if no completion has been recorded for the model yet.

Source§

impl AtomicTokenCounter

Source

pub fn new() -> Self

Construct a zeroed counter.

Source

pub fn record(&self, prompt: u64, completion: u64)

Record a single completion. Increments all four global atomics relaxed-ordering — correctness only requires eventual visibility.

Source

pub fn get(&self) -> (u64, u64, u64)

Return the global (prompt, completion, total) triple.

Source

pub fn global_snapshot(&self) -> GlobalTokenSnapshot

Snapshot the global counters into a plain-data struct.

Source

pub fn model_snapshots(&self) -> Vec<TokenUsageSnapshot>

Snapshot every tracked model’s usage. Returns an empty Vec if the per-model map is currently contended.

Trait Implementations§

Source§

impl Debug for AtomicTokenCounter

Source§

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

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

impl Default for AtomicTokenCounter

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> 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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ServiceExt for T

Source§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Apply a transformation to the response body. Read more
Source§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using HTTP status codes. Read more
Source§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using gRPC headers. Read more
Source§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Follow redirect resposes using the Standard policy. 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
Source§

impl<T> ErasedDestructor for T
where T: 'static,