Я создал небольшой Вай Middleware вы можете использовать для запросов времени:
-- Network/Wai/Middleware/RequestTimer.hs
module Network.Wai.Middleware.RequestTimer (
requestTimer,
) where
import Prelude
import Network.Wai
import Data.Time (getCurrentTime, diffUTCTime)
requestTimer :: Middleware
requestTimer app req sendResponse = do
t0 <- getCurrentTime
app req $ \rsp -> do
t1 <- getCurrentTime
putStrLn $ "The request time is " ++ (show $ diffUTCTime t1 t0)
sendResponse rsp
затем я добавил этот модуль к exposed-modules
в моем .cabal
файле
library
exposed-modules: Application
Foundation
Import
-- lots more here
Network.Wai.Middleware.RequestTimer
Тогда в Application.hs
я применяю к промежуточному:
import Network.Wai.Middleware.RequestTimer
makeApplication :: AppConfig DefaultEnv Extra -> IO Application
makeApplication conf = do
foundation <- makeFoundation conf
-- Create the WAI application and apply middlewares
app <- toWaiAppPlain foundation
return $ requestTimer app -- Note that you can chain multiple middlewares together here.
Теперь при выполнении запросов, вы увидите
The request time is 3.014697s
печататься в консоли.
Я хотел бы рассказать о промежуточном программном обеспечении, но я честно понятия не имею, как он работает. Я просто обрезаю вещи от RequestLogger
и других посредников Вай. Надеюсь, я смогу лучше понять это сегодня вечером и вернуться и отредактировать этот ответ с подробностями, но я собираюсь опаздывать на работу.
Я не знаю, да, но это в целом выглядит разумным. Но почему бы вам не отвлечь его на функцию, принимающую действие, и вернуть действие, которое дает как основной результат, так и время, которое оно потребовалось? – dfeuer
@dfeuer спасибо! Нужно ли углублять обработчик? –
Кажется маловероятным, что это лучший подход: http://hackage.haskell.org/package/wai-extra-3.0.2.1/docs/src/Network-Wai-Middleware-RequestLogger.html#detailedMiddleware 'может быть ближе к что требуется –