refactor(admin): problem caching indicator made human readable

This commit is contained in:
Steffen Jost 2025-02-14 17:01:54 +01:00
parent 98c2189b54
commit 0fa70b6e1f
7 changed files with 34 additions and 22 deletions

View File

@ -109,7 +109,7 @@ ProblemsDriverSynch1up: Alle gültigen Vorfeld-Fahrberechtigungen 'F' sind im AV
ProblemsDriverSynch2: Alle gültigen Rollfeld-Fahrberechtigungen 'R' sind im AVS eingetragen ProblemsDriverSynch2: Alle gültigen Rollfeld-Fahrberechtigungen 'R' sind im AVS eingetragen
ProblemsRDriversHaveFs: Alle Inhaber einer Rollfeld-Fahrberechtigung besitzen auch eine gültige Vorfeld-Fahrberechtigung ProblemsRDriversHaveFs: Alle Inhaber einer Rollfeld-Fahrberechtigung besitzen auch eine gültige Vorfeld-Fahrberechtigung
ProblemsDriversHaveAvsIds: Alle Inhaber einer Fahrberechtigung konnten einer AVS Identifikationsnummer zugeordnet werden ProblemsDriversHaveAvsIds: Alle Inhaber einer Fahrberechtigung konnten einer AVS Identifikationsnummer zugeordnet werden
ProblemsUsersAreReachable: Für alle Benutzer ist eine E-Mail oder postalische Adresse bekannt ProblemsUsersAreReachable: Für alle Benutzer ist eine E-Mail oder postalische Adresse bekannt
ProblemsNoStalePrintJobs n@Integer: Alle Briefversandaufträge #{pluralDE n "des vergangenen Tages" ("der vergangenen "<> tshow n <> " Tage")} wurden von der Druckerei bestätigt ProblemsNoStalePrintJobs n@Integer: Alle Briefversandaufträge #{pluralDE n "des vergangenen Tages" ("der vergangenen "<> tshow n <> " Tage")} wurden von der Druckerei bestätigt
ProblemsNoBadAPCIds: Alle kürzlich empfangenen Druckauftragsbestätigungen waren gültig ProblemsNoBadAPCIds: Alle kürzlich empfangenen Druckauftragsbestätigungen waren gültig
ProblemsNoInsaneCompanySupervisions: Sind alle Firmen-bezogenen Ansprechpartnerbeziehungen zwischen passenden Firmenangehörigen? ProblemsNoInsaneCompanySupervisions: Sind alle Firmen-bezogenen Ansprechpartnerbeziehungen zwischen passenden Firmenangehörigen?
@ -124,7 +124,7 @@ ProblemsAvsSynchHeading: Synchronisation AVS Fahrberechtigungen
ProblemsAvsErrorHeading: Fehlermeldungen ProblemsAvsErrorHeading: Fehlermeldungen
ProblemsInterfaceSince: Berücksichtigt werden nur Erfolge und Fehler seit ProblemsInterfaceSince: Berücksichtigt werden nur Erfolge und Fehler seit
ProblemAvsUsrHadR: Momentan gültiges R im AVS ProblemAvsUsrHadR: Momentan gültiges R im AVS
ProblemCheckOncePerDay: Prüfung nur einmal pro Tag ProblemLastCheckTime t@Text: Letzte Prüfung vor #{t}
AdminProblemSolved: Erledigt AdminProblemSolved: Erledigt
AdminProblemSolver: Bearbeitet von AdminProblemSolver: Bearbeitet von

View File

@ -124,7 +124,7 @@ ProblemsAvsSynchHeading: Synchronisation AVS Driving Licences
ProblemsAvsErrorHeading: Error Log ProblemsAvsErrorHeading: Error Log
ProblemsInterfaceSince: Only considering successes and errors since ProblemsInterfaceSince: Only considering successes and errors since
ProblemAvsUsrHadR: Currenlt R valid in AVS ProblemAvsUsrHadR: Currenlt R valid in AVS
ProblemCheckOncePerDay: Checkd once per day ProblemLastCheckTime t: Last checked #{t} ago
AdminProblemSolved: Done AdminProblemSolved: Done
AdminProblemSolver: Solved by AdminProblemSolver: Solved by

View File

@ -2486,7 +2486,7 @@ pageActions ApiDocsR = return
pageActions FirmAllR = do pageActions FirmAllR = do
let navLink = defNavLink MsgMenuFirmsSupervision FirmsSupervisionR let navLink = defNavLink MsgMenuFirmsSupervision FirmsSupervisionR
navChildren = [] navChildren = []
thereAre <- liftHandler areThereInsaneCompanySupervisions (thereAre,_) <- liftHandler areThereInsaneCompanySupervisions
return [ NavPageActionPrimary{..} | thereAre ] return [ NavPageActionPrimary{..} | thereAre ]
pageActions (FirmUsersR fsh) = return pageActions (FirmUsersR fsh) = return

View File

