github.com/netdata/go.d.plugin@v0.58.1/modules/postgres/do_query_tables.go (about) 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 (p *Postgres) doQueryTablesMetrics() error { 11 if err := p.doQueryStatUserTable(); err != nil { 12 return err 13 } 14 if err := p.doQueryStatIOUserTables(); err != nil { 15 return err 16 } 17 18 return nil 19 } 20 21 func (p *Postgres) doQueryStatUserTable() error { 22 if err := p.doDBQueryStatUserTables(p.db); err != nil { 23 p.Warning(err) 24 } 25 for _, conn := range p.dbConns { 26 if conn.db == nil { 27 continue 28 } 29 if err := p.doDBQueryStatUserTables(conn.db); err != nil { 30 p.Warning(err) 31 } 32 } 33 return nil 34 } 35 36 func (p *Postgres) doQueryStatIOUserTables() error { 37 if err := p.doDBQueryStatIOUserTables(p.db); err != nil { 38 p.Warning(err) 39 } 40 for _, conn := range p.dbConns { 41 if conn.db == nil { 42 continue 43 } 44 if err := p.doDBQueryStatIOUserTables(conn.db); err != nil { 45 p.Warning(err) 46 } 47 } 48 return nil 49 } 50 51 func (p *Postgres) doDBQueryStatUserTables(db *sql.DB) error { 52 q := queryStatUserTables() 53 54 var dbname, schema, name string 55 return p.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 p.getTableMetrics(name, dbname, schema).updated = true 67 case "parent_relname": 68 p.getTableMetrics(name, dbname, schema).parentName = value 69 case "seq_scan": 70 p.getTableMetrics(name, dbname, schema).seqScan = parseInt(value) 71 case "seq_tup_read": 72 p.getTableMetrics(name, dbname, schema).seqTupRead = parseInt(value) 73 case "idx_scan": 74 p.getTableMetrics(name, dbname, schema).idxScan = parseInt(value) 75 case "idx_tup_fetch": 76 p.getTableMetrics(name, dbname, schema).idxTupFetch = parseInt(value) 77 case "n_tup_ins": 78 p.getTableMetrics(name, dbname, schema).nTupIns = parseInt(value) 79 case "n_tup_upd": 80 p.getTableMetrics(name, dbname, schema).nTupUpd.last = parseInt(value) 81 case "n_tup_del": 82 p.getTableMetrics(name, dbname, schema).nTupDel = parseInt(value) 83 case "n_tup_hot_upd": 84 p.getTableMetrics(name, dbname, schema).nTupHotUpd.last = parseInt(value) 85 case "n_live_tup": 86 p.getTableMetrics(name, dbname, schema).nLiveTup = parseInt(value) 87 case "n_dead_tup": 88 p.getTableMetrics(name, dbname, schema).nDeadTup = parseInt(value) 89 case "last_vacuum": 90 p.getTableMetrics(name, dbname, schema).lastVacuumAgo = parseFloat(value) 91 case "last_autovacuum": 92 p.getTableMetrics(name, dbname, schema).lastAutoVacuumAgo = parseFloat(value) 93 case "last_analyze": 94 p.getTableMetrics(name, dbname, schema).lastAnalyzeAgo = parseFloat(value) 95 case "last_autoanalyze": 96 p.getTableMetrics(name, dbname, schema).lastAutoAnalyzeAgo = parseFloat(value) 97 case "vacuum_count": 98 p.getTableMetrics(name, dbname, schema).vacuumCount = parseInt(value) 99 case "autovacuum_count": 100 p.getTableMetrics(name, dbname, schema).autovacuumCount = parseInt(value) 101 case "analyze_count": 102 p.getTableMetrics(name, dbname, schema).analyzeCount = parseInt(value) 103 case "autoanalyze_count": 104 p.getTableMetrics(name, dbname, schema).autoAnalyzeCount = parseInt(value) 105 case "total_relation_size": 106 p.getTableMetrics(name, dbname, schema).totalSize = parseInt(value) 107 } 108 }) 109 } 110 111 func (p *Postgres) doDBQueryStatIOUserTables(db *sql.DB) error { 112 q := queryStatIOUserTables() 113 114 var dbname, schema, name string 115 return p.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 p.getTableMetrics(name, dbname, schema).updated = true 127 case "parent_relname": 128 p.getTableMetrics(name, dbname, schema).parentName = value 129 case "heap_blks_read_bytes": 130 p.getTableMetrics(name, dbname, schema).heapBlksRead.last = parseInt(value) 131 case "heap_blks_hit_bytes": 132 p.getTableMetrics(name, dbname, schema).heapBlksHit.last = parseInt(value) 133 case "idx_blks_read_bytes": 134 p.getTableMetrics(name, dbname, schema).idxBlksRead.last = parseInt(value) 135 case "idx_blks_hit_bytes": 136 p.getTableMetrics(name, dbname, schema).idxBlksHit.last = parseInt(value) 137 case "toast_blks_read_bytes": 138 p.getTableMetrics(name, dbname, schema).toastBlksRead.last = parseInt(value) 139 case "toast_blks_hit_bytes": 140 p.getTableMetrics(name, dbname, schema).toastBlksHit.last = parseInt(value) 141 case "tidx_blks_read_bytes": 142 p.getTableMetrics(name, dbname, schema).tidxBlksRead.last = parseInt(value) 143 case "tidx_blks_hit_bytes": 144 p.getTableMetrics(name, dbname, schema).tidxBlksHit.last = parseInt(value) 145 } 146 }) 147 }