37 lines
1.3 KiB
Haskell
37 lines
1.3 KiB
Haskell
module PostgREST.Response.Performance
|
|
( ServerTiming (..)
|
|
, serverTimingHeader
|
|
)
|
|
where
|
|
import qualified Data.ByteString.Char8 as BS
|
|
import qualified Network.HTTP.Types as HTTP
|
|
import Numeric (showFFloat)
|
|
import Protolude
|
|
|
|
data ServerTiming =
|
|
ServerTiming
|
|
{ jwt :: Maybe Double
|
|
, parse :: Maybe Double
|
|
, plan :: Maybe Double
|
|
, transaction :: Maybe Double
|
|
, response :: Maybe Double
|
|
}
|
|
deriving (Show)
|
|
|
|
-- | Render the Server-Timing header from a ServerTimingData
|
|
--
|
|
-- >>> serverTimingHeader ServerTiming { plan=Just 0.1, transaction=Just 0.2, response=Just 0.3, jwt=Just 0.4, parse=Just 0.5}
|
|
-- ("Server-Timing","jwt;dur=400000.0, parse;dur=500000.0, plan;dur=100000.0, transaction;dur=200000.0, response;dur=300000.0")
|
|
serverTimingHeader :: ServerTiming -> HTTP.Header
|
|
serverTimingHeader timing =
|
|
("Server-Timing", renderTiming)
|
|
where
|
|
renderMetric metric = maybe "" (\dur -> BS.concat [metric, BS.pack $ ";dur=" <> showFFloat (Just 1) (dur * 1000000) ""])
|
|
renderTiming = BS.intercalate ", " $ (\(k, v) -> renderMetric k (v timing)) <$>
|
|
[ ("jwt", jwt)
|
|
, ("parse", parse)
|
|
, ("plan", plan)
|
|
, ("transaction", transaction)
|
|
, ("response", response)
|
|
]
|