@@ -136,7 +136,8 @@ ntfServer cfg@NtfServerConfig {transports, transportConfig = tCfg} started = do
136136 initialDelay <- (startAt - ) . fromIntegral . (`div` 1000000_000000 ) . diffTimeToPicoseconds . utctDayTime <$> liftIO getCurrentTime
137137 logInfo $ " server stats log enabled: " <> T. pack statsFilePath
138138 liftIO $ threadDelay' $ 1000000 * (initialDelay + if initialDelay < 0 then 86400 else 0 )
139- NtfServerStats {fromTime, tknCreated, tknVerified, tknDeleted, subCreated, subDeleted, ntfReceived, ntfDelivered, activeTokens, activeSubs} <- asks serverStats
139+ NtfServerStats {fromTime, tknCreated, tknVerified, tknDeleted, tknReplaced, subCreated, subDeleted, ntfReceived, ntfDelivered, ntfFailed, ntfCronDelivered, ntfCronFailed, ntfVrfQueued, ntfVrfDelivered, ntfVrfFailed, ntfVrfInvalidTkn, activeTokens, activeSubs} <-
140+ asks serverStats
140141 let interval = 1000000 * logInterval
141142 forever $ do
142143 withFile statsFilePath AppendMode $ \ h -> liftIO $ do
@@ -146,10 +147,18 @@ ntfServer cfg@NtfServerConfig {transports, transportConfig = tCfg} started = do
146147 tknCreated' <- atomicSwapIORef tknCreated 0
147148 tknVerified' <- atomicSwapIORef tknVerified 0
148149 tknDeleted' <- atomicSwapIORef tknDeleted 0
150+ tknReplaced' <- atomicSwapIORef tknReplaced 0
149151 subCreated' <- atomicSwapIORef subCreated 0
150152 subDeleted' <- atomicSwapIORef subDeleted 0
151153 ntfReceived' <- atomicSwapIORef ntfReceived 0
152154 ntfDelivered' <- atomicSwapIORef ntfDelivered 0
155+ ntfFailed' <- atomicSwapIORef ntfFailed 0
156+ ntfCronDelivered' <- atomicSwapIORef ntfCronDelivered 0
157+ ntfCronFailed' <- atomicSwapIORef ntfCronFailed 0
158+ ntfVrfQueued' <- atomicSwapIORef ntfVrfQueued 0
159+ ntfVrfDelivered' <- atomicSwapIORef ntfVrfDelivered 0
160+ ntfVrfFailed' <- atomicSwapIORef ntfVrfFailed 0
161+ ntfVrfInvalidTkn' <- atomicSwapIORef ntfVrfInvalidTkn 0
153162 tkn <- liftIO $ periodStatCounts activeTokens ts
154163 sub <- liftIO $ periodStatCounts activeSubs ts
155164 hPutStrLn h $
@@ -168,7 +177,15 @@ ntfServer cfg@NtfServerConfig {transports, transportConfig = tCfg} started = do
168177 monthCount tkn,
169178 dayCount sub,
170179 weekCount sub,
171- monthCount sub
180+ monthCount sub,
181+ show tknReplaced',
182+ show ntfFailed',
183+ show ntfCronDelivered',
184+ show ntfCronFailed',
185+ show ntfVrfQueued',
186+ show ntfVrfDelivered',
187+ show ntfVrfFailed',
188+ show ntfVrfInvalidTkn'
172189 ]
173190 liftIO $ threadDelay' interval
174191
@@ -225,9 +242,18 @@ ntfServer cfg@NtfServerConfig {transports, transportConfig = tCfg} started = do
225242 putStat " tknCreated" tknCreated
226243 putStat " tknVerified" tknVerified
227244 putStat " tknDeleted" tknDeleted
245+ putStat " tknReplaced" tknReplaced
228246 putStat " subCreated" subCreated
229247 putStat " subDeleted" subDeleted
230248 putStat " ntfReceived" ntfReceived
249+ putStat " ntfDelivered" ntfDelivered
250+ putStat " ntfFailed" ntfFailed
251+ putStat " ntfCronDelivered" ntfCronDelivered
252+ putStat " ntfCronFailed" ntfCronFailed
253+ putStat " ntfVrfQueued" ntfVrfQueued
254+ putStat " ntfVrfDelivered" ntfVrfDelivered
255+ putStat " ntfVrfFailed" ntfVrfFailed
256+ putStat " ntfVrfInvalidTkn" ntfVrfInvalidTkn
231257 getStat (day . activeTokens) >>= \ v -> hPutStrLn h $ " daily active tokens: " <> show (IS. size v)
232258 getStat (day . activeSubs) >>= \ v -> hPutStrLn h $ " daily active subscriptions: " <> show (IS. size v)
233259 CPStatsRTS -> tryAny getRTSStats >>= either (hPrint h) (hPrint h)
@@ -242,15 +268,19 @@ ntfServer cfg@NtfServerConfig {transports, transportConfig = tCfg} started = do
242268#else
243269 hPutStrLn h " Threads: not available on GHC 8.10"
244270#endif
245- NtfSubscriber {smpSubscribers, smpAgent = a} <- unliftIO u $ asks subscriber
271+ NtfEnv {subscriber, pushServer} <- unliftIO u ask
272+ let NtfSubscriber {smpSubscribers, smpAgent = a} = subscriber
273+ NtfPushServer {pushQ} = pushServer
274+ SMPClientAgent {smpClients, smpSessions, srvSubs, pendingSrvSubs, smpSubWorkers} = a
246275 putSMPWorkers a " SMP subcscribers" smpSubscribers
247- let SMPClientAgent {smpClients, smpSessions, srvSubs, pendingSrvSubs, smpSubWorkers} = a
248276 putSMPWorkers a " SMP clients" smpClients
249277 putSMPWorkers a " SMP subscription workers" smpSubWorkers
250278 sessions <- readTVarIO smpSessions
251279 hPutStrLn h $ " SMP sessions count: " <> show (M. size sessions)
252280 putSMPSubs a " SMP subscriptions" srvSubs
253281 putSMPSubs a " Pending SMP subscriptions" pendingSrvSubs
282+ sz <- atomically $ lengthTBQueue pushQ
283+ hPutStrLn h $ " Push notifications queue length: " <> show sz
254284 where
255285 putSMPSubs :: SMPClientAgent -> String -> TMap SMPServer (TMap SMPSub a ) -> IO ()
256286 putSMPSubs a name v = do
@@ -432,7 +462,7 @@ ntfSubscriber NtfSubscriber {smpSubscribers, newSubQ, smpAgent = ca@SMPClientAge
432462
433463ntfPush :: NtfPushServer -> M ()
434464ntfPush s@ NtfPushServer {pushQ} = forever $ do
435- (tkn@ NtfTknData {ntfTknId, token = DeviceToken pp _, tknStatus}, ntf) <- atomically (readTBQueue pushQ)
465+ (tkn@ NtfTknData {ntfTknId, token = t @ ( DeviceToken pp _) , tknStatus}, ntf) <- atomically (readTBQueue pushQ)
436466 liftIO $ logDebug $ " sending push notification to " <> T. pack (show pp)
437467 status <- readTVarIO tknStatus
438468 case ntf of
@@ -444,14 +474,16 @@ ntfPush s@NtfPushServer {pushQ} = forever $ do
444474 NTConfirmed -> (Nothing , NTConfirmed )
445475 _ -> (Just NTConfirmed , NTConfirmed )
446476 forM_ status_ $ \ status' -> withNtfLog $ \ sl -> logTokenStatus sl ntfTknId status'
447- _ -> pure ()
477+ incNtfStatT t ntfVrfDelivered
478+ Left _ -> incNtfStatT t ntfVrfFailed
448479 PNCheckMessages -> checkActiveTkn status $ do
449- void $ deliverNotification pp tkn ntf
480+ deliverNotification pp tkn ntf
481+ >>= incNtfStatT t . (\ case Left _ -> ntfCronFailed; Right () -> ntfCronDelivered)
450482 PNMessage {} -> checkActiveTkn status $ do
451483 stats <- asks serverStats
452484 liftIO $ updatePeriodStats (activeTokens stats) ntfTknId
453- void $ deliverNotification pp tkn ntf
454- incNtfStat ntfDelivered
485+ deliverNotification pp tkn ntf
486+ >>= incNtfStatT t . ( \ case Left _ -> ntfFailed; Right () -> ntfDelivered)
455487 where
456488 checkActiveTkn :: NtfTknStatus -> M () -> M ()
457489 checkActiveTkn status action
@@ -466,14 +498,18 @@ ntfPush s@NtfPushServer {pushQ} = forever $ do
466498 PPConnection _ -> retryDeliver
467499 PPRetryLater -> retryDeliver
468500 PPCryptoError _ -> err e
469- PPResponseError _ _ -> err e
501+ PPResponseError {} -> err e
470502 PPTokenInvalid r -> updateTknStatus tkn (NTInvalid $ Just r) >> err e
471503 PPPermanentError -> err e
472504 where
473505 retryDeliver :: M (Either PushProviderError () )
474506 retryDeliver = do
475507 deliver <- liftIO $ newPushClient s pp
476- liftIO (runExceptT $ deliver tkn ntf) >>= either err (pure . Right )
508+ liftIO (runExceptT $ deliver tkn ntf) >>= \ case
509+ Right _ -> pure $ Right ()
510+ Left e -> case e of
511+ PPTokenInvalid r -> updateTknStatus tkn (NTInvalid $ Just r) >> err e
512+ _ -> err e
477513 err e = logError (" Push provider error (" <> tshow pp <> " , " <> tshow ntfTknId <> " ): " <> tshow e) $> Left e
478514
479515updateTknStatus :: NtfTknData -> NtfTknStatus -> M ()
@@ -593,7 +629,6 @@ client NtfServerClient {rcvQ, sndQ} NtfSubscriber {newSubQ, smpAgent = ca} NtfPu
593629 let t' = Just ts'
594630 t <- atomically $ swapTVar tknUpdatedAt t'
595631 unless (t' == t) $ withNtfLog $ \ s -> logUpdateTokenTime s ntfTknId ts'
596-
597632 processCommand :: NtfRequest -> M (Transmission NtfResponse )
598633 processCommand = \ case
599634 NtfReqNew corrId (ANE SToken newTkn@ (NewNtfTkn token _ dhPubKey)) -> do
@@ -607,6 +642,7 @@ client NtfServerClient {rcvQ, sndQ} NtfSubscriber {newSubQ, smpAgent = ca} NtfPu
607642 tkn <- liftIO $ mkNtfTknData tknId newTkn ks dhSecret regCode ts
608643 atomically $ addNtfToken st tknId tkn
609644 atomically $ writeTBQueue pushQ (tkn, PNVerification regCode)
645+ incNtfStatT token ntfVrfQueued
610646 withNtfLog (`logCreateToken` tkn)
611647 incNtfStatT token tknCreated
612648 pure (corrId, NoEntity , NRTknId tknId srvDhPubKey)
@@ -620,6 +656,7 @@ client NtfServerClient {rcvQ, sndQ} NtfSubscriber {newSubQ, smpAgent = ca} NtfPu
620656 if tknDhSecret == dhSecret
621657 then do
622658 atomically $ writeTBQueue pushQ (tkn, PNVerification tknRegCode)
659+ incNtfStatT token ntfVrfQueued
623660 pure $ NRTknId ntfTknId srvDhPubKey
624661 else pure $ NRErr AUTH
625662 TVFY code -- this allows repeated verification for cases when client connection dropped before server response
@@ -647,9 +684,9 @@ client NtfServerClient {rcvQ, sndQ} NtfSubscriber {newSubQ, smpAgent = ca} NtfPu
647684 let tkn' = tkn {token = token', tknRegCode = regCode}
648685 addNtfToken st tknId tkn'
649686 writeTBQueue pushQ (tkn', PNVerification regCode)
687+ incNtfStatT token ntfVrfQueued
650688 withNtfLog $ \ s -> logUpdateToken s tknId token' regCode
651- incNtfStatT token tknDeleted
652- incNtfStatT token tknCreated
689+ incNtfStatT token tknReplaced
653690 pure NROk
654691 TDEL -> do
655692 logDebug " TDEL"
0 commit comments