@@ -75,6 +75,26 @@ SELECT
7575FROM %s;
7676`
7777
78+ const ioStatisticSQLPg16 string = `
79+ SELECT backend_type,
80+ object,
81+ context,
82+ coalesce(reads, 0),
83+ coalesce(read_time, 0),
84+ coalesce(writes, 0),
85+ coalesce(write_time, 0),
86+ coalesce(writebacks, 0),
87+ coalesce(writeback_time, 0),
88+ coalesce(extends, 0),
89+ coalesce(extend_time, 0),
90+ coalesce(hits, 0),
91+ coalesce(evictions, 0),
92+ coalesce(reuses, 0),
93+ coalesce(fsyncs, 0),
94+ coalesce(fsync_time, 0)
95+ FROM pg_stat_io
96+ `
97+
7898func GetServerStats (ctx context.Context , c * Collection , db * sql.DB , ps state.PersistedState , ts state.TransientState ) (state.PersistedState , state.TransientState , error ) {
7999 var stats state.PostgresServerStats
80100 var transactionIdSQL string
@@ -83,6 +103,10 @@ func GetServerStats(ctx context.Context, c *Collection, db *sql.DB, ps state.Per
83103 if err != nil {
84104 return ps , ts , err
85105 }
106+ ps .ServerIoStats , err = GetPgStatIo (ctx , c , db )
107+ if err != nil {
108+ return ps , ts , err
109+ }
86110
87111 // Only collect transaction ID or xmin horizon related stats with non-replicas
88112 if isReplica , err := getIsReplica (ctx , db ); err == nil && ! isReplica {
@@ -145,3 +169,32 @@ func getPgStatStatementsInfo(ctx context.Context, db *sql.DB, stats *state.PgSta
145169 )
146170 return err
147171}
172+
173+ func GetPgStatIo (ctx context.Context , c * Collection , db * sql.DB ) (stats state.PostgresServerIoStatsMap , err error ) {
174+ stats = make (state.PostgresServerIoStatsMap )
175+ var rows * sql.Rows
176+ if c .PostgresVersion .Numeric < state .PostgresVersion16 {
177+ return
178+ }
179+ rows , err = db .Query (QueryMarkerSQL + ioStatisticSQLPg16 )
180+ if err != nil {
181+ return
182+ }
183+ defer rows .Close ()
184+ for rows .Next () {
185+ var k state.PostgresServerIoStatsKey
186+ var s state.PostgresServerIoStats
187+ err = rows .Scan (& k .BackendType , & k .IoObject , & k .IoContext ,
188+ & s .Reads , & s .ReadTime , & s .Writes , & s .WriteTime ,
189+ & s .Writebacks , & s .WritebackTime , & s .Extends ,
190+ & s .ExtendTime , & s .Hits , & s .Evictions ,
191+ & s .Reuses , & s .Fsyncs , & s .FsyncTime ,
192+ )
193+ if err != nil {
194+ return
195+ }
196+ stats [k ] = s
197+ }
198+ err = rows .Err ()
199+ return
200+ }
0 commit comments