@ -80,10 +80,14 @@ handleAdminProblems mbProblemTable = do
flagNonZero n | n <= 0 = flagError True flagNonZero n | n <= 0 = flagError True
| otherwise = messageTooltip =<< handlerToWidget (messageI Error (MsgProblemsDriverSynch n)) | otherwise = messageTooltip =<< handlerToWidget (messageI Error (MsgProblemsDriverSynch n))
thereAreInsanceFirmSupervisions <- not <$> areThereInsaneCompanySupervisions -- cached for 22h showDiffTime t =
(usersAreReachable, driversHaveAvsIds, rDriversHaveFs, not -> noStalePrintJobs, not -> noBadAPCids) <- runDBRead $ (,,,,) let d = diffUTCTime now t
<$> areAllUsersReachable in guardMonoid (d > secondsToNominalDiffTime 30) [whamlet|<small>_{MsgProblemLastCheckTime (formatDiffDays d)}|]
<*> allDriversHaveAvsId now
(usersAreReachable, aurTime) <- areAllUsersReachable -- cached
(not -> thereAreInsaneFirmSupervisions, ifsTime) <- areThereInsaneCompanySupervisions -- cached
(driversHaveAvsIds, rDriversHaveFs, not -> noStalePrintJobs, not -> noBadAPCids) <- runDBRead $ (,,,)
<$> allDriversHaveAvsId now
<*> allRDriversHaveFs now <*> allRDriversHaveFs now
<*> exists [PrintJobAcknowledged ==. Nothing, PrintJobCreated <. cutOffOldTime] <*> exists [PrintJobAcknowledged ==. Nothing, PrintJobCreated <. cutOffOldTime]
<*> exists [PrintAcknowledgeProcessed ==. False] <*> exists [PrintAcknowledgeProcessed ==. False]
@ -217,9 +221,13 @@ mkUnreachableUsersTable = do
dbtColonnade = dbtColonnade =
-} -}
areAllUsersReachable :: DBReadUq' Bool areAllUsersReachable :: Handler (Bool, UTCTime)
-- areAllUsersReachable = E.selectNotExists retrieveUnreachableUsers' -- works and would be more efficient, but we cannot check proper email validity within DB alone areAllUsersReachable = $(memcachedByHere) (Just . Right $ 22 * diffHour) [st|isane-users-reachable|] $ do
areAllUsersReachable = null <$> retrieveUnreachableUsers now <- liftIO getCurrentTime
res <- runDBRead retrieveUnreachableUsers
-- res <- E.selectNotExists retrieveUnreachableUsers' -- works and would be more efficient, but we cannot check proper email validity within DB alone
$logInfoS "sanity" [st|Are there insane company supervisions: #{tshow res}|]
return (null res,now)
-- retrieveUnreachableUsers' :: E.SqlQuery (E.SqlExpr (Entity User)) -- retrieveUnreachableUsers' :: E.SqlQuery (E.SqlExpr (Entity User))
-- retrieveUnreachableUsers' = do -- retrieveUnreachableUsers' = do

View File

@ -1,4 +1,4 @@
-- SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de> -- SPDX-FileCopyrightText: 2022-25 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Steffen Jost <s.jost@fraport.de>
-- --
-- SPDX-License-Identifier: AGPL-3.0-or-later -- SPDX-License-Identifier: AGPL-3.0-or-later
@ -7,7 +7,7 @@ module Handler.Health where
import Import import Import
import Data.Time.Format.ISO8601 (iso8601Show) import Data.Time.Format.ISO8601 (iso8601Show)
import Handler.Utils.DateTime (formatTimeW) import Handler.Utils.DateTime (formatTimeW, formatDiffDays)
import qualified Data.Aeson.Encode.Pretty as Aeson import qualified Data.Aeson.Encode.Pretty as Aeson
import qualified Data.Text.Lazy.Builder as Builder import qualified Data.Text.Lazy.Builder as Builder
@ -127,6 +127,9 @@ getStatusR = do
then tshow tdiff then tshow tdiff
else pack . iso8601Show . calendarTimeTime . fromIntegral $ truncate tdiff else pack . iso8601Show . calendarTimeTime . fromIntegral $ truncate tdiff
diffTime2 :: UTCTime -> Text
diffTime2 = formatDiffDays . diffUTCTime currtime
withUrlRenderer withUrlRenderer
[hamlet| [hamlet|
$doctype 5 $doctype 5
@ -148,11 +151,11 @@ getStatusR = do
<p> <p>
Instance Start <br> Instance Start <br>
#{show starttime} # #{show starttime} #
Uptime: #{diffTime starttime} Uptime: #{diffTime starttime} ~ #{diffTime2 starttime}
<p> <p>
Compile Time <br> Compile Time <br>
#{show cTime} # #{show cTime} #
Build age: #{diffTime cTime} Build age: #{diffTime cTime} ~ #{diffTime2 cTime}
|] |]
where where
-- vnr_full :: Text = $(embedStringFile "nix/docker/version.json") -- nix/ files not accessible during container construction -- vnr_full :: Text = $(embedStringFile "nix/docker/version.json") -- nix/ files not accessible during container construction

View File

@ -36,11 +36,12 @@ missingCompanyClient :: E.SqlExpr (Entity UserSupervisor) -> E.SqlExpr (E.Value
missingCompanyClient us = (us E.^. UserSupervisorUser) `usrDoesNotBelong` (us E.^. UserSupervisorCompany) missingCompanyClient us = (us E.^. UserSupervisorUser) `usrDoesNotBelong` (us E.^. UserSupervisorCompany)
-- | once per day, check if there are supervisionships where supervisor or client are not associated witht the supervisionship-company -- | once per day, check if there are supervisionships where supervisor or client are not associated witht the supervisionship-company
areThereInsaneCompanySupervisions :: HandlerFor UniWorX Bool areThereInsaneCompanySupervisions :: HandlerFor UniWorX (Bool, UTCTime)
areThereInsaneCompanySupervisions = $(memcachedByHere) (Just . Right $ 22 * diffHour) [st|isane-company-supervision|] $ do areThereInsaneCompanySupervisions = $(memcachedByHere) (Just . Right $ 22 * diffHour) [st|isane-company-supervision|] $ do
now <- liftIO getCurrentTime
res <- runDBRead $ E.selectExists $ do res <- runDBRead $ E.selectExists $ do
us <- E.from $ E.table @UserSupervisor us <- E.from $ E.table @UserSupervisor
E.where_ $ E.isJust (us E.^. UserSupervisorCompany) E.where_ $ E.isJust (us E.^. UserSupervisorCompany)
E.&&. (missingCompanySupervisor us E.||. missingCompanyClient us) E.&&. (missingCompanySupervisor us E.||. missingCompanyClient us)
$logInfoS "sanity" [st|Are there insane company supervisions: #{tshow res}|] $logInfoS "sanity" [st|Are there insane company supervisions: #{tshow res}|]
return res return (res,now)

View File

@ -22,13 +22,13 @@ $# SPDX-License-Identifier: AGPL-3.0-or-later
<dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch2 ProblemAvsSynchR} <dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch2 ProblemAvsSynchR}
<dt .deflist__dt>^{flagNonZero ok1down} <dt .deflist__dt>^{flagNonZero ok1down}
<dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch1down ProblemAvsSynchR} <dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch1down ProblemAvsSynchR}
<dt .deflist__dt>^{flagNonZero ok1up} <dt .deflist__dt>^{flagNonZero ok1up}
<dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch1up ProblemAvsSynchR} <dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch1up ProblemAvsSynchR}
<dt .deflist__dt>^{flagNonZero ok0} <dt .deflist__dt>^{flagNonZero ok0}
<dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch0 ProblemAvsSynchR} (_{MsgProblemCheckOncePerDay}) <dd .deflist__dd>^{simpleLinkI MsgProblemsDriverSynch0 ProblemAvsSynchR}
<dt .deflist__dt>^{flagWarning rDriversHaveFs} <dt .deflist__dt>^{flagWarning rDriversHaveFs}
<dd .deflist__dd>^{simpleLinkI MsgProblemsRDriversHaveFs ProblemFbutNoR} <dd .deflist__dd>^{simpleLinkI MsgProblemsRDriversHaveFs ProblemFbutNoR}
@ -40,7 +40,7 @@ $# SPDX-License-Identifier: AGPL-3.0-or-later
<dl .deflist> <dl .deflist>
<dt .deflist__dt>^{flagError usersAreReachable} <dt .deflist__dt>^{flagError usersAreReachable}
<dd .deflist__dd>^{simpleLinkI MsgProblemsUsersAreReachable ProblemUnreachableR} <dd .deflist__dd>^{simpleLinkI MsgProblemsUsersAreReachable ProblemUnreachableR} ^{showDiffTime aurTime}
<dt .deflist__dt>^{flagError noStalePrintJobs} <dt .deflist__dt>^{flagError noStalePrintJobs}
<dd .deflist__dd>^{simpleLinkI (MsgProblemsNoStalePrintJobs cutOffOldDays) PrintCenterR} <dd .deflist__dd>^{simpleLinkI (MsgProblemsNoStalePrintJobs cutOffOldDays) PrintCenterR}
@ -48,8 +48,8 @@ $# SPDX-License-Identifier: AGPL-3.0-or-later
<dt .deflist__dt>^{flagError noBadAPCids} <dt .deflist__dt>^{flagError noBadAPCids}
<dd .deflist__dd>_{MsgProblemsNoBadAPCIds} <dd .deflist__dd>_{MsgProblemsNoBadAPCIds}
<dt .deflist__dt>^{flagError thereAreInsanceFirmSupervisions} <dt .deflist__dt>^{flagError thereAreInsaneFirmSupervisions}
<dd .deflist__dd>^{simpleLinkI MsgProblemsNoInsaneCompanySupervisions FirmsSupervisionR} <dd .deflist__dd>^{simpleLinkI MsgProblemsNoInsaneCompanySupervisions FirmsSupervisionR} ^{showDiffTime ifsTime}
$maybe reroute <- rerouteMail $maybe reroute <- rerouteMail
<dt .deflist__dt>^{flagWarning False} <dt .deflist__dt>^{flagWarning False}