refactor(admin): problem caching indicator made human readable
This commit is contained in:
parent
98c2189b54
commit
0fa70b6e1f
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user