Skip to content
This repository was archived by the owner on Nov 28, 2022. It is now read-only.

Commit 08c3bf2

Browse files
authored
Merge pull request #32 from ContaAzul/heap-only-updates
Heap only updates
2 parents 644b338 + 2614491 commit 08c3bf2

File tree

4 files changed

+49
-2
lines changed

4 files changed

+49
-2
lines changed

gauges/read_throughput.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77
)
88

99
var databaseReadingUsageQuery = `
10-
SELECT tup_returned
11-
, tup_fetched
10+
SELECT coalesce(tup_returned, 0) as tup_returned
11+
, coalesce(tup_fetched, 0) as tup_returned
1212
FROM pg_stat_database
1313
WHERE datname = current_database()
1414
`

gauges/tables.go

+37
Original file line numberDiff line numberDiff line change
@@ -260,3 +260,40 @@ func (g *Gauges) TableScans() *prometheus.GaugeVec {
260260

261261
return gauge
262262
}
263+
264+
var hotUpdatesQuery = `
265+
SELECT relname
266+
, coalesce(n_tup_hot_upd, 0) as n_tup_hot_upd
267+
FROM pg_stat_user_tables
268+
`
269+
270+
type tableHotUpdates struct {
271+
Name string `db:"relname"`
272+
HotUpdates float64 `db:"n_tup_hot_upd"`
273+
}
274+
275+
func (g *Gauges) HOTUpdates() *prometheus.GaugeVec {
276+
var gauge = prometheus.NewGaugeVec(
277+
prometheus.GaugeOpts{
278+
Name: "postgresql_hot_updates",
279+
Help: "Number of rows Heap-Only tuple updated",
280+
ConstLabels: g.labels,
281+
},
282+
[]string{"table"},
283+
)
284+
go func() {
285+
for {
286+
var tables []tableHotUpdates
287+
if err := g.query(hotUpdatesQuery, &tables, emptyParams); err == nil {
288+
for _, table := range tables {
289+
gauge.With(prometheus.Labels{
290+
"table": table.Name,
291+
}).Set(table.HotUpdates)
292+
}
293+
}
294+
time.Sleep(g.interval)
295+
}
296+
}()
297+
298+
return gauge
299+
}

gauges/tables_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,12 @@ func TestTableScans(t *testing.T) {
3333
assert.True(len(metrics) > 0)
3434
assertNoErrs(t, gauges)
3535
}
36+
37+
func TestHOTUpdates(t *testing.T) {
38+
var assert = assert.New(t)
39+
_, gauges, close := prepare(t)
40+
defer close()
41+
var metrics = evaluate(t, gauges.HOTUpdates())
42+
assert.True(len(metrics) > 0)
43+
assertNoErrs(t, gauges)
44+
}

main.go

+1
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,6 @@ func watch(db *sql.DB, reg prometheus.Registerer, name string) {
105105
reg.MustRegister(gauges.Up())
106106
reg.MustRegister(gauges.TableScans())
107107
reg.MustRegister(gauges.DatabaseReadingUsage())
108+
reg.MustRegister(gauges.HOTUpdates())
108109

109110
}

0 commit comments

Comments
 (0)