log-0.9.0.1: bench/Bench.hs
module Main where
import Log
import Log.Backend.ElasticSearch.V5
import Log.Backend.PostgreSQL
import Control.Concurrent
import Control.Monad
import Control.Monad.Base
import Control.Monad.IO.Class
import Database.PostgreSQL.PQTypes
import Data.Monoid
import System.Environment
import System.Random
import TextShow
import qualified Data.Text as T
import qualified System.Remote.Monitoring as EKG
-- Usage:
--
-- 1. (Optional) Start elasticsearch/postgres
-- 2. Run the benchmark exe with the appropriate argument ('postgres'/'elastic').
-- 3. Open htop and/or localhost:8000 in the browser
-- 4. Stop elasticsearch/postgres
-- 5. Observe the memory allocation behaviour.
main :: IO ()
main = do
void $ EKG.forkServer "localhost" 8000
args <- getArgs
case args of
["postgres"] -> benchPostgres defConnString
["postgres", connString] -> benchPostgres (T.pack connString)
["elastic"] -> benchElastic
_ -> benchElastic
defConnString :: T.Text
defConnString = "postgresql://user:password@localhost/log-postgresql-bench"
benchPostgres :: T.Text -> IO ()
benchPostgres connString = do
putStrLn "postgres"
ConnectionSource connSource <- poolSource def { csConnInfo = connString } 1 10 1
withPgLogger connSource $
\logger -> forever $ benchLogger logger
benchElastic :: IO ()
benchElastic = do
putStrLn "elastic"
let config = defaultElasticSearchConfig
withElasticSearchLogger config randomIO $
\logger -> forever $ benchLogger logger
benchLogger :: (MonadIO m, MonadTime m, MonadBase IO m) => Logger -> m ()
benchLogger logger= do
liftIO $ putStrLn "writing 100 000 log messages..."
runLogT "log-bench-elasticsearch" logger $
forM_ [0..10000] $ \(i :: Int) ->
logTrace_ ("kaboozle kaboozle kaboozle kaboozle kaboozle " <> showt i)
liftIO $ putStrLn "sleeping for 1 s..."
liftIO $ threadDelay 1000000 {- 1 sec -}