Skip to content

Commit 27d7793

Browse files
authored
Collect statistics from pg_stat_io (Postgres 16+) (#553)
1 parent 825a990 commit 27d7793

File tree

15 files changed

+2166
-1420
lines changed

15 files changed

+2166
-1420
lines changed

input/postgres/server_stats.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,26 @@ SELECT
7575
FROM %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+
7898
func 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

Comments
 (0)