{-# LANGUAGE OverloadedStrings #-} module OpenTelemetry.Common where import qualified Data.HashMap.Strict as HM import qualified Data.Text as T import Data.Word import OpenTelemetry.Exporter import OpenTelemetry.SpanContext import System.Clock type Timestamp = Word64 data TagValue = StringTagValue !T.Text | BoolTagValue !Bool | IntTagValue !Int | DoubleTagValue !Double deriving (Eq, Show) class ToTagValue a where toTagValue :: a -> TagValue instance ToTagValue String where toTagValue = StringTagValue . T.pack instance ToTagValue T.Text where toTagValue = StringTagValue instance ToTagValue Bool where toTagValue = BoolTagValue instance ToTagValue Int where toTagValue = IntTagValue data Span = Span { spanContext :: {-# UNPACK #-} !SpanContext, spanOperation :: T.Text, spanThreadId :: Word32, spanStartedAt :: !Timestamp, spanFinishedAt :: !Timestamp, spanTags :: !(HM.HashMap T.Text TagValue), spanEvents :: [SpanEvent], spanStatus :: !SpanStatus, spanParentId :: Maybe SpanId } deriving (Show, Eq) spanTraceId :: Span -> TraceId spanTraceId Span {spanContext = SpanContext _ tid} = tid spanId :: Span -> SpanId spanId Span {spanContext = SpanContext sid _} = sid data SpanEvent = SpanEvent { spanEventTimestamp :: !Timestamp, spanEventKey :: !T.Text, spanEventValue :: !T.Text } deriving (Show, Eq) data SpanStatus = OK deriving (Show, Eq) data Event = Event T.Text Timestamp deriving (Show, Eq) data SpanProcessor = SpanProcessor { onStart :: Span -> IO (), onEnd :: Span -> IO () } data OpenTelemetryConfig = OpenTelemetryConfig { otcSpanExporter :: Exporter Span } now64 :: IO Timestamp now64 = do TimeSpec secs nsecs <- getTime Realtime pure $! fromIntegral secs * 1_000_000_000 + fromIntegral nsecs