packages feed

hs-opentelemetry-api-1.0.0.0: src/OpenTelemetry/Common.hs

{-# LANGUAGE NumericUnderscores #-}

module OpenTelemetry.Common (
  Timestamp (..),
  TraceFlags (..),
  OptionalTimestamp (NoTimestamp, SomeTimestamp),
  isEnded,
  optionalTimestampToMaybe,
  optionalTimestampFromMaybe,
  timestampToOptional,
  mkTimestamp,
  timestampToNanoseconds,
) where

import Data.Word (Word64, Word8)


{- | Wall-clock timestamp stored as nanoseconds since Unix epoch.
Matches the OTLP wire format directly (fixed64 nanoseconds).

@since 0.0.1.0
-}
newtype Timestamp = Timestamp Word64
  deriving (Read, Show, Eq, Ord)


{- | Contain details about the trace. Unlike TraceState values, TraceFlags are present in all traces. The current version of the specification only supports a single flag called sampled.

@since 0.0.1.0
-}
newtype TraceFlags = TraceFlags Word8
  deriving (Show, Eq, Ord)


{- | Unboxed optional timestamp. @SomeTimestamp@ stores a single unboxed
@Word64#@ directly in its closure: 2 words total vs 4 for
@Just (Timestamp ns)@.

@since 0.0.1.0
-}
data OptionalTimestamp
  = NoTimestamp
  | SomeTimestamp {-# UNPACK #-} !Word64
  deriving (Eq, Ord)


instance Show OptionalTimestamp where
  showsPrec _ NoTimestamp = showString "NoTimestamp"
  showsPrec d (SomeTimestamp ns) =
    showParen (d > 10) $
      showString "SomeTimestamp " . showsPrec 11 ns


-- | @since 0.0.1.0
isEnded :: OptionalTimestamp -> Bool
isEnded NoTimestamp = False
isEnded _ = True
{-# INLINE isEnded #-}


-- | @since 0.0.1.0
optionalTimestampToMaybe :: OptionalTimestamp -> Maybe Timestamp
optionalTimestampToMaybe NoTimestamp = Nothing
optionalTimestampToMaybe (SomeTimestamp ns) = Just (Timestamp ns)
{-# INLINE optionalTimestampToMaybe #-}


-- | @since 0.0.1.0
optionalTimestampFromMaybe :: Maybe Timestamp -> OptionalTimestamp
optionalTimestampFromMaybe Nothing = NoTimestamp
optionalTimestampFromMaybe (Just (Timestamp ns)) = SomeTimestamp ns
{-# INLINE optionalTimestampFromMaybe #-}


-- | @since 0.0.1.0
timestampToOptional :: Timestamp -> OptionalTimestamp
timestampToOptional (Timestamp ns) = SomeTimestamp ns
{-# INLINE timestampToOptional #-}


{- | Construct a 'Timestamp' from seconds and nanoseconds components.
Useful for tests and interop with @TimeSpec@-based APIs.

@since 0.0.1.0
-}
mkTimestamp :: Word64 -> Word64 -> Timestamp
mkTimestamp sec nsec = Timestamp (sec * 1_000_000_000 + nsec)
{-# INLINE mkTimestamp #-}


{- | Extract nanoseconds since epoch. Identity on the internal representation.

@since 0.0.1.0
-}
timestampToNanoseconds :: Timestamp -> Word64
timestampToNanoseconds (Timestamp ns) = ns
{-# INLINE timestampToNanoseconds #-}