opentelemetry-wai-0.3.0: src/OpenTelemetry/Network/Wai/Middleware.hs
{-# LANGUAGE OverloadedStrings #-}
module OpenTelemetry.Network.Wai.Middleware where
import qualified Data.ByteString.Char8 as BS8
import Network.HTTP.Types
import Network.Wai
import OpenTelemetry.Eventlog
import OpenTelemetry.Propagation
-- Semantic conventions for HTTP spans:
-- https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md
middleware :: Application -> Application
middleware app = \req sendResp -> do
withSpan "WAI handler" $ do
case propagateFromHeaders w3cTraceContext (requestHeaders req) of
Just ctx -> setParentSpanContext ctx
_ -> pure ()
setTag "span.kind" "server"
setTag "component" "http"
setTag "http.method" $ requestMethod req
setTag "http.target" $ rawPathInfo req
setTag "http.flavor" $ BS8.pack $ show (httpVersion req)
app req $ \resp -> do
setTag "http.status_code" (BS8.pack $ show $ statusCode $ responseStatus resp)
sendResp resp