packages feed

instana-haskell-trace-sdk-0.8.0.0: src/Instana/SDK/Span/EntrySpan.hs

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


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
import           Instana.SDK.Span.SpanData            (Annotation, SpanData)
import           Instana.SDK.Span.SpanType            (SpanType)


-- |An entry span.
data EntrySpan =
    RootEntrySpan RootEntry
  | NonRootEntrySpan NonRootEntry
  deriving (Eq, Generic, Show)


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


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


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


-- |Type of span (registerd span vs. SDK span)
spanType :: EntrySpan -> SpanType
spanType entrySpan =
  case entrySpan of
    RootEntrySpan entry   -> RootEntry.spanType entry
    NonRootEntrySpan exit -> NonRootEntry.spanType exit


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


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


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


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


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


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


-- |The website monitoring correlation type.
correlationType :: EntrySpan -> Maybe Text
correlationType entrySpan =
  case entrySpan of
    RootEntrySpan entry -> RootEntry.correlationType entry
    NonRootEntrySpan _  -> 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 correlationType_ entrySpan =
  case entrySpan of
    RootEntrySpan entry ->
      RootEntrySpan $ RootEntry.setCorrelationType correlationType_ entry
    NonRootEntrySpan _ ->
      entrySpan


-- |The website monitoring correlation ID.
correlationId :: EntrySpan -> Maybe Text
correlationId entrySpan =
  case entrySpan of
    RootEntrySpan entry -> RootEntry.correlationId entry
    NonRootEntrySpan _  -> 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 correlationId_ entrySpan =
  case entrySpan of
    RootEntrySpan entry ->
      RootEntrySpan $ RootEntry.setCorrelationId correlationId_ entry
    NonRootEntrySpan _ ->
      entrySpan


-- |The synthetic flag.
synthetic :: EntrySpan -> Bool
synthetic entrySpan =
  case entrySpan of
    RootEntrySpan entry    -> RootEntry.synthetic entry
    NonRootEntrySpan entry -> NonRootEntry.synthetic 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 =
  case entrySpan of
    RootEntrySpan entry    -> RootEntry.w3cTraceContext entry
    NonRootEntrySpan entry -> NonRootEntry.w3cTraceContext entry


-- |Attaches a W3C trace context to the span.
setW3cTraceContext :: W3CTraceContext -> EntrySpan -> EntrySpan
setW3cTraceContext w3cTraceContext_ entrySpan =
   case entrySpan of
    RootEntrySpan entry ->
      RootEntrySpan $ RootEntry.setW3cTraceContext w3cTraceContext_ entry
    NonRootEntrySpan entry ->
      NonRootEntrySpan $ NonRootEntry.setW3cTraceContext w3cTraceContext_ 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 =
  case entrySpan of
    RootEntrySpan _        -> False
    NonRootEntrySpan entry -> NonRootEntry.tpFlag 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 =
  case entrySpan of
    RootEntrySpan _        ->
      entrySpan
    NonRootEntrySpan entry ->
      NonRootEntrySpan $ NonRootEntry.setTpFlag 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 synthetic_ entrySpan =
  case entrySpan of
    RootEntrySpan entry ->
      RootEntrySpan $ RootEntry.setSynthetic synthetic_ entry
    NonRootEntrySpan entry ->
      NonRootEntrySpan $ NonRootEntry.setSynthetic synthetic_ entry


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


-- |Add an annotation to the span's data section. For SDK spans, the annotation
-- is added to span.data.sdk.custom.tags, for registered spans it is added
-- directly to span.data.
addAnnotation :: Annotation-> EntrySpan -> EntrySpan
addAnnotation value entrySpan =
  case entrySpan of
    RootEntrySpan    entry ->
      RootEntrySpan $ RootEntry.addAnnotation value entry
    NonRootEntrySpan entry ->
      NonRootEntrySpan $ NonRootEntry.addAnnotation value entry