packages feed

hs-opentelemetry-sdk-0.0.3.6: src/OpenTelemetry/Trace/Id/Generator/Default.hs

{-# LANGUAGE CPP #-}

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

{- |
 Module      :  OpenTelemetry.Trace.Id.Generator.Default
 Copyright   :  (c) Ian Duncan, 2021
 License     :  BSD-3
 Maintainer  :  Ian Duncan
 Stability   :  experimental
 Portability :  non-portable (GHC extensions)

 A reasonably performant out of the box implementation of random span and trace id generation.
-}
module OpenTelemetry.Trace.Id.Generator.Default (
  defaultIdGenerator,
) where

import OpenTelemetry.Trace.Id.Generator (IdGenerator (..))
import System.IO.Unsafe (unsafePerformIO)
import System.Random.Stateful


{- | The default generator for trace and span ids.

 @since 0.1.0.0
-}
defaultIdGenerator :: IdGenerator
defaultIdGenerator = unsafePerformIO $ do
  genBase <- initStdGen
  let (spanIdGen, traceIdGen) = split genBase
  sg <- newAtomicGenM spanIdGen
  tg <- newAtomicGenM traceIdGen
  pure $
    IdGenerator
      { generateSpanIdBytes = uniformByteStringM 8 sg
      , generateTraceIdBytes = uniformByteStringM 16 tg
      }
{-# NOINLINE defaultIdGenerator #-}