{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE OverloadedStrings #-}
module Instana.SDK.Span.SpanType
( Registered (..)
, SpanType (SdkSpan, RegisteredSpan)
, spanName
, initialData
) where
import Data.Aeson (Value, (.=))
import qualified Data.Aeson as Aeson
import Data.String (IsString (fromString))
import Data.Text (Text)
import qualified Data.Text as T
import GHC.Generics
import Instana.SDK.Span.Span (SpanKind (EntryKind, ExitKind, IntermediateKind))
data SpanType =
SdkSpan Text
| RegisteredSpan Registered
deriving (Eq, Generic, Show)
data Registered =
HaskellWaiServer
| HaskellHttpClient
deriving (Eq, Generic, Show)
spanName :: SpanType -> Text
spanName (SdkSpan _) = "sdk"
spanName (RegisteredSpan registered) = registeredSpanName registered
registeredSpanName :: Registered -> Text
registeredSpanName HaskellWaiServer = "haskell.wai.server"
registeredSpanName HaskellHttpClient = "haskell.http.client"
initialData :: SpanKind -> SpanType -> Value
initialData kind (SdkSpan s) = initialSdkData kind s
initialData _ (RegisteredSpan _) = emptyValue
instance IsString SpanType where
fromString :: String -> SpanType
fromString s = SdkSpan $ T.pack s
initialSdkData :: SpanKind -> Text -> Value
initialSdkData kind spanName_ =
let
sdkKind :: String
sdkKind =
case kind of
EntryKind -> "entry"
ExitKind -> "exit"
IntermediateKind -> "intermediate"
in
(Aeson.object [ "sdk" .=
Aeson.object
[ "name" .= spanName_
, "type" .= sdkKind
]
]
)
emptyValue :: Value
emptyValue = Aeson.object []