@@ -13,23 +13,27 @@ In order for produced spans to have correct code locations, all the functions ac
1313`inSpanM` call must have `HasCallStack` constraint, because
1414[GHC is never inferring it](https://downloads.haskell.org/ghc/9.8.4/docs/users_guide/exts/callstack.html) for us.
1515-}
16- module PostgREST.OpenTelemetry (Tracer , withTracer , inSpanM , inSpanMDefault , oTelMiddleware ) where
16+ module PostgREST.OpenTelemetry (Tracer , withTracer , inSpanM , inSpanMDefault , oTelMiddleware , renderTraceContext ) where
1717
18- import Control.Monad.Catch (MonadMask )
19- import Network.Wai (Middleware )
20- import OpenTelemetry.Attributes (emptyAttributes )
21- import OpenTelemetry.Instrumentation.Wai (newOpenTelemetryWaiMiddleware' )
22- import OpenTelemetry.Trace (InstrumentationLibrary (.. ),
23- SpanArguments , Tracer ,
24- defaultSpanArguments ,
25- initializeGlobalTracerProvider ,
26- makeTracer ,
27- shutdownTracerProvider ,
28- tracerOptions )
29- import OpenTelemetry.Trace.Core (getTracerTracerProvider )
30- import OpenTelemetry.Utils.Exceptions (inSpanM'' )
31- import PostgREST.Version (prettyVersion )
32- import Protolude
18+ import Control.Monad.Catch (MonadMask )
19+ import Network.Wai (Middleware )
20+ import OpenTelemetry.Attributes (emptyAttributes )
21+ import qualified OpenTelemetry.Context as Context
22+ import OpenTelemetry.Context.ThreadLocal (getContext )
23+ import OpenTelemetry.Instrumentation.Wai (newOpenTelemetryWaiMiddleware' )
24+ import OpenTelemetry.Propagator.W3CTraceContext (encodeSpanContext )
25+ import OpenTelemetry.Trace (InstrumentationLibrary (.. ),
26+ SpanArguments ,
27+ Tracer ,
28+ defaultSpanArguments ,
29+ initializeGlobalTracerProvider ,
30+ makeTracer ,
31+ shutdownTracerProvider ,
32+ tracerOptions )
33+ import OpenTelemetry.Trace.Core (getTracerTracerProvider )
34+ import OpenTelemetry.Utils.Exceptions (inSpanM'' )
35+ import PostgREST.Version (prettyVersion )
36+ import Protolude
3337
3438-- | Wrap user's code with OpenTelemetry Tracer, initializing it with sensible defaults
3539withTracer :: (Tracer -> IO c ) -> IO c
@@ -69,3 +73,16 @@ oTelMiddleware Nothing = identity
6973
7074inSpanMDefault :: (MonadIO m , MonadMask m , HasCallStack ) => Maybe Tracer -> Text -> m a -> m a
7175inSpanMDefault t name = inSpanM t name defaultSpanArguments
76+ renderTraceContext :: IO (Maybe ByteString )
77+ renderTraceContext = do
78+ -- Render TraceContext in W3C Trace Context format
79+ -- https://www.w3.org/TR/trace-context/#traceparent-header
80+ -- https://www.w3.org/TR/trace-context/#tracestate-header
81+ --
82+ ctx <- getContext
83+ case Context. lookupSpan ctx of
84+ Nothing -> pure Nothing
85+ Just span -> do
86+ (tParent, _tState) <- encodeSpanContext span
87+ let traceContext = " traceparent='" <> tParent <> " '"
88+ pure $ Just traceContext
0 commit comments