refactor(health): show all health checks that may lead to failure (WIP)
This commit is contained in:
parent
ee4e67fbda
commit
9b93c00301
@ -3,12 +3,13 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
HealthReport: Instanz-Zustand
|
HealthReport: Instanz-Zustand
|
||||||
HealthMatchingClusterConfig: Cluster-geteilte Konfiguration ist aktuell
|
HealthCheckMatchingClusterConfig: Cluster-geteilte Konfiguration ist aktuell
|
||||||
HealthHTTPReachable: Cluster kann an der erwarteten URL über HTTP erreicht werden
|
HealthCheckHTTPReachable: Cluster kann an der erwarteten URL über HTTP erreicht werden
|
||||||
HealthLDAPAdmins: Anteil der Administrator:innen mit LDAP Authentifizierung, welche tatsächlich im LDAP-Verzeichnis gefunden werden können
|
HealthCheckLDAPAdmins: Anteil der Administrator:innen mit LDAP Authentifizierung, welche tatsächlich im LDAP-Verzeichnis gefunden werden können
|
||||||
HealthSMTPConnect: SMTP-Server kann erreicht werden
|
HealthCheckSMTPConnect: SMTP-Server kann erreicht werden
|
||||||
HealthWidgetMemcached: Memcached-Server liefert Widgets korrekt aus
|
HealthCheckWidgetMemcached: Memcached-Server liefert Widgets korrekt aus
|
||||||
HealthActiveJobExecutors: Anteil der job-workers, die neue Befehle annehmen
|
HealthCheckActiveJobExecutors: Anteil der job-workers, die neue Befehle annehmen
|
||||||
|
HealthCheckDoesFlush: Zustandspüfung läuft durch
|
||||||
InstanceIdentification: Instanz-Identifikation
|
InstanceIdentification: Instanz-Identifikation
|
||||||
InstanceId: Instanz-Nummer
|
InstanceId: Instanz-Nummer
|
||||||
ClusterId: Cluster-Nummer
|
ClusterId: Cluster-Nummer
|
||||||
@ -3,12 +3,13 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
HealthReport: Health report
|
HealthReport: Health report
|
||||||
HealthMatchingClusterConfig: Cluster config matches
|
HealthCheckMatchingClusterConfig: Cluster config matches
|
||||||
HealthHTTPReachable: Cluster can be reached under the expected URL via HTTP
|
HealthCheckHTTPReachable: Cluster can be reached under the expected URL via HTTP
|
||||||
HealthLDAPAdmins: Proportion of administrators with LDAP authentication that were actually found in the LDAP directory
|
HealthCheckLDAPAdmins: Proportion of administrators with LDAP authentication that were actually found in the LDAP directory
|
||||||
HealthSMTPConnect: SMTP server is reachable
|
HealthCheckSMTPConnect: SMTP server is reachable
|
||||||
HealthWidgetMemcached: Memcached server is serving widgets correctly
|
HealthCheckWidgetMemcached: Memcached server is serving widgets correctly
|
||||||
HealthActiveJobExecutors: Proportion of job workers accepting new jobs
|
HealthCheckActiveJobExecutors: Proportion of job workers accepting new jobs
|
||||||
|
HealthCheckDoesFlush: Health reports flushes
|
||||||
InstanceIdentification: Instance identification
|
InstanceIdentification: Instance identification
|
||||||
InstanceId: Instance id
|
InstanceId: Instance id
|
||||||
ClusterId: Cluster id
|
ClusterId: Cluster id
|
||||||
|
|||||||
@ -247,6 +247,7 @@ mkMessageVariant ''UniWorX ''PWHashMessage "messages/auth/pw-hash" "de"
|
|||||||
mkMessageVariant ''UniWorX ''ButtonMessage "messages/button" "de"
|
mkMessageVariant ''UniWorX ''ButtonMessage "messages/button" "de"
|
||||||
mkMessageVariant ''UniWorX ''FrontendMessage "messages/frontend" "de-de-formal"
|
mkMessageVariant ''UniWorX ''FrontendMessage "messages/frontend" "de-de-formal"
|
||||||
|
|
||||||
|
embedRenderMessage ''UniWorX ''HealthCheck id -- not possible here
|
||||||
embedRenderMessage ''UniWorX ''AvsLicence id -- required by UniWorXAvsMessages
|
embedRenderMessage ''UniWorX ''AvsLicence id -- required by UniWorXAvsMessages
|
||||||
mkMessageAddition ''UniWorX "Qualification" "messages/uniworx/categories/qualification" "de-de-formal"
|
mkMessageAddition ''UniWorX "Qualification" "messages/uniworx/categories/qualification" "de-de-formal"
|
||||||
mkMessageAddition ''UniWorX "Avs" "messages/uniworx/categories/avs" "de-de-formal"
|
mkMessageAddition ''UniWorX "Avs" "messages/uniworx/categories/avs" "de-de-formal"
|
||||||
|
|||||||
@ -34,7 +34,7 @@ getHealthR = do
|
|||||||
waitResult <- atomically $ maybe (pure $ Left False) (fmap (const $ Left True) . waitDelay) delay <|> (fmap Right . assertM (not. Set.null) $ readTVar reportStore)
|
waitResult <- atomically $ maybe (pure $ Left False) (fmap (const $ Left True) . waitDelay) delay <|> (fmap Right . assertM (not. Set.null) $ readTVar reportStore)
|
||||||
case waitResult of
|
case waitResult of
|
||||||
Left False -> sendResponseStatus noContent204 ()
|
Left False -> sendResponseStatus noContent204 ()
|
||||||
Left True -> sendResponseStatus internalServerError500 ("System is not generating HealthReports" :: Text)
|
Left True -> sendResponseStatus internalServerError500 ("System is not generating HealthReports" :: Text) -- can this ever happen after it was non-null?
|
||||||
Right _ -> redirect HealthR
|
Right _ -> redirect HealthR
|
||||||
Just healthReports -> do
|
Just healthReports -> do
|
||||||
let (Max lastUpdated, Min status) = ofoldMap1 (Max *** Min . healthReportStatus) healthReports
|
let (Max lastUpdated, Min status) = ofoldMap1 (Max *** Min . healthReportStatus) healthReports
|
||||||
@ -57,28 +57,41 @@ getHealthR = do
|
|||||||
setTitleI MsgHealthReport
|
setTitleI MsgHealthReport
|
||||||
[whamlet|
|
[whamlet|
|
||||||
$newline never
|
$newline never
|
||||||
|
<h2>
|
||||||
|
$case status
|
||||||
|
$of HealthSuccess
|
||||||
|
_{MsgMessageSuccess}
|
||||||
|
$of _
|
||||||
|
_{MsgMessageError}
|
||||||
|
<hr>
|
||||||
<dl .deflist>
|
<dl .deflist>
|
||||||
$forall (_, report) <- healthReports'
|
$forall (_, report) <- healthReports'
|
||||||
$case report
|
$with hcclass = classifyHealthReport report
|
||||||
$of HealthMatchingClusterConfig passed
|
$with hcstatus = HealthSuccess == healthReportStatus report
|
||||||
<dt .deflist__dt>_{MsgHealthMatchingClusterConfig}
|
$case report
|
||||||
<dd .deflist__dd>#{boolSymbol passed}
|
$of HealthMatchingClusterConfig passed
|
||||||
$of HealthHTTPReachable (Just passed)
|
<dt .deflist__dt>_{MsgHealthCheckMatchingClusterConfig}
|
||||||
<dt .deflist__dt>_{MsgHealthHTTPReachable}
|
<dd .deflist__dd>#{boolSymbol passed}
|
||||||
<dd .deflist__dd>#{boolSymbol passed}
|
$of HealthHTTPReachable (Just passed)
|
||||||
$of HealthLDAPAdmins (Just found)
|
<dt .deflist__dt>_{MsgHealthCheckHTTPReachable}
|
||||||
<dt .deflist__dt>_{MsgHealthLDAPAdmins}
|
<dd .deflist__dd>#{boolSymbol passed}
|
||||||
<dd .deflist__dd>#{textPercent found 1}
|
$of HealthLDAPAdmins (Just found)
|
||||||
$of HealthSMTPConnect (Just passed)
|
<dt .deflist__dt>_{MsgHealthCheckLDAPAdmins}
|
||||||
<dt .deflist__dt>_{MsgHealthSMTPConnect}
|
<dd .deflist__dd>#{textPercent found 1}
|
||||||
<dd .deflist__dd>#{boolSymbol passed}
|
$of HealthSMTPConnect (Just passed)
|
||||||
$of HealthWidgetMemcached (Just passed)
|
<dt .deflist__dt>_{MsgHealthCheckSMTPConnect}
|
||||||
<dt .deflist__dt>_{MsgHealthWidgetMemcached}
|
<dd .deflist__dd>#{boolSymbol passed}
|
||||||
<dd .deflist__dd>#{boolSymbol passed}
|
$of HealthWidgetMemcached (Just passed)
|
||||||
$of HealthActiveJobExecutors (Just active)
|
<dt .deflist__dt>_{MsgHealthCheckWidgetMemcached}
|
||||||
<dt .deflist__dt>_{MsgHealthActiveJobExecutors}
|
<dd .deflist__dd>#{boolSymbol passed}
|
||||||
<dd .deflist__dd>#{textPercent active 1}
|
$of HealthActiveJobExecutors (Just active)
|
||||||
$of _
|
<dt .deflist__dt>_{MsgHealthCheckActiveJobExecutors}
|
||||||
|
<dd .deflist__dd>#{textPercent active 1}
|
||||||
|
$of HealthDoesFlush mProp
|
||||||
|
<dt .deflist__dt>_{hcclass}
|
||||||
|
<dd .deflist__dd>#{boolSymbol hcstatus}
|
||||||
|
$of _
|
||||||
|
|
||||||
|]
|
|]
|
||||||
provideJson healthReports
|
provideJson healthReports
|
||||||
provideRep . return . Builder.toLazyText $ Aeson.encodePrettyToTextBuilder healthReports
|
provideRep . return . Builder.toLazyText $ Aeson.encodePrettyToTextBuilder healthReports
|
||||||
@ -105,7 +118,7 @@ getInstanceR = do
|
|||||||
provideRep . return $ tshow instanceInfo
|
provideRep . return $ tshow instanceInfo
|
||||||
|
|
||||||
|
|
||||||
-- Most simple page for simple liveness checks
|
-- Most simple page for simple liveness checks, but it always delivers 200
|
||||||
getStatusR :: Handler Html
|
getStatusR :: Handler Html
|
||||||
getStatusR = do
|
getStatusR = do
|
||||||
starttime <- getsYesod appStartTime
|
starttime <- getsYesod appStartTime
|
||||||
|
|||||||
@ -27,6 +27,8 @@ instance Finite HealthCheck
|
|||||||
instance Hashable HealthCheck
|
instance Hashable HealthCheck
|
||||||
instance NFData HealthCheck
|
instance NFData HealthCheck
|
||||||
|
|
||||||
|
-- embedRenderMessage ''UniWorX ''HealthCheck id -- not possible here
|
||||||
|
|
||||||
deriveJSON defaultOptions
|
deriveJSON defaultOptions
|
||||||
{ constructorTagModifier = camelToPathPiece' 2
|
{ constructorTagModifier = camelToPathPiece' 2
|
||||||
} ''HealthCheck
|
} ''HealthCheck
|
||||||
|
|||||||
Reference in New Issue
Block a user