packages feed

keiro-pgmq-0.2.0.0: src/Keiro/PGMQ/Metrics.hs

{-# LANGUAGE DataKinds #-}

{- | Typed, 'Job'-keyed queue metrics for @keiro-pgmq@.

PGMQ stores each queue as a table @pgmq.q_<name>@; its @metrics()@ function reports
depth and message age. These helpers fetch that 'QueueMetrics' for a job's MAIN
queue and its DEAD-LETTER queue without the caller deriving any physical name.

Use 'jobDlqMetrics' (its 'queueLength') for the depth alerting that
'Keiro.PGMQ.Dlq' recommends; pair it with 'Keiro.PGMQ.Dlq.archiveDlq' /
'Keiro.PGMQ.Dlq.purgeDlq' for retention.
-}
module Keiro.PGMQ.Metrics (
    QueueMetrics (..),
    jobQueueMetrics,
    jobDlqMetrics,
    queueDepth,
    allJobMetrics,
) where

import Keiro.PGMQ.Job (Job (..))
import Keiro.PGMQ.Runtime (QueueRef (..))
import "base" Data.Int (Int64)
import "effectful-core" Effectful (Eff, (:>))
import "pgmq-effectful" Pgmq.Effectful (Pgmq, QueueMetrics (..))
import "pgmq-effectful" Pgmq.Effectful qualified as Pgmq

-- | The metrics for a job's MAIN queue (depth, visible depth, oldest/newest age, throughput).
jobQueueMetrics :: (Pgmq :> es) => Job p -> Eff es QueueMetrics
jobQueueMetrics job = Pgmq.queueMetrics job.jobQueue.physicalName

-- | The metrics for a job's DEAD-LETTER queue. Use its 'queueLength' for depth alerting.
jobDlqMetrics :: (Pgmq :> es) => Job p -> Eff es QueueMetrics
jobDlqMetrics job = Pgmq.queueMetrics job.jobQueue.dlqName

-- | The main queue's immediately-readable depth (PGMQ 'queueVisibleLength'): "work waiting".
queueDepth :: (Pgmq :> es) => Job p -> Eff es Int64
queueDepth job = do
    metrics <- jobQueueMetrics job
    pure metrics.queueVisibleLength

-- | Every queue's metrics (passthrough over 'Pgmq.Effectful.allQueueMetrics'); not Job-keyed.
allJobMetrics :: (Pgmq :> es) => Eff es [QueueMetrics]
allJobMetrics = Pgmq.allQueueMetrics