{-# LANGUAGE DeriveGeneric #-}
{-|
Module      : Instana.SDK.Span.EntrySpan
Description : An entry span
-}
module Instana.SDK.Span.EntrySpan
  ( EntrySpan(..)
  , traceId
  , spanId
  , parentId
  , spanName
  , timestamp
  , errorCount
  , serviceName
  , setServiceName
  , spanData
  , addData
  , addToErrorCount
  ) where


import           Data.Aeson                    (Value)
import           Data.Text                     (Text)
import           GHC.Generics

import           Instana.SDK.Internal.Id       (Id)
import           Instana.SDK.Span.NonRootEntry (NonRootEntry)
import qualified Instana.SDK.Span.NonRootEntry as NonRootEntry
import           Instana.SDK.Span.RootEntry    (RootEntry)
import qualified Instana.SDK.Span.RootEntry    as RootEntry


-- |An entry span.
data EntrySpan =
    RootEntrySpan RootEntry
  | NonRootEntrySpan NonRootEntry
  deriving (EntrySpan -> EntrySpan -> Bool
(EntrySpan -> EntrySpan -> Bool)
-> (EntrySpan -> EntrySpan -> Bool) -> Eq EntrySpan
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EntrySpan -> EntrySpan -> Bool
$c/= :: EntrySpan -> EntrySpan -> Bool
== :: EntrySpan -> EntrySpan -> Bool
$c== :: EntrySpan -> EntrySpan -> Bool
Eq, (forall x. EntrySpan -> Rep EntrySpan x)
-> (forall x. Rep EntrySpan x -> EntrySpan) -> Generic EntrySpan
forall x. Rep EntrySpan x -> EntrySpan
forall x. EntrySpan -> Rep EntrySpan x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep EntrySpan x -> EntrySpan
$cfrom :: forall x. EntrySpan -> Rep EntrySpan x
Generic, Int -> EntrySpan -> ShowS
[EntrySpan] -> ShowS
EntrySpan -> String
(Int -> EntrySpan -> ShowS)
-> (EntrySpan -> String)
-> ([EntrySpan] -> ShowS)
-> Show EntrySpan
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EntrySpan] -> ShowS
$cshowList :: [EntrySpan] -> ShowS
show :: EntrySpan -> String
$cshow :: EntrySpan -> String
showsPrec :: Int -> EntrySpan -> ShowS
$cshowsPrec :: Int -> EntrySpan -> ShowS
Show)


-- |Accessor for the trace ID.
traceId :: EntrySpan -> Id
traceId :: EntrySpan -> Id
traceId entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry -> RootEntry -> Id
RootEntry.spanAndTraceId RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Id
NonRootEntry.traceId NonRootEntry
entry


-- |Accessor for the span ID.
spanId :: EntrySpan -> Id
spanId :: EntrySpan -> Id
spanId entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry -> RootEntry -> Id
RootEntry.spanAndTraceId RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Id
NonRootEntry.spanId NonRootEntry
entry


-- |Parent span ID.
parentId :: EntrySpan -> Maybe Id
parentId :: EntrySpan -> Maybe Id
parentId entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    _     -> Maybe Id
forall a. Maybe a
Nothing
    NonRootEntrySpan entry :: NonRootEntry
entry -> Id -> Maybe Id
forall a. a -> Maybe a
Just (Id -> Maybe Id) -> Id -> Maybe Id
forall a b. (a -> b) -> a -> b
$ NonRootEntry -> Id
NonRootEntry.parentId NonRootEntry
entry


-- |Name of span.
spanName :: EntrySpan -> Text
spanName :: EntrySpan -> Text
spanName entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry -> RootEntry -> Text
RootEntry.spanName RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Text
NonRootEntry.spanName NonRootEntry
entry


-- |Start time.
timestamp :: EntrySpan -> Int
timestamp :: EntrySpan -> Int
timestamp entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry -> RootEntry -> Int
RootEntry.timestamp RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Int
NonRootEntry.timestamp NonRootEntry
entry


-- |Error count (error that occured while this span has been active).
errorCount :: EntrySpan -> Int
errorCount :: EntrySpan -> Int
errorCount entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry -> RootEntry -> Int
RootEntry.errorCount RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Int
NonRootEntry.errorCount NonRootEntry
entry


-- |Add to the error count.
addToErrorCount :: Int -> EntrySpan -> EntrySpan
addToErrorCount :: Int -> EntrySpan -> EntrySpan
addToErrorCount increment :: Int
increment entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry ->
      RootEntry -> EntrySpan
RootEntrySpan (RootEntry -> EntrySpan) -> RootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ Int -> RootEntry -> RootEntry
RootEntry.addToErrorCount Int
increment RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry ->
      NonRootEntry -> EntrySpan
NonRootEntrySpan (NonRootEntry -> EntrySpan) -> NonRootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ Int -> NonRootEntry -> NonRootEntry
NonRootEntry.addToErrorCount Int
increment NonRootEntry
entry


-- |An optional attribute for overriding the name of the service in Instana.
serviceName :: EntrySpan -> Maybe Text
serviceName :: EntrySpan -> Maybe Text
serviceName entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan entry :: RootEntry
entry    -> RootEntry -> Maybe Text
RootEntry.serviceName RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Maybe Text
NonRootEntry.serviceName NonRootEntry
entry


-- |Override the name of the service for the associated call in Instana.
setServiceName :: Text -> EntrySpan -> EntrySpan
setServiceName :: Text -> EntrySpan -> EntrySpan
setServiceName serviceName_ :: Text
serviceName_ entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan entry :: RootEntry
entry ->
      RootEntry -> EntrySpan
RootEntrySpan (RootEntry -> EntrySpan) -> RootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ Text -> RootEntry -> RootEntry
RootEntry.setServiceName Text
serviceName_ RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry ->
      NonRootEntry -> EntrySpan
NonRootEntrySpan (NonRootEntry -> EntrySpan) -> NonRootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ Text -> NonRootEntry -> NonRootEntry
NonRootEntry.setServiceName Text
serviceName_ NonRootEntry
entry


-- |Optional additional span data.
spanData :: EntrySpan -> Value
spanData :: EntrySpan -> Value
spanData entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry -> RootEntry -> Value
RootEntry.spanData RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Value
NonRootEntry.spanData NonRootEntry
entry


-- |Add a value to the span's data section.
addData :: Value -> EntrySpan -> EntrySpan
addData :: Value -> EntrySpan -> EntrySpan
addData value :: Value
value entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan    entry :: RootEntry
entry ->
      RootEntry -> EntrySpan
RootEntrySpan (RootEntry -> EntrySpan) -> RootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ Value -> RootEntry -> RootEntry
RootEntry.addData Value
value RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry ->
      NonRootEntry -> EntrySpan
NonRootEntrySpan (NonRootEntry -> EntrySpan) -> NonRootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ Value -> NonRootEntry -> NonRootEntry
NonRootEntry.addData Value
value NonRootEntry
entry