|
| 1 | +package gauges |
| 2 | + |
| 3 | +import ( |
| 4 | + "time" |
| 5 | + |
| 6 | + "github.com/prometheus/client_golang/prometheus" |
| 7 | +) |
| 8 | + |
| 9 | +var databaseWritingUsageQuery = ` |
| 10 | + SELECT coalesce(tup_inserted, 0) as tup_inserted |
| 11 | + , coalesce(tup_updated, 0) as tup_updated |
| 12 | + , coalesce(tup_deleted, 0) as tup_deleted |
| 13 | + FROM pg_stat_database |
| 14 | + WHERE datname = current_database() |
| 15 | +` |
| 16 | + |
| 17 | +type writingUsage struct { |
| 18 | + TuplesInserted float64 `db:"tup_inserted"` |
| 19 | + TuplesUpdated float64 `db:"tup_updated"` |
| 20 | + TuplesDeleted float64 `db:"tup_deleted"` |
| 21 | +} |
| 22 | + |
| 23 | +func (g *Gauges) DatabaseWritingUsage() *prometheus.GaugeVec { |
| 24 | + var gauge = prometheus.NewGaugeVec( |
| 25 | + prometheus.GaugeOpts{ |
| 26 | + Name: "postgresql_database_writing_usage", |
| 27 | + Help: "Number of inserted, updated and deleted rows per database", |
| 28 | + ConstLabels: g.labels, |
| 29 | + }, |
| 30 | + []string{"stat"}, |
| 31 | + ) |
| 32 | + go func() { |
| 33 | + for { |
| 34 | + var writingUsage []writingUsage |
| 35 | + if err := g.query(databaseWritingUsageQuery, &writingUsage, emptyParams); err == nil { |
| 36 | + for _, database := range writingUsage { |
| 37 | + gauge.With(prometheus.Labels{ |
| 38 | + "stat": "tup_inserted", |
| 39 | + }).Set(database.TuplesInserted) |
| 40 | + gauge.With(prometheus.Labels{ |
| 41 | + "stat": "tup_updated", |
| 42 | + }).Set(database.TuplesUpdated) |
| 43 | + gauge.With(prometheus.Labels{ |
| 44 | + "stat": "tup_deleted", |
| 45 | + }).Set(database.TuplesDeleted) |
| 46 | + } |
| 47 | + } |
| 48 | + time.Sleep(g.interval) |
| 49 | + } |
| 50 | + }() |
| 51 | + return gauge |
| 52 | +} |
0 commit comments