github.com/netdata/go.d.plugin@v0.58.1/modules/postgres/do_query_bloat.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package postgres 4 5 import "database/sql" 6 7 func (p *Postgres) doQueryBloat() error { 8 if err := p.doDBQueryBloat(p.db); err != nil { 9 p.Warning(err) 10 } 11 for _, conn := range p.dbConns { 12 if conn.db == nil { 13 continue 14 } 15 if err := p.doDBQueryBloat(conn.db); err != nil { 16 p.Warning(err) 17 } 18 } 19 return nil 20 } 21 22 func (p *Postgres) doDBQueryBloat(db *sql.DB) error { 23 q := queryBloat() 24 25 var dbname, schema, table, iname string 26 var tableWasted, idxWasted int64 27 return p.doDBQuery(db, q, func(column, value string, rowEnd bool) { 28 switch column { 29 case "db": 30 dbname = value 31 case "schemaname": 32 schema = value 33 case "tablename": 34 table = value 35 case "wastedbytes": 36 tableWasted = parseFloat(value) 37 case "iname": 38 iname = value 39 case "wastedibytes": 40 idxWasted = parseFloat(value) 41 } 42 if !rowEnd { 43 return 44 } 45 if p.hasTableMetrics(table, dbname, schema) { 46 v := p.getTableMetrics(table, dbname, schema) 47 v.bloatSize = newInt(tableWasted) 48 v.bloatSizePerc = newInt(calcPercentage(tableWasted, v.totalSize)) 49 } 50 if iname != "?" && p.hasIndexMetrics(iname, table, dbname, schema) { 51 v := p.getIndexMetrics(iname, table, dbname, schema) 52 v.bloatSize = newInt(idxWasted) 53 v.bloatSizePerc = newInt(calcPercentage(idxWasted, v.size)) 54 } 55 }) 56 }