Skip to content

Commit aa5f117

Browse files
committed
Track total time spent executing queries
1 parent 32b798d commit aa5f117

File tree

4 files changed

+19
-5
lines changed

4 files changed

+19
-5
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# hpqtypes-1.13.0.0 (2025-??-??)
2+
* Include time spent executing queries in `ConnectionStats`.
3+
* Add `initialConnectionStats`.
4+
15
# hpqtypes-1.12.0.0 (2024-03-18)
26
* Drop support for GHC 8.8.
37
* Attach `CallStack` and `BackendPid` to `DBException`.

hpqtypes.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cabal-version: 3.0
22
build-type: Simple
33
name: hpqtypes
4-
version: 1.12.0.0
4+
version: 1.13.0.0
55
synopsis: Haskell bindings to libpqtypes
66

77
description: Efficient and easy-to-use bindings to (slightly modified)

src/Database/PostgreSQL/PQTypes.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Database.PostgreSQL.PQTypes
55
-- * Connection
66
Connection
77
, ConnectionStats (..)
8+
, initialConnectionStats
89
, ConnectionSettings (..)
910
, defaultConnectionSettings
1011
, ConnectionSourceM

src/Database/PostgreSQL/PQTypes/Internal/Connection.hs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Database.PostgreSQL.PQTypes.Internal.Connection
55
, ConnectionData (..)
66
, withConnectionData
77
, ConnectionStats (..)
8+
, initialConnectionStats
89
, ConnectionSettings (..)
910
, defaultConnectionSettings
1011
, ConnectionSourceM (..)
@@ -42,6 +43,7 @@ import Data.Text.Encoding qualified as T
4243
import Foreign.C.String
4344
import Foreign.ForeignPtr
4445
import Foreign.Ptr
46+
import GHC.Clock (getMonotonicTime)
4547
import GHC.Conc (closeFdWith)
4648
import GHC.Stack
4749

@@ -95,17 +97,20 @@ data ConnectionStats = ConnectionStats
9597
-- ^ Number of values fetched from the database.
9698
, statsParams :: !Int
9799
-- ^ Number of parameters sent to the database.
100+
, statsTime :: Double
101+
-- ^ Time spent executing queries (in seconds).
98102
}
99103
deriving (Eq, Ord, Show)
100104

101105
-- | Initial connection statistics.
102-
initialStats :: ConnectionStats
103-
initialStats =
106+
initialConnectionStats :: ConnectionStats
107+
initialConnectionStats =
104108
ConnectionStats
105109
{ statsQueries = 0
106110
, statsRows = 0
107111
, statsValues = 0
108112
, statsParams = 0
113+
, statsTime = 0
109114
}
110115

111116
-- | Representation of a connection object.
@@ -200,7 +205,7 @@ poolSource cs mkPoolConfig = do
200205

201206
clearStats conn@(Connection mv) = do
202207
liftBase . modifyMVar_ mv $ \mconn ->
203-
pure $ (\cd -> cd {cdStats = initialStats}) <$> mconn
208+
pure $ (\cd -> cd {cdStats = initialConnectionStats}) <$> mconn
204209
pure conn
205210

206211
----------------------------------------
@@ -230,7 +235,7 @@ connect ConnectionSettings {..} = mask $ \unmask -> do
230235
ConnectionData
231236
{ cdPtr = connPtr
232237
, cdBackendPid = noBackendPid
233-
, cdStats = initialStats
238+
, cdStats = initialConnectionStats
234239
, cdPreparedQueries = preparedQueries
235240
}
236241
F.forM_ csRole $ \role -> runQueryIO conn $ "SET ROLE " <> role
@@ -380,14 +385,17 @@ runQueryImpl fname conn sql execSql = do
380385
-- are able to receive asynchronous exceptions (assuming that threaded GHC
381386
-- runtime system is used) and react appropriately.
382387
queryRunner <- async . restore $ do
388+
t1 <- getMonotonicTime
383389
(paramCount, res) <- execSql cd
390+
t2 <- getMonotonicTime
384391
affected <- withForeignPtr res $ verifyResult sql cdBackendPid cdPtr
385392
stats' <- case affected of
386393
Left _ ->
387394
pure
388395
cdStats
389396
{ statsQueries = statsQueries cdStats + 1
390397
, statsParams = statsParams cdStats + paramCount
398+
, statsTime = statsTime cdStats + (t2 - t1)
391399
}
392400
Right rows -> do
393401
columns <- fromIntegral <$> withForeignPtr res c_PQnfields
@@ -397,6 +405,7 @@ runQueryImpl fname conn sql execSql = do
397405
, statsRows = statsRows cdStats + rows
398406
, statsValues = statsValues cdStats + (rows * columns)
399407
, statsParams = statsParams cdStats + paramCount
408+
, statsTime = statsTime cdStats + (t2 - t1)
400409
}
401410
pure (cd {cdStats = stats'}, (either id id affected, res))
402411
-- If we receive an exception while waiting for the execution to complete,

0 commit comments

Comments
 (0)