opentelemetry_sdk/trace/id_generator/
mod.rs

1use opentelemetry::trace::{SpanId, TraceId};
2use rand::{rngs, Rng, SeedableRng};
3use std::cell::RefCell;
4use std::fmt;
5
6/// Interface for generating IDs
7pub trait IdGenerator: Send + Sync + fmt::Debug {
8    /// Generate a new `TraceId`
9    fn new_trace_id(&self) -> TraceId;
10
11    /// Generate a new `SpanId`
12    fn new_span_id(&self) -> SpanId;
13}
14
15/// Default [`IdGenerator`] implementation.
16///
17/// Generates Trace and Span ids using a random number generator.
18#[derive(Clone, Debug, Default)]
19pub struct RandomIdGenerator {
20    _private: (),
21}
22
23impl IdGenerator for RandomIdGenerator {
24    fn new_trace_id(&self) -> TraceId {
25        CURRENT_RNG.with(|rng| TraceId::from(rng.borrow_mut().gen::<u128>()))
26    }
27
28    fn new_span_id(&self) -> SpanId {
29        CURRENT_RNG.with(|rng| SpanId::from(rng.borrow_mut().gen::<u64>()))
30    }
31}
32
33thread_local! {
34    /// Store random number generator for each thread
35    static CURRENT_RNG: RefCell<rngs::SmallRng> = RefCell::new(rngs::SmallRng::from_entropy());
36}