{-# LANGUAGE DeriveGeneric #-}
{-|
Module : Instana.SDK.Span.RootEntry
Description : A root entry span
-}
module Instana.SDK.Span.RootEntry
( RootEntry(..)
, spanId
, traceId
, addAnnotation
, addToErrorCount
, setServiceName
, setCorrelationType
, setCorrelationId
, setSynthetic
, setW3cTraceContext
, spanName
) where
import Data.Text (Text)
import GHC.Generics
import Instana.SDK.Internal.Id (Id)
import Instana.SDK.Internal.W3CTraceContext (W3CTraceContext)
import Instana.SDK.Span.SpanData (Annotation, SpanData)
import qualified Instana.SDK.Span.SpanData as SpanData
import Instana.SDK.Span.SpanType (SpanType)
import qualified Instana.SDK.Span.SpanType as SpanType
-- |An entry span that is the root span of a trace.
data RootEntry =
RootEntry
{
-- |The trace ID and span ID (those are identical for root spans)
spanAndTraceId :: Id
-- |The type of the span (SDK span or registerd span)
, spanType :: SpanType
-- |The time the span (and trace) started
, timestamp :: Int
-- |The number of errors that occured during processing
, errorCount :: Int
-- |An attribute for overriding the name of the service in Instana
, serviceName :: Maybe Text
-- |A flag indicating that this span represents a synthetic call
, synthetic :: Bool
-- |The website monitoring correlation type
, correlationType :: Maybe Text
-- |The website monitoring correlation ID
, correlationId :: Maybe Text
-- |Additional data for the span.
, spanData :: SpanData
-- |The W3C Trace Context. An entry span only has an associated W3C trace
-- context, if W3C trace context headers have been received.
, w3cTraceContext :: Maybe W3CTraceContext
} deriving (Eq, Generic, Show)
-- |The span name/type, e.g. a short string like "haskell.wai.server",
-- "haskell.http.client". For SDK spans this is always "sdk", the actual
-- name is then in span.data.sdk.name.
spanName :: RootEntry -> Text
spanName = SpanType.spanName . spanType
-- |Accessor for the trace ID.
traceId :: RootEntry -> Id
traceId = spanAndTraceId
-- |Accessor for the span ID.
spanId :: RootEntry -> Id
spanId = spanAndTraceId
-- |Add to the error count.
addToErrorCount :: Int -> RootEntry -> RootEntry
addToErrorCount increment rootEntry =
let
ec = errorCount rootEntry
in
rootEntry { errorCount = ec + increment }
-- |Override the name of the service for the associated call in Instana.
setServiceName :: Text -> RootEntry -> RootEntry
setServiceName serviceName_ rootEntry =
rootEntry { serviceName = Just serviceName_ }
-- |Attaches a W3C trace context to the span.
setW3cTraceContext :: W3CTraceContext -> RootEntry -> RootEntry
setW3cTraceContext w3cTraceContext_ rootEntry =
rootEntry { w3cTraceContext = Just w3cTraceContext_ }
-- |Set the synthetic flag.
setSynthetic :: Bool -> RootEntry -> RootEntry
setSynthetic synthetic_ rootEntry =
rootEntry { synthetic = synthetic_ }
-- |Set the website monitoring correlation type.
setCorrelationType :: Text -> RootEntry -> RootEntry
setCorrelationType correlationType_ rootEntry =
rootEntry { correlationType = Just correlationType_ }
-- |Set the website monitoring correlation ID.
setCorrelationId :: Text -> RootEntry -> RootEntry
setCorrelationId correlationId_ rootEntry =
rootEntry { correlationId = Just correlationId_ }
-- |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 -> RootEntry -> RootEntry
addAnnotation annotation rootEntry =
rootEntry { spanData = SpanData.merge annotation $ spanData rootEntry }