{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE StrictData #-}
module OpenTelemetry.Internal.Trace.Types where
import Control.Concurrent.Async (Async)
import Control.Monad.IO.Class
import Data.Bits
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as H
import Data.IORef (IORef, readIORef)
import Data.Text (Text)
import Data.Vector (Vector)
import Data.Word (Word8)
import Network.HTTP.Types (RequestHeaders)
import OpenTelemetry.Attributes
import OpenTelemetry.Common
import OpenTelemetry.Context.Types
import OpenTelemetry.Internal.Common.Types
import OpenTelemetry.Propagator (Propagator)
import OpenTelemetry.Resource
import OpenTelemetry.Trace.Id
import OpenTelemetry.Trace.Id.Generator
import OpenTelemetry.Trace.TraceState
import OpenTelemetry.Util
data SpanExporter = SpanExporter
{ SpanExporter
-> HashMap InstrumentationLibrary (Vector ImmutableSpan)
-> IO ExportResult
spanExporterExport :: HashMap InstrumentationLibrary (Vector ImmutableSpan) -> IO ExportResult
, SpanExporter -> IO ()
spanExporterShutdown :: IO ()
}
data SpanProcessor = SpanProcessor
{ SpanProcessor -> IORef ImmutableSpan -> Context -> IO ()
spanProcessorOnStart :: IORef ImmutableSpan -> Context -> IO ()
, SpanProcessor -> IORef ImmutableSpan -> IO ()
spanProcessorOnEnd :: IORef ImmutableSpan -> IO ()
, SpanProcessor -> IO (Async ShutdownResult)
spanProcessorShutdown :: IO (Async ShutdownResult)
, SpanProcessor -> IO ()
spanProcessorForceFlush :: IO ()
}
data TracerProvider = TracerProvider
{ TracerProvider -> Vector SpanProcessor
tracerProviderProcessors :: !(Vector SpanProcessor)
, TracerProvider -> IdGenerator
tracerProviderIdGenerator :: !IdGenerator
, TracerProvider -> Sampler
tracerProviderSampler :: !Sampler
, TracerProvider -> MaterializedResources
tracerProviderResources :: !MaterializedResources
, TracerProvider -> AttributeLimits
tracerProviderAttributeLimits :: !AttributeLimits
, TracerProvider -> SpanLimits
tracerProviderSpanLimits :: !SpanLimits
, TracerProvider -> Propagator Context RequestHeaders RequestHeaders
tracerProviderPropagators :: !(Propagator Context RequestHeaders RequestHeaders)
}
data Tracer = Tracer
{ Tracer -> InstrumentationLibrary
tracerName :: {-# UNPACK #-} !InstrumentationLibrary
, Tracer -> TracerProvider
tracerProvider :: !TracerProvider
}
instance Show Tracer where
showsPrec :: Int -> Tracer -> ShowS
showsPrec Int
d Tracer {tracerName :: Tracer -> InstrumentationLibrary
tracerName = InstrumentationLibrary
name} = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"Tracer {tracerName = " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InstrumentationLibrary -> ShowS
forall a. Show a => a -> ShowS
shows InstrumentationLibrary
name ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"}"
data NewLink = NewLink
{ NewLink -> SpanContext
linkContext :: !SpanContext
, NewLink -> AttributeMap
linkAttributes :: AttributeMap
}
deriving (Int -> NewLink -> ShowS
[NewLink] -> ShowS
NewLink -> String
(Int -> NewLink -> ShowS)
-> (NewLink -> String) -> ([NewLink] -> ShowS) -> Show NewLink
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NewLink -> ShowS
showsPrec :: Int -> NewLink -> ShowS
$cshow :: NewLink -> String
show :: NewLink -> String
$cshowList :: [NewLink] -> ShowS
showList :: [NewLink] -> ShowS
Show)
data Link = Link
{ Link -> SpanContext
frozenLinkContext :: !SpanContext
, Link -> Attributes
frozenLinkAttributes :: Attributes
}
deriving (Int -> Link -> ShowS
[Link] -> ShowS
Link -> String
(Int -> Link -> ShowS)
-> (Link -> String) -> ([Link] -> ShowS) -> Show Link
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Link -> ShowS
showsPrec :: Int -> Link -> ShowS
$cshow :: Link -> String
show :: Link -> String
$cshowList :: [Link] -> ShowS
showList :: [Link] -> ShowS
Show)
data SpanArguments = SpanArguments
{ SpanArguments -> SpanKind
kind :: SpanKind
, SpanArguments -> AttributeMap
attributes :: AttributeMap
, SpanArguments -> [NewLink]
links :: [NewLink]
, SpanArguments -> Maybe Timestamp
startTime :: Maybe Timestamp
}
data SpanKind
=
Server
|
Client
|
Producer
|
Consumer
|
Internal
deriving (Int -> SpanKind -> ShowS
[SpanKind] -> ShowS
SpanKind -> String
(Int -> SpanKind -> ShowS)
-> (SpanKind -> String) -> ([SpanKind] -> ShowS) -> Show SpanKind
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SpanKind -> ShowS
showsPrec :: Int -> SpanKind -> ShowS
$cshow :: SpanKind -> String
show :: SpanKind -> String
$cshowList :: [SpanKind] -> ShowS
showList :: [SpanKind] -> ShowS
Show)
data SpanStatus
=
Unset
|
Error Text
|
Ok
deriving (Int -> SpanStatus -> ShowS
[SpanStatus] -> ShowS
SpanStatus -> String
(Int -> SpanStatus -> ShowS)
-> (SpanStatus -> String)
-> ([SpanStatus] -> ShowS)
-> Show SpanStatus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SpanStatus -> ShowS
showsPrec :: Int -> SpanStatus -> ShowS
$cshow :: SpanStatus -> String
show :: SpanStatus -> String
$cshowList :: [SpanStatus] -> ShowS
showList :: [SpanStatus] -> ShowS
Show, SpanStatus -> SpanStatus -> Bool
(SpanStatus -> SpanStatus -> Bool)
-> (SpanStatus -> SpanStatus -> Bool) -> Eq SpanStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SpanStatus -> SpanStatus -> Bool
== :: SpanStatus -> SpanStatus -> Bool
$c/= :: SpanStatus -> SpanStatus -> Bool
/= :: SpanStatus -> SpanStatus -> Bool
Eq)
instance Ord SpanStatus where
compare :: SpanStatus -> SpanStatus -> Ordering
compare SpanStatus
Unset SpanStatus
Unset = Ordering
EQ
compare SpanStatus
Unset (Error Text
_) = Ordering
LT
compare SpanStatus
Unset SpanStatus
Ok = Ordering
LT
compare (Error Text
_) SpanStatus
Unset = Ordering
GT
compare (Error Text
_) (Error Text
_) = Ordering
GT
compare (Error Text
_) SpanStatus
Ok = Ordering
LT
compare SpanStatus
Ok SpanStatus
Unset = Ordering
GT
compare SpanStatus
Ok (Error Text
_) = Ordering
GT
compare SpanStatus
Ok SpanStatus
Ok = Ordering
EQ
data ImmutableSpan = ImmutableSpan
{ ImmutableSpan -> Text
spanName :: Text
, ImmutableSpan -> Maybe Span
spanParent :: Maybe Span
, ImmutableSpan -> SpanContext
spanContext :: SpanContext
, ImmutableSpan -> SpanKind
spanKind :: SpanKind
, ImmutableSpan -> Timestamp
spanStart :: Timestamp
, ImmutableSpan -> Maybe Timestamp
spanEnd :: Maybe Timestamp
, ImmutableSpan -> Attributes
spanAttributes :: Attributes
, ImmutableSpan -> AppendOnlyBoundedCollection Link
spanLinks :: AppendOnlyBoundedCollection Link
, ImmutableSpan -> AppendOnlyBoundedCollection Event
spanEvents :: AppendOnlyBoundedCollection Event
, ImmutableSpan -> SpanStatus
spanStatus :: SpanStatus
, ImmutableSpan -> Tracer
spanTracer :: Tracer
}
deriving (Int -> ImmutableSpan -> ShowS
[ImmutableSpan] -> ShowS
ImmutableSpan -> String
(Int -> ImmutableSpan -> ShowS)
-> (ImmutableSpan -> String)
-> ([ImmutableSpan] -> ShowS)
-> Show ImmutableSpan
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ImmutableSpan -> ShowS
showsPrec :: Int -> ImmutableSpan -> ShowS
$cshow :: ImmutableSpan -> String
show :: ImmutableSpan -> String
$cshowList :: [ImmutableSpan] -> ShowS
showList :: [ImmutableSpan] -> ShowS
Show)
data Span
= Span (IORef ImmutableSpan)
| FrozenSpan SpanContext
| Dropped SpanContext
instance Show Span where
showsPrec :: Int -> Span -> ShowS
showsPrec Int
d (Span IORef ImmutableSpan
_ioref) = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"Span _ioref"
showsPrec Int
d (FrozenSpan SpanContext
ctx) = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"FrozenSpan " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> SpanContext -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 SpanContext
ctx
showsPrec Int
d (Dropped SpanContext
ctx) = Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"Dropped " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> SpanContext -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 SpanContext
ctx
data FrozenOrDropped = SpanFrozen | SpanDropped deriving (Int -> FrozenOrDropped -> ShowS
[FrozenOrDropped] -> ShowS
FrozenOrDropped -> String
(Int -> FrozenOrDropped -> ShowS)
-> (FrozenOrDropped -> String)
-> ([FrozenOrDropped] -> ShowS)
-> Show FrozenOrDropped
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FrozenOrDropped -> ShowS
showsPrec :: Int -> FrozenOrDropped -> ShowS
$cshow :: FrozenOrDropped -> String
show :: FrozenOrDropped -> String
$cshowList :: [FrozenOrDropped] -> ShowS
showList :: [FrozenOrDropped] -> ShowS
Show, FrozenOrDropped -> FrozenOrDropped -> Bool
(FrozenOrDropped -> FrozenOrDropped -> Bool)
-> (FrozenOrDropped -> FrozenOrDropped -> Bool)
-> Eq FrozenOrDropped
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FrozenOrDropped -> FrozenOrDropped -> Bool
== :: FrozenOrDropped -> FrozenOrDropped -> Bool
$c/= :: FrozenOrDropped -> FrozenOrDropped -> Bool
/= :: FrozenOrDropped -> FrozenOrDropped -> Bool
Eq)
toImmutableSpan :: MonadIO m => Span -> m (Either FrozenOrDropped ImmutableSpan)
toImmutableSpan :: forall (m :: * -> *).
MonadIO m =>
Span -> m (Either FrozenOrDropped ImmutableSpan)
toImmutableSpan Span
s = case Span
s of
Span IORef ImmutableSpan
ioref -> ImmutableSpan -> Either FrozenOrDropped ImmutableSpan
forall a b. b -> Either a b
Right (ImmutableSpan -> Either FrozenOrDropped ImmutableSpan)
-> m ImmutableSpan -> m (Either FrozenOrDropped ImmutableSpan)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ImmutableSpan -> m ImmutableSpan
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IORef ImmutableSpan -> IO ImmutableSpan
forall a. IORef a -> IO a
readIORef IORef ImmutableSpan
ioref)
FrozenSpan SpanContext
_ctx -> Either FrozenOrDropped ImmutableSpan
-> m (Either FrozenOrDropped ImmutableSpan)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either FrozenOrDropped ImmutableSpan
-> m (Either FrozenOrDropped ImmutableSpan))
-> Either FrozenOrDropped ImmutableSpan
-> m (Either FrozenOrDropped ImmutableSpan)
forall a b. (a -> b) -> a -> b
$ FrozenOrDropped -> Either FrozenOrDropped ImmutableSpan
forall a b. a -> Either a b
Left FrozenOrDropped
SpanFrozen
Dropped SpanContext
_ctx -> Either FrozenOrDropped ImmutableSpan
-> m (Either FrozenOrDropped ImmutableSpan)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either FrozenOrDropped ImmutableSpan
-> m (Either FrozenOrDropped ImmutableSpan))
-> Either FrozenOrDropped ImmutableSpan
-> m (Either FrozenOrDropped ImmutableSpan)
forall a b. (a -> b) -> a -> b
$ FrozenOrDropped -> Either FrozenOrDropped ImmutableSpan
forall a b. a -> Either a b
Left FrozenOrDropped
SpanDropped
defaultTraceFlags :: TraceFlags
defaultTraceFlags :: TraceFlags
defaultTraceFlags = Word8 -> TraceFlags
TraceFlags Word8
0
isSampled :: TraceFlags -> Bool
isSampled :: TraceFlags -> Bool
isSampled (TraceFlags Word8
flags) = Word8
flags Word8 -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
`testBit` Int
0
setSampled :: TraceFlags -> TraceFlags
setSampled :: TraceFlags -> TraceFlags
setSampled (TraceFlags Word8
flags) = Word8 -> TraceFlags
TraceFlags (Word8
flags Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`setBit` Int
0)
unsetSampled :: TraceFlags -> TraceFlags
unsetSampled :: TraceFlags -> TraceFlags
unsetSampled (TraceFlags Word8
flags) = Word8 -> TraceFlags
TraceFlags (Word8
flags Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`clearBit` Int
0)
traceFlagsValue :: TraceFlags -> Word8
traceFlagsValue :: TraceFlags -> Word8
traceFlagsValue (TraceFlags Word8
flags) = Word8
flags
traceFlagsFromWord8 :: Word8 -> TraceFlags
traceFlagsFromWord8 :: Word8 -> TraceFlags
traceFlagsFromWord8 = Word8 -> TraceFlags
TraceFlags
data SpanContext = SpanContext
{ SpanContext -> TraceFlags
traceFlags :: TraceFlags
, SpanContext -> Bool
isRemote :: Bool
, SpanContext -> TraceId
traceId :: TraceId
, SpanContext -> SpanId
spanId :: SpanId
, SpanContext -> TraceState
traceState :: TraceState
}
deriving (Int -> SpanContext -> ShowS
[SpanContext] -> ShowS
SpanContext -> String
(Int -> SpanContext -> ShowS)
-> (SpanContext -> String)
-> ([SpanContext] -> ShowS)
-> Show SpanContext
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SpanContext -> ShowS
showsPrec :: Int -> SpanContext -> ShowS
$cshow :: SpanContext -> String
show :: SpanContext -> String
$cshowList :: [SpanContext] -> ShowS
showList :: [SpanContext] -> ShowS
Show, SpanContext -> SpanContext -> Bool
(SpanContext -> SpanContext -> Bool)
-> (SpanContext -> SpanContext -> Bool) -> Eq SpanContext
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SpanContext -> SpanContext -> Bool
== :: SpanContext -> SpanContext -> Bool
$c/= :: SpanContext -> SpanContext -> Bool
/= :: SpanContext -> SpanContext -> Bool
Eq)
newtype NonRecordingSpan = NonRecordingSpan SpanContext
data NewEvent = NewEvent
{ NewEvent -> Text
newEventName :: Text
, NewEvent -> AttributeMap
newEventAttributes :: AttributeMap
, NewEvent -> Maybe Timestamp
newEventTimestamp :: Maybe Timestamp
}
data Event = Event
{ Event -> Text
eventName :: Text
, Event -> Attributes
eventAttributes :: Attributes
, Event -> Timestamp
eventTimestamp :: Timestamp
}
deriving (Int -> Event -> ShowS
[Event] -> ShowS
Event -> String
(Int -> Event -> ShowS)
-> (Event -> String) -> ([Event] -> ShowS) -> Show Event
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Event -> ShowS
showsPrec :: Int -> Event -> ShowS
$cshow :: Event -> String
show :: Event -> String
$cshowList :: [Event] -> ShowS
showList :: [Event] -> ShowS
Show)
class ToEvent a where
toEvent :: a -> Event
data SamplingResult
=
Drop
|
RecordOnly
|
RecordAndSample
deriving (Int -> SamplingResult -> ShowS
[SamplingResult] -> ShowS
SamplingResult -> String
(Int -> SamplingResult -> ShowS)
-> (SamplingResult -> String)
-> ([SamplingResult] -> ShowS)
-> Show SamplingResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SamplingResult -> ShowS
showsPrec :: Int -> SamplingResult -> ShowS
$cshow :: SamplingResult -> String
show :: SamplingResult -> String
$cshowList :: [SamplingResult] -> ShowS
showList :: [SamplingResult] -> ShowS
Show, SamplingResult -> SamplingResult -> Bool
(SamplingResult -> SamplingResult -> Bool)
-> (SamplingResult -> SamplingResult -> Bool) -> Eq SamplingResult
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SamplingResult -> SamplingResult -> Bool
== :: SamplingResult -> SamplingResult -> Bool
$c/= :: SamplingResult -> SamplingResult -> Bool
/= :: SamplingResult -> SamplingResult -> Bool
Eq)
data Sampler = Sampler
{ Sampler -> Text
getDescription :: Text
, Sampler
-> Context
-> TraceId
-> Text
-> SpanArguments
-> IO (SamplingResult, AttributeMap, TraceState)
shouldSample :: Context -> TraceId -> Text -> SpanArguments -> IO (SamplingResult, AttributeMap, TraceState)
}
data SpanLimits = SpanLimits
{ SpanLimits -> Maybe Int
spanAttributeValueLengthLimit :: Maybe Int
, SpanLimits -> Maybe Int
spanAttributeCountLimit :: Maybe Int
, SpanLimits -> Maybe Int
eventCountLimit :: Maybe Int
, SpanLimits -> Maybe Int
eventAttributeCountLimit :: Maybe Int
, SpanLimits -> Maybe Int
linkCountLimit :: Maybe Int
, SpanLimits -> Maybe Int
linkAttributeCountLimit :: Maybe Int
}
deriving (Int -> SpanLimits -> ShowS
[SpanLimits] -> ShowS
SpanLimits -> String
(Int -> SpanLimits -> ShowS)
-> (SpanLimits -> String)
-> ([SpanLimits] -> ShowS)
-> Show SpanLimits
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SpanLimits -> ShowS
showsPrec :: Int -> SpanLimits -> ShowS
$cshow :: SpanLimits -> String
show :: SpanLimits -> String
$cshowList :: [SpanLimits] -> ShowS
showList :: [SpanLimits] -> ShowS
Show, SpanLimits -> SpanLimits -> Bool
(SpanLimits -> SpanLimits -> Bool)
-> (SpanLimits -> SpanLimits -> Bool) -> Eq SpanLimits
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SpanLimits -> SpanLimits -> Bool
== :: SpanLimits -> SpanLimits -> Bool
$c/= :: SpanLimits -> SpanLimits -> Bool
/= :: SpanLimits -> SpanLimits -> Bool
Eq)
defaultSpanLimits :: SpanLimits
defaultSpanLimits :: SpanLimits
defaultSpanLimits =
Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> Maybe Int
-> SpanLimits
SpanLimits
Maybe Int
forall a. Maybe a
Nothing
Maybe Int
forall a. Maybe a
Nothing
Maybe Int
forall a. Maybe a
Nothing
Maybe Int
forall a. Maybe a
Nothing
Maybe Int
forall a. Maybe a
Nothing
Maybe Int
forall a. Maybe a
Nothing
type Lens s t a b = forall f. (Functor f) => (a -> f b) -> s -> f t
type Lens' s a = Lens s s a a
getSpanContext :: (MonadIO m) => Span -> m SpanContext
getSpanContext :: forall (m :: * -> *). MonadIO m => Span -> m SpanContext
getSpanContext (Span IORef ImmutableSpan
s) = IO SpanContext -> m SpanContext
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (ImmutableSpan -> SpanContext
spanContext (ImmutableSpan -> SpanContext)
-> IO ImmutableSpan -> IO SpanContext
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IORef ImmutableSpan -> IO ImmutableSpan
forall a. IORef a -> IO a
readIORef IORef ImmutableSpan
s)
getSpanContext (FrozenSpan SpanContext
c) = SpanContext -> m SpanContext
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure SpanContext
c
getSpanContext (Dropped SpanContext
c) = SpanContext -> m SpanContext
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure SpanContext
c