module Network.Wai.Middleware.OpenTelemetry
( newOpenTelemetryWaiMiddleware
, openTelemetryMiddleware
) where
import Freckle.App.Prelude
import qualified Data.ByteString.Char8 as BS8
import Freckle.App.OpenTelemetry
import Network.Wai
import Network.Wai.Middleware.AddHeaders
import qualified OpenTelemetry.Instrumentation.Wai as Trace
newOpenTelemetryWaiMiddleware :: IO Middleware
newOpenTelemetryWaiMiddleware :: IO Middleware
newOpenTelemetryWaiMiddleware = do
Middleware
otel <- HasCallStack => IO Middleware
Trace.newOpenTelemetryWaiMiddleware
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Middleware
otel forall b c a. (b -> c) -> (a -> b) -> a -> c
. Middleware
openTelemetryMiddleware
openTelemetryMiddleware :: Middleware
openTelemetryMiddleware :: Middleware
openTelemetryMiddleware Application
app Request
request Response -> IO ResponseReceived
respond =
forall (m :: * -> *) a. (MonadIO m, MonadMask m) => m a -> m a
withTraceIdContext forall a b. (a -> b) -> a -> b
$ Middleware
addTraceIdHeader Application
app Request
request Response -> IO ResponseReceived
respond
addTraceIdHeader :: Middleware
Application
app Request
request Response -> IO ResponseReceived
respond = do
Maybe Word64
mTraceId <- forall (m :: * -> *). MonadIO m => m (Maybe Word64)
getCurrentTraceIdAsDatadog
forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. a -> a
id forall {a}. Show a => a -> Middleware
addHeader Maybe Word64
mTraceId Application
app Request
request Response -> IO ResponseReceived
respond
where
addHeader :: a -> Middleware
addHeader a
traceId =
[(ByteString, ByteString)] -> Middleware
addHeaders [(ByteString
"X-Datadog-Trace-Id", String -> ByteString
BS8.pack forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show a
traceId)]