Skip to content

Commit 4bb84e9

Browse files
committed
Record table only size bytes as well in addition to the total size bytes
Signed-off-by: Felix Yuan <[email protected]>
1 parent f8b7139 commit 4bb84e9

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

Diff for: collector/pg_stat_user_tables.go

+21-3
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@ var (
156156
[]string{"datname", "schemaname", "relname"},
157157
prometheus.Labels{},
158158
)
159+
statUserTablesOnlySize = prometheus.NewDesc(
160+
prometheus.BuildFQName(namespace, userTableSubsystem, "only_size_bytes"),
161+
"Total disk space used by only this table, in bytes",
162+
[]string{"datname", "schemaname", "relname"},
163+
prometheus.Labels{},
164+
)
159165

160166
statUserTablesQuery = `SELECT
161167
current_database() datname,
@@ -180,7 +186,8 @@ var (
180186
autovacuum_count,
181187
analyze_count,
182188
autoanalyze_count,
183-
pg_total_relation_size(relid) as total_size
189+
pg_total_relation_size(relid) as total_size,
190+
pg_table_size(relid) as table_only_size
184191
FROM
185192
pg_stat_user_tables`
186193
)
@@ -198,10 +205,10 @@ func (c *PGStatUserTablesCollector) Update(ctx context.Context, instance *instan
198205
for rows.Next() {
199206
var datname, schemaname, relname sql.NullString
200207
var seqScan, seqTupRead, idxScan, idxTupFetch, nTupIns, nTupUpd, nTupDel, nTupHotUpd, nLiveTup, nDeadTup,
201-
nModSinceAnalyze, vacuumCount, autovacuumCount, analyzeCount, autoanalyzeCount, totalSize sql.NullInt64
208+
nModSinceAnalyze, vacuumCount, autovacuumCount, analyzeCount, autoanalyzeCount, totalSize, tableOnlySize sql.NullInt64
202209
var lastVacuum, lastAutovacuum, lastAnalyze, lastAutoanalyze sql.NullTime
203210

204-
if err := rows.Scan(&datname, &schemaname, &relname, &seqScan, &seqTupRead, &idxScan, &idxTupFetch, &nTupIns, &nTupUpd, &nTupDel, &nTupHotUpd, &nLiveTup, &nDeadTup, &nModSinceAnalyze, &lastVacuum, &lastAutovacuum, &lastAnalyze, &lastAutoanalyze, &vacuumCount, &autovacuumCount, &analyzeCount, &autoanalyzeCount, &totalSize); err != nil {
211+
if err := rows.Scan(&datname, &schemaname, &relname, &seqScan, &seqTupRead, &idxScan, &idxTupFetch, &nTupIns, &nTupUpd, &nTupDel, &nTupHotUpd, &nLiveTup, &nDeadTup, &nModSinceAnalyze, &lastVacuum, &lastAutovacuum, &lastAnalyze, &lastAutoanalyze, &vacuumCount, &autovacuumCount, &analyzeCount, &autoanalyzeCount, &totalSize, &tableOnlySize); err != nil {
205212
return err
206213
}
207214

@@ -437,6 +444,17 @@ func (c *PGStatUserTablesCollector) Update(ctx context.Context, instance *instan
437444
totalSizeMetric,
438445
datnameLabel, schemanameLabel, relnameLabel,
439446
)
447+
448+
tableOnlySizeMetric := 0.0
449+
if tableOnlySize.Valid {
450+
tableOnlySizeMetric = float64(tableOnlySize.Int64)
451+
}
452+
ch <- prometheus.MustNewConstMetric(
453+
statUserTablesOnlySize,
454+
prometheus.GaugeValue,
455+
tableOnlySizeMetric,
456+
datnameLabel, schemanameLabel, relnameLabel,
457+
)
440458
}
441459

442460
if err := rows.Err(); err != nil {

Diff for: collector/pg_stat_user_tables_test.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ func TestPGStatUserTablesCollector(t *testing.T) {
7272
"autovacuum_count",
7373
"analyze_count",
7474
"autoanalyze_count",
75-
"total_size"}
75+
"total_size",
76+
"table_only_size"}
7677
rows := sqlmock.NewRows(columns).
7778
AddRow("postgres",
7879
"public",
@@ -96,7 +97,8 @@ func TestPGStatUserTablesCollector(t *testing.T) {
9697
12,
9798
13,
9899
14,
99-
15)
100+
15,
101+
16)
100102
mock.ExpectQuery(sanitizeQuery(statUserTablesQuery)).WillReturnRows(rows)
101103
ch := make(chan prometheus.Metric)
102104
go func() {
@@ -128,6 +130,8 @@ func TestPGStatUserTablesCollector(t *testing.T) {
128130
{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 12},
129131
{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 13},
130132
{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 14},
133+
{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_GAUGE, value: 15},
134+
{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_GAUGE, value: 16},
131135
}
132136

133137
convey.Convey("Metrics comparison", t, func() {
@@ -173,7 +177,8 @@ func TestPGStatUserTablesCollectorNullValues(t *testing.T) {
173177
"autovacuum_count",
174178
"analyze_count",
175179
"autoanalyze_count",
176-
"total_size"}
180+
"total_size",
181+
"table_only_size"}
177182
rows := sqlmock.NewRows(columns).
178183
AddRow("postgres",
179184
nil,
@@ -197,6 +202,7 @@ func TestPGStatUserTablesCollectorNullValues(t *testing.T) {
197202
nil,
198203
nil,
199204
nil,
205+
nil,
200206
nil)
201207
mock.ExpectQuery(sanitizeQuery(statUserTablesQuery)).WillReturnRows(rows)
202208
ch := make(chan prometheus.Metric)
@@ -229,6 +235,8 @@ func TestPGStatUserTablesCollectorNullValues(t *testing.T) {
229235
{labels: labelMap{"datname": "postgres", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
230236
{labels: labelMap{"datname": "postgres", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
231237
{labels: labelMap{"datname": "postgres", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
238+
{labels: labelMap{"datname": "postgres", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_GAUGE, value: 0},
239+
{labels: labelMap{"datname": "postgres", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_GAUGE, value: 0},
232240
}
233241

234242
convey.Convey("Metrics comparison", t, func() {

0 commit comments

Comments
 (0)