Skip to main content

fast_telemetry/
lib.rs

1//! Fast, thread-sharded counters and histograms for high-performance telemetry.
2//!
3//! OpenTelemetry counters use atomic operations with global synchronization,
4//! which causes cache-line bouncing across cores. This crate provides
5//! thread-local sharded counters that:
6//!
7//! - Increment with no cross-thread contention (just a thread-local write)
8//! - Are cache-line padded to avoid false sharing (using crossbeam's CachePadded)
9//! - Aggregate on read (sum all shards)
10//!
11//! # Labeled Metrics
12//!
13//! For dimensional metrics (counters/gauges/histograms broken down by label),
14//! use the `Labeled*` types with a `LabelEnum` implementation. These provide
15//! O(1) lookup via array indexing instead of HashMap lookups.
16//!
17//! ```ignore
18//! use fast_telemetry::{LabeledCounter, LabelEnum};
19//!
20//! #[derive(Copy, Clone, Debug)]
21//! enum HttpMethod { Get, Post, Put, Delete }
22//!
23//! impl LabelEnum for HttpMethod { /* ... */ }
24//!
25//! let counter: LabeledCounter<HttpMethod> = LabeledCounter::new(4);
26//! counter.inc(HttpMethod::Get);  // O(1) array index, no hashing
27//! ```
28
29mod export;
30pub(crate) mod internal;
31mod metric;
32pub mod span;
33mod temporality;
34
35pub use export::text::{DogStatsDExport, PrometheusExport};
36
37// These helpers are public only because the ExportMetrics proc macro generates
38// code that calls them. They are not part of the public API and may change
39// without notice.
40#[doc(hidden)]
41pub mod __macro_support {
42    pub use crate::export::text::{
43        __write_dogstatsd, __write_dogstatsd_distribution, __write_dogstatsd_distribution_delta,
44        __write_dogstatsd_distribution_delta_dynamic,
45        __write_dogstatsd_distribution_delta_dynamic_pairs, __write_dogstatsd_distribution_dynamic,
46        __write_dogstatsd_dynamic, __write_dogstatsd_dynamic_pairs, __write_dogstatsd_with_label,
47        FastFormat,
48    };
49}
50pub use metric::{
51    Counter, Distribution, DistributionSnapshot, DynamicCounter, DynamicCounterSeries,
52    DynamicDistribution, DynamicDistributionSeries, DynamicGauge, DynamicGaugeI64,
53    DynamicGaugeI64Series, DynamicGaugeSeries, DynamicHistogram, DynamicHistogramSeries,
54    DynamicHistogramSeriesView, DynamicLabelSet, Gauge, GaugeF64, Histogram, HistogramSnapshot,
55    LabelEnum, LabeledCounter, LabeledGauge, LabeledHistogram, LabeledSampledTimer, MaxGauge,
56    MaxGaugeF64, MetricKind, MetricLabel, MetricLabels, MetricLabelsIter, MetricMeta,
57    MetricVisitor, MinGauge, MinGaugeF64, SampledTimer, SampledTimerGuard,
58};
59#[cfg(feature = "eviction")]
60pub use metric::{advance_cycle, current_cycle};
61pub use span::{
62    CompletedSpan, Span, SpanAttribute, SpanCollector, SpanEvent, SpanId, SpanKind, SpanStatus,
63    SpanValue, TraceId, current_span_id, current_trace_id,
64};
65pub use temporality::Temporality;
66
67#[cfg(feature = "otlp")]
68pub use export::otlp::OtlpExport;
69
70#[cfg(feature = "clickhouse")]
71pub use export::clickhouse::{ClickHouseExport, ClickHouseMetricBatch};
72
73#[cfg(feature = "macros")]
74pub use fast_telemetry_macros::{ExportMetrics, LabelEnum as DeriveLabel};
75
76// Internal compatibility aliases for moved modules.
77pub(crate) use internal::exp_buckets;
78pub(crate) use internal::thread_id;
79pub(crate) use metric::label;
80
81#[cfg(feature = "otlp")]
82pub mod otlp {
83    pub use crate::export::otlp::*;
84}
85
86#[cfg(feature = "clickhouse")]
87pub mod clickhouse {
88    pub use crate::export::clickhouse::*;
89}