{-# LANGUAGE DeriveGeneric #-}
{-|
Module      : Instana.SDK.Span.EntrySpan
Description : An entry span
-}
module Instana.SDK.Span.EntrySpan
  ( EntrySpan(..)
  , addData
  , addToErrorCount
  , correlationId
  , correlationType
  , errorCount
  , parentId
  , serviceName
  , setCorrelationId
  , setCorrelationType
  , setServiceName
  , setSynthetic
  , setTpFlag
  , setW3cTraceContext
  , spanData
  , spanId
  , spanName
  , synthetic
  , tpFlag
  , timestamp
  , traceId
  , w3cTraceContext
  ) where


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

import           Instana.SDK.Internal.Id              (Id)
import           Instana.SDK.Internal.W3CTraceContext (W3CTraceContext)
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


-- |The website monitoring correlation type.
correlationType :: EntrySpan -> Maybe Text
correlationType :: EntrySpan -> Maybe Text
correlationType entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan entry :: RootEntry
entry -> RootEntry -> Maybe Text
RootEntry.correlationType RootEntry
entry
    NonRootEntrySpan _  -> Maybe Text
forall a. Maybe a
Nothing


-- |Set the website monitoring correlation type. This should only be set on
-- root entry spans. It will be silently ignored for other types of spans.
setCorrelationType :: Text -> EntrySpan -> EntrySpan
setCorrelationType :: Text -> EntrySpan -> EntrySpan
setCorrelationType correlationType_ :: Text
correlationType_ 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.setCorrelationType Text
correlationType_ RootEntry
entry
    NonRootEntrySpan _ ->
      EntrySpan
entrySpan


-- |The website monitoring correlation ID.
correlationId :: EntrySpan -> Maybe Text
correlationId :: EntrySpan -> Maybe Text
correlationId entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan entry :: RootEntry
entry -> RootEntry -> Maybe Text
RootEntry.correlationId RootEntry
entry
    NonRootEntrySpan _  -> Maybe Text
forall a. Maybe a
Nothing


-- |Set the website monitoring correlation ID. This should only be set on
-- root entry spans. It will be silently ignored for other types of spans.
setCorrelationId :: Text -> EntrySpan -> EntrySpan
setCorrelationId :: Text -> EntrySpan -> EntrySpan
setCorrelationId correlationId_ :: Text
correlationId_ 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.setCorrelationId Text
correlationId_ RootEntry
entry
    NonRootEntrySpan _ ->
      EntrySpan
entrySpan


-- |The synthetic flag.
synthetic :: EntrySpan -> Bool
synthetic :: EntrySpan -> Bool
synthetic entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan entry :: RootEntry
entry    -> RootEntry -> Bool
RootEntry.synthetic RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Bool
NonRootEntry.synthetic NonRootEntry
entry


-- |The W3C Trace Context. An entry span only has an associated W3C trace
-- context, if W3C trace context headers have been received. In contrast,
-- exit spans always have an associated W3C trace context.
w3cTraceContext :: EntrySpan -> Maybe W3CTraceContext
w3cTraceContext :: EntrySpan -> Maybe W3CTraceContext
w3cTraceContext entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan entry :: RootEntry
entry    -> RootEntry -> Maybe W3CTraceContext
RootEntry.w3cTraceContext RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Maybe W3CTraceContext
NonRootEntry.w3cTraceContext NonRootEntry
entry


-- |Attaches a W3C trace context to the span.
setW3cTraceContext :: W3CTraceContext -> EntrySpan -> EntrySpan
setW3cTraceContext :: W3CTraceContext -> EntrySpan -> EntrySpan
setW3cTraceContext w3cTraceContext_ :: W3CTraceContext
w3cTraceContext_ 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
$ W3CTraceContext -> RootEntry -> RootEntry
RootEntry.setW3cTraceContext W3CTraceContext
w3cTraceContext_ RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry ->
      NonRootEntry -> EntrySpan
NonRootEntrySpan (NonRootEntry -> EntrySpan) -> NonRootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ W3CTraceContext -> NonRootEntry -> NonRootEntry
NonRootEntry.setW3cTraceContext W3CTraceContext
w3cTraceContext_ NonRootEntry
entry


-- |The span.tp flag. A span with span.tp = True has inherited the trace ID/
-- parent ID from W3C trace context instead of Instana headers. Only valid for
-- entry spans.
tpFlag :: EntrySpan -> Bool
tpFlag :: EntrySpan -> Bool
tpFlag entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan _        -> Bool
False
    NonRootEntrySpan entry :: NonRootEntry
entry -> NonRootEntry -> Bool
NonRootEntry.tpFlag NonRootEntry
entry


-- |Set the span.tp flag. A span with span.tp = True has inherited the trace ID/
-- parent ID from W3C trace context instead of Instana headers. Only valid for
-- non-root entry spans, will be silently ignored for root entry spans and exit
-- spans.
setTpFlag :: EntrySpan -> EntrySpan
setTpFlag :: EntrySpan -> EntrySpan
setTpFlag entrySpan :: EntrySpan
entrySpan =
  case EntrySpan
entrySpan of
    RootEntrySpan _        ->
      EntrySpan
entrySpan
    NonRootEntrySpan entry :: NonRootEntry
entry ->
      NonRootEntry -> EntrySpan
NonRootEntrySpan (NonRootEntry -> EntrySpan) -> NonRootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ NonRootEntry -> NonRootEntry
NonRootEntry.setTpFlag NonRootEntry
entry


-- |Set the synthetic flag. This should only be set on entry spans. It will be
-- silently ignored for other types of spans.
setSynthetic :: Bool -> EntrySpan -> EntrySpan
setSynthetic :: Bool -> EntrySpan -> EntrySpan
setSynthetic synthetic_ :: Bool
synthetic_ 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
$ Bool -> RootEntry -> RootEntry
RootEntry.setSynthetic Bool
synthetic_ RootEntry
entry
    NonRootEntrySpan entry :: NonRootEntry
entry ->
      NonRootEntry -> EntrySpan
NonRootEntrySpan (NonRootEntry -> EntrySpan) -> NonRootEntry -> EntrySpan
forall a b. (a -> b) -> a -> b
$ Bool -> NonRootEntry -> NonRootEntry
NonRootEntry.setSynthetic Bool
synthetic_ 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