{-# LANGUAGE CPP #-}
module OpenTelemetry.Trace.Id.Generator.Default (
defaultIdGenerator,
) where
import OpenTelemetry.Trace.Id.Generator (IdGenerator (..))
import System.IO.Unsafe (unsafePerformIO)
import System.Random.MWC
#if MIN_VERSION_random(1,2,0)
import System.Random.Stateful
#else
import Data.ByteString.Random
#endif
defaultIdGenerator :: IdGenerator
#if MIN_VERSION_random(1,2,0)
defaultIdGenerator :: IdGenerator
defaultIdGenerator = forall a. IO a -> a
unsafePerformIO forall a b. (a -> b) -> a -> b
$ do
Gen RealWorld
g <- IO GenIO
createSystemRandom
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ IdGenerator
{ generateSpanIdBytes :: IO ByteString
generateSpanIdBytes = forall g (m :: * -> *). StatefulGen g m => Int -> g -> m ByteString
uniformByteStringM Int
8 Gen RealWorld
g
, generateTraceIdBytes :: IO ByteString
generateTraceIdBytes = forall g (m :: * -> *). StatefulGen g m => Int -> g -> m ByteString
uniformByteStringM Int
16 Gen RealWorld
g
}
{-# NOINLINE defaultIdGenerator #-}
#else
defaultIdGenerator = unsafePerformIO $ do
g <- createSystemRandom
pure $ IdGenerator
{ generateSpanIdBytes = randomGen g 8
, generateTraceIdBytes = randomGen g 16
}
{-# NOINLINE defaultIdGenerator #-}
#endif