use rand::RngCore;
pub(crate) fn generate_trace_id() -> String {
generate_non_zero_hex::<16>()
}
pub(crate) fn generate_span_id() -> String {
generate_non_zero_hex::<8>()
}
fn generate_non_zero_hex<const N: usize>() -> String {
loop {
let mut bytes = [0u8; N];
rand::thread_rng().fill_bytes(&mut bytes);
if bytes.iter().any(|byte| *byte != 0) {
return bytes.iter().map(|byte| format!("{byte:02x}")).collect();
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ids_have_expected_lengths() {
assert_eq!(generate_trace_id().len(), 32);
assert_eq!(generate_span_id().len(), 16);
}
}