module Rollbar where
import BasicPrelude
import Data.Aeson
import Data.Text (toLower)
import qualified Data.Vector as V
import Network.BSD (HostName)
import Data.Monoid (mappend)
import Control.Monad.Trans.Control (MonadBaseControl)
import Network.HTTP.Conduit
( RequestBody(RequestBodyLBS)
, Request(method, requestBody)
, parseUrl
, withManager
, http )
default (Text)
reportErrorS :: (MonadIO m, MonadBaseControl IO m)
=> Text
-> HostName
-> Text
-> Text
-> m ()
reportErrorS env hostName section msg =
reportLoggerErrorS section hostName env logMessage msg
where
logMessage sec message = putStrLn $ "[Error#" `mappend` sec `mappend` "] " `mappend` " " `mappend` message
reportLoggerErrorS :: (MonadIO m, MonadBaseControl IO m)
=> Text
-> HostName
-> Text
-> (Text -> Text -> m ())
-> Text
-> m ()
reportLoggerErrorS env hostName section logger msg = do
log msg
liftIO $ do
void $ withManager $ \manager -> do
initReq <- liftIO $ parseUrl "https://api.rollbar.com/api/1/item/"
let req = initReq { method = "POST", requestBody = RequestBodyLBS $ encode json }
http req manager
`catch` (\(e::SomeException) -> log $ show e)
where
log = logger section
json = object
[ "access_token" .= "8c0692277f2e4393bb6cf42f2eb617c0"
, "data" .= object
[ "environment" .= toLower env
, "level" .= "error"
, "server" .= object [ "host" .= hostName ]
, "custom" .= object []
, "body" .= object
[ "trace" .= object
[ "frames" .= (Array $ V.fromList [])
, "exception" .= object ["class" .= section, "message" .= msg]
]
]
]
]