{-# LANGUAGE OverloadedStrings #-}
module OpenTelemetry.Network.Wai.Middleware where
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import Network.HTTP.Types
import Network.Wai
import OpenTelemetry.Implicit
import OpenTelemetry.Propagation
middleware :: Application -> Application
middleware app = \req sendResp -> do
withSpan "WAI handler" $ do
case extractSpanContextFromHeaders (requestHeaders req) of
Just ctx -> setParentSpanContext ctx
_ -> pure ()
setTag "span.kind" ("server" :: T.Text)
setTag "component" ("http" :: T.Text)
setTag "http.method" $ T.decodeUtf8 (requestMethod req)
setTag "http.target" $ T.decodeUtf8 (rawPathInfo req)
setTag "http.flavor" $ show (httpVersion req)
app req $ \resp -> do
setTag "http.status_code" (statusCode $ responseStatus resp)
sendResp resp