master
go 147 lines 4.62 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package postgres
4
5 import (
6 "database/sql"
7 "strings"
8 )
9
10 func (c *Collector) doQueryTablesMetrics() error {
11 if err := c.doQueryStatUserTable(); err != nil {
12 return err
13 }
14 if err := c.doQueryStatIOUserTables(); err != nil {
15 return err
16 }
17
18 return nil
19 }
20
21 func (c *Collector) doQueryStatUserTable() error {
22 if err := c.doDBQueryStatUserTables(c.db); err != nil {
23 c.Warning(err)
24 }
25 for _, conn := range c.dbConns {
26 if conn.db == nil {
27 continue
28 }
29 if err := c.doDBQueryStatUserTables(conn.db); err != nil {
30 c.Warning(err)
31 }
32 }
33 return nil
34 }
35
36 func (c *Collector) doQueryStatIOUserTables() error {
37 if err := c.doDBQueryStatIOUserTables(c.db); err != nil {
38 c.Warning(err)
39 }
40 for _, conn := range c.dbConns {
41 if conn.db == nil {
42 continue
43 }
44 if err := c.doDBQueryStatIOUserTables(conn.db); err != nil {
45 c.Warning(err)
46 }
47 }
48 return nil
49 }
50
51 func (c *Collector) doDBQueryStatUserTables(db *sql.DB) error {
52 q := queryStatUserTables()
53
54 var dbname, schema, name string
55 return c.doDBQuery(db, q, func(column, value string, _ bool) {
56 if value == "" && strings.HasPrefix(column, "last_") {
57 value = "-1"
58 }
59 switch column {
60 case "datname":
61 dbname = value
62 case "schemaname":
63 schema = value
64 case "relname":
65 name = value
66 c.getTableMetrics(name, dbname, schema).updated = true
67 case "parent_relname":
68 c.getTableMetrics(name, dbname, schema).parentName = value
69 case "seq_scan":
70 c.getTableMetrics(name, dbname, schema).seqScan = parseInt(value)
71 case "seq_tup_read":
72 c.getTableMetrics(name, dbname, schema).seqTupRead = parseInt(value)
73 case "idx_scan":
74 c.getTableMetrics(name, dbname, schema).idxScan = parseInt(value)
75 case "idx_tup_fetch":
76 c.getTableMetrics(name, dbname, schema).idxTupFetch = parseInt(value)
77 case "n_tup_ins":
78 c.getTableMetrics(name, dbname, schema).nTupIns = parseInt(value)
79 case "n_tup_upd":
80 c.getTableMetrics(name, dbname, schema).nTupUpd.last = parseInt(value)
81 case "n_tup_del":
82 c.getTableMetrics(name, dbname, schema).nTupDel = parseInt(value)
83 case "n_tup_hot_upd":
84 c.getTableMetrics(name, dbname, schema).nTupHotUpd.last = parseInt(value)
85 case "n_live_tup":
86 c.getTableMetrics(name, dbname, schema).nLiveTup = parseInt(value)
87 case "n_dead_tup":
88 c.getTableMetrics(name, dbname, schema).nDeadTup = parseInt(value)
89 case "last_vacuum":
90 c.getTableMetrics(name, dbname, schema).lastVacuumAgo = parseFloat(value)
91 case "last_autovacuum":
92 c.getTableMetrics(name, dbname, schema).lastAutoVacuumAgo = parseFloat(value)
93 case "last_analyze":
94 c.getTableMetrics(name, dbname, schema).lastAnalyzeAgo = parseFloat(value)
95 case "last_autoanalyze":
96 c.getTableMetrics(name, dbname, schema).lastAutoAnalyzeAgo = parseFloat(value)
97 case "vacuum_count":
98 c.getTableMetrics(name, dbname, schema).vacuumCount = parseInt(value)
99 case "autovacuum_count":
100 c.getTableMetrics(name, dbname, schema).autovacuumCount = parseInt(value)
101 case "analyze_count":
102 c.getTableMetrics(name, dbname, schema).analyzeCount = parseInt(value)
103 case "autoanalyze_count":
104 c.getTableMetrics(name, dbname, schema).autoAnalyzeCount = parseInt(value)
105 case "total_relation_size":
106 c.getTableMetrics(name, dbname, schema).totalSize = parseInt(value)
107 }
108 })
109 }
110
111 func (c *Collector) doDBQueryStatIOUserTables(db *sql.DB) error {
112 q := queryStatIOUserTables()
113
114 var dbname, schema, name string
115 return c.doDBQuery(db, q, func(column, value string, rowEnd bool) {
116 if value == "" && column != "parent_relname" {
117 value = "-1"
118 }
119 switch column {
120 case "datname":
121 dbname = value
122 case "schemaname":
123 schema = value
124 case "relname":
125 name = value
126 c.getTableMetrics(name, dbname, schema).updated = true
127 case "parent_relname":
128 c.getTableMetrics(name, dbname, schema).parentName = value
129 case "heap_blks_read_bytes":
130 c.getTableMetrics(name, dbname, schema).heapBlksRead.last = parseInt(value)
131 case "heap_blks_hit_bytes":
132 c.getTableMetrics(name, dbname, schema).heapBlksHit.last = parseInt(value)
133 case "idx_blks_read_bytes":
134 c.getTableMetrics(name, dbname, schema).idxBlksRead.last = parseInt(value)
135 case "idx_blks_hit_bytes":
136 c.getTableMetrics(name, dbname, schema).idxBlksHit.last = parseInt(value)
137 case "toast_blks_read_bytes":
138 c.getTableMetrics(name, dbname, schema).toastBlksRead.last = parseInt(value)
139 case "toast_blks_hit_bytes":
140 c.getTableMetrics(name, dbname, schema).toastBlksHit.last = parseInt(value)
141 case "tidx_blks_read_bytes":
142 c.getTableMetrics(name, dbname, schema).tidxBlksRead.last = parseInt(value)
143 case "tidx_blks_hit_bytes":
144 c.getTableMetrics(name, dbname, schema).tidxBlksHit.last = parseInt(value)
145 }
146 })
147 }