{-# 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