Delay systemd notify ready until first successful healthcheck

This commit is contained in:
Gregor Kleen 2019-04-30 19:59:47 +02:00
parent 369c2227a0
commit 8ade1a1bb1
4 changed files with 17 additions and 8 deletions

View File

@ -32,6 +32,7 @@ jwt-encoding: HS256
maximum-content-length: 52428800 maximum-content-length: 52428800
health-check-interval: "_env:HEALTHCHECK_INTERVAL:60" health-check-interval: "_env:HEALTHCHECK_INTERVAL:60"
health-check-http: "_env:HEALTHCHECK_HTTP:true" health-check-http: "_env:HEALTHCHECK_HTTP:true"
health-check-delay-notify: "_env:HEALTHCHECK_DELAY_NOTIFY:true"
log-settings: log-settings:
detailed: "_env:DETAILED_LOGGING:false" detailed: "_env:DETAILED_LOGGING:false"

View File

@ -64,7 +64,7 @@ import qualified Yesod.Core.Types as Yesod (Logger(..))
import qualified Data.HashMap.Strict as HashMap import qualified Data.HashMap.Strict as HashMap
import Control.Lens import Utils.Lens
import Data.Proxy import Data.Proxy
@ -315,8 +315,16 @@ makeLogWare app = do
warpSettings :: UniWorX -> Settings warpSettings :: UniWorX -> Settings
warpSettings foundation = defaultSettings warpSettings foundation = defaultSettings
& setBeforeMainLoop (runAppLoggingT foundation $ do & setBeforeMainLoop (runAppLoggingT foundation $ do
$logInfoS "setup" "Ready" let notifyReady = do
void $ liftIO Systemd.notifyReady $logInfoS "setup" "Ready"
void $ liftIO Systemd.notifyReady
if
| foundation ^. _appHealthCheckDelayNotify
-> void . fork $ do
atomically $ readTVar (foundation ^. _appHealthReport) >>= guard . maybe False ((== HealthSuccess) . classifyHealthReport . snd)
notifyReady
| otherwise
-> notifyReady
) )
& setHost (foundation ^. _appHost) & setHost (foundation ^. _appHost)
& setPort (foundation ^. _appPort) & setPort (foundation ^. _appPort)

View File

@ -944,7 +944,7 @@ deriveJSON defaultOptions
, omitNothingFields = True , omitNothingFields = True
} ''HealthReport } ''HealthReport
data HealthStatus = HealthFailure | HealthWarning | HealthSuccess data HealthStatus = HealthFailure | HealthSuccess
deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable) deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
instance Universe HealthStatus instance Universe HealthStatus

View File

@ -48,9 +48,6 @@ import qualified Ldap.Client as Ldap
import Utils hiding (MessageStatus(..)) import Utils hiding (MessageStatus(..))
import Control.Lens import Control.Lens
import Data.Maybe (fromJust)
import qualified Data.Char as Char
import qualified Network.HaskellNet.Auth as HaskellNet (UserName, Password, AuthType(..)) import qualified Network.HaskellNet.Auth as HaskellNet (UserName, Password, AuthType(..))
import qualified Network.Socket as HaskellNet (PortNumber(..), HostName) import qualified Network.Socket as HaskellNet (PortNumber(..), HostName)
import qualified Network import qualified Network
@ -111,8 +108,10 @@ data AppSettings = AppSettings
, appMaximumContentLength :: Maybe Word64 , appMaximumContentLength :: Maybe Word64
, appJwtExpiration :: Maybe NominalDiffTime , appJwtExpiration :: Maybe NominalDiffTime
, appJwtEncoding :: JwtEncoding , appJwtEncoding :: JwtEncoding
, appHealthCheckInterval :: NominalDiffTime , appHealthCheckInterval :: NominalDiffTime
, appHealthCheckHTTP :: Bool , appHealthCheckHTTP :: Bool
, appHealthCheckDelayNotify :: Bool
, appInitialLogSettings :: LogSettings , appInitialLogSettings :: LogSettings
@ -280,7 +279,7 @@ deriveFromJSON
deriveJSON deriveJSON
defaultOptions defaultOptions
{ constructorTagModifier = over (ix 1) Char.toLower . fromJust . stripPrefix "Level" { constructorTagModifier = camelToPathPiece' 1
, sumEncoding = UntaggedValue , sumEncoding = UntaggedValue
} }
''LogLevel ''LogLevel
@ -382,6 +381,7 @@ instance FromJSON AppSettings where
appHealthCheckInterval <- o .: "health-check-interval" appHealthCheckInterval <- o .: "health-check-interval"
appHealthCheckHTTP <- o .: "health-check-http" appHealthCheckHTTP <- o .: "health-check-http"
appHealthCheckDelayNotify <- o .: "health-check-delay-notify"
appSessionTimeout <- o .: "session-timeout" appSessionTimeout <- o .: "session-timeout"