module Ecluse.Telemetry.Correlation (
ddIdentity,
ddIdentityFromEnvironment,
activeDdSpan,
ddContextNow,
ddPayloadNow,
) where
import System.Environment (getEnvironment)
import Katip (SimpleLogPayload)
import OpenTelemetry.Trace.Core (getActiveSpanContext, isValid)
import OpenTelemetry.Trace.Core qualified as OTel
import OpenTelemetry.Trace.Id (spanIdBytes, traceIdBytes)
import Ecluse.Log (
DdContext (..),
DdSpan (DdSpan),
ddField,
formatDdSpanId,
formatDdTraceId,
)
import Ecluse.Telemetry.Resolve (
ResolvedTelemetry (rtEnvironment, rtServiceName, rtVersion),
resolveTelemetry,
)
ddIdentity :: ResolvedTelemetry -> DdContext
ddIdentity :: ResolvedTelemetry -> DdContext
ddIdentity ResolvedTelemetry
resolved =
DdContext
{ ddService :: Text
ddService = ResolvedTelemetry -> Text
rtServiceName ResolvedTelemetry
resolved
, ddEnv :: Maybe Text
ddEnv = ResolvedTelemetry -> Maybe Text
rtEnvironment ResolvedTelemetry
resolved
, ddVersion :: Maybe Text
ddVersion = ResolvedTelemetry -> Maybe Text
rtVersion ResolvedTelemetry
resolved
, ddSpan :: Maybe DdSpan
ddSpan = Maybe DdSpan
forall a. Maybe a
Nothing
}
ddIdentityFromEnvironment :: IO DdContext
ddIdentityFromEnvironment :: IO DdContext
ddIdentityFromEnvironment = ResolvedTelemetry -> DdContext
ddIdentity (ResolvedTelemetry -> DdContext)
-> ([(String, String)] -> ResolvedTelemetry)
-> [(String, String)]
-> DdContext
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(String, String)] -> ResolvedTelemetry
resolveTelemetry ([(String, String)] -> DdContext)
-> IO [(String, String)] -> IO DdContext
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [(String, String)]
getEnvironment
activeDdSpan :: (MonadIO m) => m (Maybe DdSpan)
activeDdSpan :: forall (m :: * -> *). MonadIO m => m (Maybe DdSpan)
activeDdSpan = do
mContext <- m (Maybe SpanContext)
forall (m :: * -> *). MonadIO m => m (Maybe SpanContext)
getActiveSpanContext
pure $ case mContext of
Just SpanContext
spanContext
| SpanContext -> Bool
isValid SpanContext
spanContext ->
DdSpan -> Maybe DdSpan
forall a. a -> Maybe a
Just
( Text -> Text -> DdSpan
DdSpan
(ByteString -> Text
formatDdTraceId (TraceId -> ByteString
traceIdBytes (SpanContext -> TraceId
OTel.traceId SpanContext
spanContext)))
(ByteString -> Text
formatDdSpanId (SpanId -> ByteString
spanIdBytes (SpanContext -> SpanId
OTel.spanId SpanContext
spanContext)))
)
Maybe SpanContext
_ -> Maybe DdSpan
forall a. Maybe a
Nothing
ddContextNow :: (MonadIO m) => DdContext -> m DdContext
ddContextNow :: forall (m :: * -> *). MonadIO m => DdContext -> m DdContext
ddContextNow DdContext
base = do
mSpan <- m (Maybe DdSpan)
forall (m :: * -> *). MonadIO m => m (Maybe DdSpan)
activeDdSpan
pure base{ddSpan = mSpan}
ddPayloadNow :: (MonadIO m) => DdContext -> m SimpleLogPayload
ddPayloadNow :: forall (m :: * -> *). MonadIO m => DdContext -> m SimpleLogPayload
ddPayloadNow DdContext
base = DdContext -> SimpleLogPayload
ddField (DdContext -> SimpleLogPayload)
-> m DdContext -> m SimpleLogPayload
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DdContext -> m DdContext
forall (m :: * -> *). MonadIO m => DdContext -> m DdContext
ddContextNow DdContext
base