{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Boots.Endpoint.Info(
endpointInfo
) where
import Boots
import Boots.Endpoint.Class
import Boots.Factory.Web
import Control.Concurrent
import Data.Aeson
import Data.Text (Text)
import Data.Version (Version, showVersion)
import GHC.Generics
import GHC.RTS.Flags
import Servant
import System.Info
data Info = Info
{ name :: !Text
, instanceId :: !Text
, version :: !Version
, profile :: !Bool
} deriving (Show, Generic, ToSchema)
type EndpointInfo = "info" :> Get '[JSON] Info
endpointInfo
:: (HasWeb context env, MonadMask n, MonadIO n)
=> Proxy context
-> Factory n (WebEnv env context) ()
endpointInfo pc = do
WebEnv{..} <- getEnv
registerEndpoint "info" pc (Proxy @EndpointInfo) $ liftIO $ do
rtsf <- getRTSFlags
return (go rtsf envs)
where
{-# INLINE go #-}
go RTSFlags{..} AppEnv{..}=
let ProfFlags{..} = profilingFlags
in Info{profile = find doHeapProfile , ..}
{-# INLINE find #-}
find NoHeapProfiling = False
find _ = True
instance ToJSON Info where
toJSON Info{..} = object
[ "application" .= name
, "instanceId" .= instanceId
, "version" .= version
, "isMultithread" .= rtsSupportsBoundThreads
, "isProfile" .= profile
, "os" .= os
, "arch" .= arch
, "compiler" .= (compilerName <> "-" <> showVersion compilerVersion)
]